同一台服务器上的多个负载平衡 Laravel 应用程序导致会话超时问题
Multiple Load-balanced Laravel Applications on same server causing session timeout issues
我最近接管了一个旧的服务器端呈现的 Laravel 5.6 应用程序,并将其升级到 Nginx 服务器上的版本 8 运行 PHP 7.4。
设置包括:
- 2 台服务器位于负载均衡器后面
- 数据库位于两台服务器都访问的第三台服务器上
- 两台服务器都为每个客户端安装了多个代码库
- 所有实例都将数据库用于它们的会话,并使用在 .env 文件中声明的唯一“SESSION_COOKIE_NAME”。
- 应用程序的每个实例都位于
/var/www/
内的一个子文件夹中,例如 /var/www/example.med***.com
.env
SESSION_DRIVER=database
SESSION_TIMEOUT=true
SESSION_TIMEOUT=86400
SESSION_LIFETIME=120
SESSION_COOKIE_NAME="LOCAL_SESSION" // different for every instance of the app
SESSION_DOMAIN=".med***.com"
由于应用程序比较老,用于显示记录的仪表板每 30 秒刷新一次超时,因此向服务器发出请求,超时为 24 小时。
用户报告该应用程序会随机将他们从系统中注销,即使每个登录用户都发出足够的请求以确保未达到超时限制。
这可能是负载均衡器问题还是我缺少设置?
问题最终变得相当简单。
Laravel 使用应用密钥加密会话 cookie。每个应用程序在其各自服务器上的实例使用不同的应用程序密钥,因此如果服务器 1 加密了 cookie 并且下一个请求转到服务器 2,则 cookie 无效。
这似乎解决了问题。
我最近接管了一个旧的服务器端呈现的 Laravel 5.6 应用程序,并将其升级到 Nginx 服务器上的版本 8 运行 PHP 7.4。
设置包括:
- 2 台服务器位于负载均衡器后面
- 数据库位于两台服务器都访问的第三台服务器上
- 两台服务器都为每个客户端安装了多个代码库
- 所有实例都将数据库用于它们的会话,并使用在 .env 文件中声明的唯一“SESSION_COOKIE_NAME”。
- 应用程序的每个实例都位于
/var/www/
内的一个子文件夹中,例如 /var/www/example.med***.com
.env
SESSION_DRIVER=database
SESSION_TIMEOUT=true
SESSION_TIMEOUT=86400
SESSION_LIFETIME=120
SESSION_COOKIE_NAME="LOCAL_SESSION" // different for every instance of the app
SESSION_DOMAIN=".med***.com"
由于应用程序比较老,用于显示记录的仪表板每 30 秒刷新一次超时,因此向服务器发出请求,超时为 24 小时。
用户报告该应用程序会随机将他们从系统中注销,即使每个登录用户都发出足够的请求以确保未达到超时限制。
这可能是负载均衡器问题还是我缺少设置?
问题最终变得相当简单。
Laravel 使用应用密钥加密会话 cookie。每个应用程序在其各自服务器上的实例使用不同的应用程序密钥,因此如果服务器 1 加密了 cookie 并且下一个请求转到服务器 2,则 cookie 无效。
这似乎解决了问题。