【发布时间】:2016-03-18 21:19:20
【问题描述】:
我们在 HA 中有 2x pfSense FW,在这之后,2x Zen 负载均衡器在主/从集群中,在这些之后,3x 前端 Web 堆栈服务器 运行 NGinx、PHP-FPM、PHP-APC。在同一网段,主/从复制中有2x MySQL DB Servers。
应该在 1440 秒后“清理”前端的 PHP 会话:
session.gc_maxlifetime = 1440
.
当用户关闭浏览器时 Cookies 过期:
session.cookie_lifetime = 0
今天,一位最终用户提醒我们他们已登录(网站上基于 PHP 的登录表单),但被验证为完全不同的用户。至少可以说这很不方便。
ZLB 设置为使用 Hash: Sticky Client。他们应该在会话期间将用户固定在一个前端 (FE) 上。我能想到这种情况发生的唯一原因是两个 FE 生成了相同的 PHP 会话 ID,然后不知何故,用户很不幸被 LB 引导到另一个 FE。
我的问题很多,但目前我只有几个:
- 我可以为每个前端服务器设置不同的 SESSID 名称吗?这会阻止 FE 生成相同的会话 ID 吗?这至少会导致用户退出,而不是以其他用户身份再次登录!
- 我们使用 lsyncd 和一大堆 inotifywatch 进程同步站点数据,但我们不同步包含会话的 /var/lib/php 目录。我故意没有这样做......我现在在想也许我应该同步它。 lsyncd 将能够在修改会话后大约 10 秒内跨所有 3 个前端复制会话文件。作为临时修复的好主意?
最后,我很清楚客户端应该使用数据库来存储会话。这将完全消除它能够复制会话 ID。但现在,他们不愿意在开发时间线中优先考虑这一点。
非常欢迎提出想法,因为我正在努力寻找一个简单的出路,即使是一种临时措施。我不能让另一个客户以不同的用户身份登录。这是一个巨大的禁忌。
谢谢!!
【问题讨论】:
-
我在以前工作过的公司中看到过这个问题,你需要告诉负载均衡器每次都将来自某个客户端的流量引导到同一个前端服务器。如果这没有帮助,您可以将会话锁定到某个 IP/用户代理/标识前端服务器的 cookie,如果不匹配则销毁会话。
-
@Cesar:戴夫说他已经在这样做了。但这是解决问题的错误方法。
-
@symcbean 我还指出他可以添加一个 cookie 来标识正在使用的前端服务器。它仍然会丢弃会话,但会阻止它把它交给错误的用户。
-
@DaveByrne 你有权访问 PHP 逻辑吗?
-
@Cesar:你在这里挖洞。除了客户端提供的 cookie 之外的所有信息都可能在会话期间有效地更改(IP 地址、SSL 会话,甚至用户代理)。实现可靠的粘性会话(即客户端和服务器之间的 1:1 关联)的唯一方法是通过 cookie。但粘性会话永远不是解决问题的正确方法。
标签: php session nginx cluster-computing