在AWS EB部署Laravel应用:会话不一致问题排查
排查Laravel + Elastic Beanstalk Classic LB 会话丢失问题
我之前踩过几乎一模一样的会话丢失坑,结合我的排查经验,你可能漏掉了这几个关键配置点,按优先级逐个检查:
1. 会话Cookie的核心属性配置
因为你强制使用HTTPS,Laravel的会话Cookie必须正确配置才能被浏览器持久保存,否则每次请求都会重新生成会话:
- 打开
config/session.php,确保以下配置正确:'cookie' => 'laravel_session', // 和你LB策略里的CookieName完全一致,大小写也要严格匹配 'secure' => env('SESSION_SECURE_COOKIE', true), // 生产环境必须设为true,否则HTTPS下浏览器可能拒绝保存Cookie 'same_site' => 'lax', // 根据业务场景选lax或none,避免跨域Cookie被浏览器拦截 'domain' => env('SESSION_DOMAIN', '.yourdomain.com'), // 注意前面的点,适配主域名和所有子域名 - 同步更新
.env文件,设置SESSION_SECURE_COOKIE=true和SESSION_DOMAIN=.yourdomain.com(替换成你的实际域名)。
2. Classic LB会话粘性策略的绑定确认
你在.ebextensions里配置了会话粘性策略,但光配置策略还不够,必须确保策略绑定到了80和443的监听器上:
- 登录AWS控制台,找到你的Classic Load Balancer,进入「监听器」标签页
- 分别点击80和443监听器的「查看/编辑规则」,检查「关联的策略」里是否包含你配置的会话粘性策略
- 如果没绑定,手动添加该策略到两个监听器上(控制台操作比修改配置文件更直接)
另外要确认:你用的是应用Cookie粘性(指定了laravel_session),所以必须保证Laravel生成的Cookie名称和LB配置完全一致,这点和第一点的'cookie'配置对应。
3. 多实例的APP_KEY一致性
如果Elastic Beanstalk的多个EC2实例使用了不同的APP_KEY,Laravel会无法解密之前的会话Cookie,导致每次请求生成新会话:
- 确保所有实例的
.env里APP_KEY是同一个值 - 最稳妥的方式是在Elastic Beanstalk环境配置的「软件」→「环境属性」里添加
APP_KEY变量,值为你的Laravel密钥,这样所有实例都会共用这个密钥
4. TrustProxiesMiddleware的完整配置
Laravel 5.5的TrustProxies中间件除了$proxies = '**',还需要正确处理LB传递的头信息:
- 打开
app/Http/Middleware/TrustProxies.php,补充$headers配置:use Illuminate\Http\Request; class TrustProxies extends Middleware { protected $proxies = '**'; protected $headers = Request::HEADER_X_FORWARDED_ALL; // 关键:接收LB传递的所有X-Forwarded头 } - 确认这个中间件已经注册到全局中间件里:检查
app/Http/Kernel.php的$middleware数组是否包含\App\Http\Middleware\TrustProxies::class
5. Nginx/Apache的代理配置检查
如果Elastic Beanstalk用的是Nginx默认环境,要确保Nginx没有意外修改或丢弃Cookie:
- 登录EC2实例,查看
/etc/nginx/conf.d/elasticbeanstalk/下的配置文件,确认没有proxy_set_header Cookie "";这类清空Cookie的错误配置 - 确保
proxy_set_header X-Forwarded-For $remote_addr;和proxy_set_header X-Forwarded-Proto $scheme;这类头正确传递,TrustProxies需要这些头来识别真实请求协议和IP
6. 会话存储的最终验证
虽然你说数据库连接正常,但可以快速验证会话是否被正确写入:
- 访问你的应用,执行几次请求
- 登录RDS数据库,查询
sessions表,看是否有一条持续更新的记录(而不是每次请求新增一条) - 如果每次请求都新增记录,说明会话Cookie没被正确携带,回到前几点排查;如果没有记录,可能是会话驱动配置错误,确认
config/session.php里'driver' => 'database'且会话表已生成(通过php artisan session:table迁移)
内容的提问来源于stack exchange,提问作者Jakob Graf
相关产品推荐
相关产品推荐

