我正在尝试使用Yii 1.1.14应用程序配置负载均衡环境,但我似乎遇到了问题,即当负载均衡器使用另一个节点时,Yii不会让用户登录。大多数情况下,登录时,它会要求用户登录两次,因为它只登录一个节点,然后将页面加载到另一个节点上。否则,它将要求用户在浏览中途再次登录。
应用程序正在使用数据库会话,我可以看到数据库中正在更新过期时间。即使在它们已经登录后要求他们再次直接登录的情况下,会话到期时间也会在数据库中更新。 Yii是否做任何与会话相关的服务器?
我已经搜索了好几个小时但却找不到这个主题,并且想知道是否有其他人遇到过这样的问题。
在服务器端,我使用Nginx与PHP-FPM和亚马逊的ELB作为负载均衡器。解决方案(作为最后的手段)是在负载均衡器上使用粘性会话,但如果某个节点要脱机并强制用户使用备用节点,则这种方法效果不佳。
如果我需要澄清更好的内容,请告诉我。
答案 0 :(得分:2)
问题在于,用于生成应用程序ID的基本路径(在会话中以身份验证信息为前缀)在每台服务器上都不匹配。 Amazon OpsWorks使用相同的符号链接路径将代码部署到服务器,但PHP返回的实际路径因版本控制和符号链接而不同。
例如,两台服务器上的符号链接路径均为“/ app / current”。但是,一台服务器上的实际路径是'/ app / releases / 2014010700',另一台服务器是'/ app / releases / 2014010701',它生成了不同的哈希,因此无法使用该会话。
更改基本路径以在配置文件中使用符号链接路径修复了问题,而在使用dirname()之前返回了符号链接内容的实际路径。我还必须删除Yii框架中setBasePath中的realpath()函数。
我对Yii框架所做的修改对我的问题非常具体,但是对于遇到类似多个节点问题的其他人,我会仔细检查以确保每个节点在完全相同的路径中包含应用程序。
答案 1 :(得分:1)
以为我之前已经回答了这个问题,但我找了一些答案: Yii session do not work in multi server
简短版本:如果你启用了Suhosin,那就太痛苦了。关掉它,事情会好得多。但是,是的,答案是你可以使用Yii会话进行ELB负载平衡而无需粘性会话。