You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:46:12