【问题标题】:Handling PHP Sessions With Multiple Front End's使用多个前端处理 PHP 会话
【发布时间】: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。

我的问题很多,但目前我只有几个:

  1. 我可以为每个前端服务器设置不同的 SESSID 名称吗?这会阻止 FE 生成相同的会话 ID 吗?这至少会导致用户退出,而不是以其他用户身份再次登录!
  2. 我们使用 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


【解决方案1】:

从你的问题来看,你对这个问题有些困惑——而且不清楚你要解决什么问题。

今天,一位最终用户提醒我们他们已登录(网站上基于 PHP 的登录表单),但被验证为完全不同的用户

这里可能发生了几件事。

当用户关闭浏览器时 Cookies 过期:

并非如此。根据浏览器的配置方式,大多数浏览器会在重启后保留会话 cookie。由于这是由客户端控制的,因此您无能为力。

应在 1440 秒后“清理”前端的 PHP 会话

这里的神奇词是“之后”——垃圾收集是随机触发的。会话文件可以持续更长时间,默认处理程序会在 TTL 过期后愉快地检索和反序列化会话数据。

您控制应用程序代码吗? (如果没有,你的帖子在这里是题外话)。如果是这样,那么您的代码中可能存在会话固定和劫持漏洞(但这是基于用户提供的描述 - 这通常是不精确且具有误导性的)。

也有可能内容被不恰当地缓存在堆栈中的某处。

您没有说该站点是在 HTTP、HTTPS 还是混合上运行的,以及如果涉及 HTTPS,则 SSL 在哪里终止。这些是了解问题可能出现在哪里的关键。

您接下来的步骤是确保:

  1. 您的代码中有注销功能,它会破坏会话数据更改会话 ID

  2. 您在身份验证时更改了会话 ID

  3. 基于会话的脚本正在返回适当的缓存信息(包括 Varies: Cookie 标头) 两个系统几乎不可能同时生成相同的会话 ID。

您真的想摆脱使用粘性会话。不难。

您的前端有 2 层,没有增加任何功能或性能价值,而且由于您使用的是粘性会话,因此实际上没有容量或弹性价值!!!卖给你这个的人一直在笑到银行。

【讨论】:

  • 嗨 symcbean,感谢您的回复 :) 我们是服务提供商,我们指定并设计了整个堆栈。它也与我们在此之前提供的许多类似。 Web 服务器前面的 2 层确实确实增加了功能(并且通过代理性能看到 LB 在 3 个 Web 服务器之间共享负载)。基础设施具有很强的弹性,这是主要的,辅助 FW 和 LB 位于其他地方。然后,整个基础架构会在 HA 中额外同步到另一个国家/地区,并设置实时故障转移。
  • 话虽如此,我很感谢您在问题的会话方面提供的信息。不幸的是,代码是在客户端内部开发的,我们只是提供它所在的托管基础​​架构。我正在客户端环境中部署 memcached 服务器。我将在 3x 前端服务器上配置 PHP 以将会话存储在 memcached 对象缓存中。
猜你喜欢
  • 1970-01-01
  • 2015-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-20
  • 1970-01-01
  • 2016-12-17
  • 1970-01-01
相关资源
最近更新 更多