多个PHPSESSID冲突问题

4
我注意到每天有多个用户被分配相同的session_id。我现在使用的是php 7.2,但回顾用户会话历史记录,自从我使用php 5.4以来就一直发生这种情况。
我只是使用php默认的session_start(),没有自定义会话处理程序。
我已经阅读过session_id是客户端IP和时间的组合,但考虑到我正在使用负载均衡器,这可能会限制ip_addresses的随机性?
在使用负载均衡器时,增加session_id的唯一性以防止冲突的正确方法是什么?

1
你在哪里读到会话ID基于IP地址和时间?那将是一个可怕的做法。IP地址可能会在页面加载之间更改。它们只是随机生成的字符串,与任何识别数据无关。 - Jonathan
2
实际上,要在负载均衡器后面使用多个服务器,您确实需要某种会话处理程序将它们存储在数据库、键/值存储中,或者我想您可以更改php.ini配置以存储到中央文件系统。我想还有粘性会话。如果您只是使用session_start而没有处理程序,则必须对影响会话的php.ini文件进行一些更改。您能否运行phpinfo()页面并发布相关的会话配置信息或让我们知道您正在使用什么? - Jonathan
我猜你可以更改php.ini配置以将其存储到中央文件系统中。但是,使用Heroku时,它们有一个短暂的文件系统,因此这是不可能的。我认为...你的主机是谁? - Devon Kiss
AWS,我想切换到数据库或ElastiCache解决方案。 - Nick
2个回答

1
如果您正在使用Nginx,则可能希望检查是否启用了FastCGI微缓存并将其禁用。这在PHP 7.1运行Nginx时曾导致一些错误,这些错误已在PHP.net开发人员错误列表中记录。
Bug#75496 几次发生会话ID冲突
在第一次[冲突]之后,我们更改了php.ini中的哈希熵php设置,因此session_id现在为48个字符,但它并没有防止第二次发生。
解决方案:
nginx上的FastCGI微缓存会将200个响应与会话cookie一起缓存。当然,也许我们的服务器设置错误,但它绝对与PHP无关。
请参见: https://bugs.php.net/bug.php?id=75496

1
谢谢您提供的信息,但我正在使用Apache。 - Nick

1
假设您在每个Web节点上运行PHP-FPM,但我猜#2和#3也可以作为Apache插件运行PHP。您有几个选择:
  1. 保持使用Apache的LB'd Web节点,并使每个节点指向同一个上游PHP-FPM服务器。显然,运行单个PHP-FPM进程的第三个框可能需要更强大,因为它处理两个Web节点的PHP解析。
  2. 更改会话存储以指向文件位置(可能是NFS或SMB共享),两个服务器都可以访问。老实说,我不确定自己是否曾经这样做过,但似乎应该可以。实际上,您的Web文件应该已经在NFS / SMB共享上,这样您就可以将更改部署到一个位置。
  3. 启动Redis服务器,并使两个Web节点的PHP-FPM进程将其用于会话。
在大多数情况下,第三个选项可能是最佳选择。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接