Yii会话的负载平衡



我正试图使用Yii 1.1.14应用程序配置一个负载平衡环境,但我似乎遇到了一个问题,即当负载平衡器使用另一个节点时,Yii无法保持用户登录。大多数时候,在登录时,它会要求用户登录两次,因为它只在一个节点上登录,然后在另一个节点加载页面。否则,它将要求用户在浏览中途再次登录。

应用程序正在使用DB会话,我可以看到数据库中的过期时间正在更新。即使在他们已经登录后,它要求他们再次登录的情况下,会话过期时间也会在数据库中更新。Yii是否对会话执行任何依赖于服务器的操作?

我已经找了几个小时了,但找不到太多关于这个话题的内容,不知道是否有其他人遇到过这样的问题。

在服务器端,我使用Nginx和PHP-FPM以及Amazon的ELB作为负载均衡器。解决方法(作为最后手段)是在负载均衡器上使用粘性会话,但如果节点离线并强制用户使用替代节点,则这并不是最好的方法。

如果我需要澄清一些更好的事情,请告诉我。

问题是,用于生成应用程序ID的基本路径(前缀为会话中的身份验证信息)在每个服务器上都不匹配。AmazonOpsWorks使用相同的符号链接路径将代码部署到服务器,但由于版本控制和符号链接,PHP返回的真实路径不同。

例如,两台服务器上的符号链接路径都是"/app/current"。然而,一台服务器上的实际路径是"/app/releases/2014010700",另一台是"/ap/releases/2014010701",它正在生成不同的哈希,因此无法处理会话。

在我的配置文件中,将基本路径更改为使用符号链接路径解决了这个问题,而之前它使用的是dirname(),它返回符号链接内容的真实路径。我还必须删除Yii框架中setBasePath中的realpath()函数。

我对Yii框架所做的修改非常针对我的问题,但对于其他遇到多个节点类似问题的人,我会仔细检查,以确保每个节点都包含完全相同路径的应用程序。

感谢您的以下文章:http://www.yiiframework.com/forum/index.php/topic/19574-multi-server-authentication-failure-with-db-sessions

我以前以为我已经回答过这个问题,但花了一点时间才找到答案:Yii会话在多服务器中不工作

简短的版本:如果你启用了Suhosin,那会很痛苦。关掉它,事情就会好得多。但是,答案是您可以使用Yii会话进行ELB负载平衡,而不需要粘性会话。

最新更新