使用Yii会话进行负载平衡

时间:2014-01-07 01:51:16

标签: php database session yii load-balancing

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

应用程序正在使用数据库会话,我可以看到数据库中正在更新过期时间。即使在它们已经登录后要求他们再次直接登录的情况下,会话到期时间也会在数据库中更新。 Yii是否做任何与会话相关的服务器?

我已经搜索了好几个小时但却找不到这个主题,并且想知道是否有其他人遇到过这样的问题。

在服务器端,我使用Nginx与PHP-FPM和亚马逊的ELB作为负载均衡器。解决方案(作为最后的手段)是在负载均衡器上使用粘性会话,但如果某个节点要脱机并强制用户使用备用节点,则这种方法效果不佳。

如果我需要澄清更好的内容,请告诉我。

2 个答案:

答案 0 :(得分:2)

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

例如,两台服务器上的符号链接路径均为“/ app / current”。但是,一台服务器上的实际路径是'/ app / releases / 2014010700',另一台服务器是'/ app / releases / 2014010701',它生成了不同的哈希,因此无法使用该会话。

更改基本路径以在配置文件中使用符号链接路径修复了问题,而在使用dirname()之前返回了符号链接内容的实际路径。我还必须删除Yii框架中setBasePath中的realpath()函数。

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

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

答案 1 :(得分:1)

以为我之前已经回答了这个问题,但我找了一些答案: Yii session do not work in multi server

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