Yii 会话的负载均衡

Posted

技术标签:

【中文标题】Yii 会话的负载均衡【英文标题】:Load balancing with Yii sessions 【发布时间】:2014-01-24 14:28:24 【问题描述】:

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

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

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

在服务器端,我使用带有 php-FPM 的 nginx 和 Amazon 的 ELB 作为负载均衡器。解决方法(作为最后的手段)是在负载均衡器上使用粘性会话,但如果节点离线并强制用户使用备用节点,这不会发挥最佳效果。

如果我需要更好地澄清任何事情,请告诉我。

【问题讨论】:

前段时间遇到了同样的问题 - 结束粘性会话是唯一的出路。 @themosquitokiller 实际上,有可能,我们让它在我正在开发的应用程序上运行 【参考方案1】:

以为我以前回答过这个问题,但花了一点时间才找到我的答案: Yii session do not work in multi server

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

【讨论】:

不幸的是,Suhosin 不是我的问题。我确实看过你的文章。原来是每台服务器上的路径不匹配。只要 SO 允许,我就会发布一个完整的答案。感谢您的回复!【参考方案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

【讨论】:

你能分享你的代码,你在其中进行了更改以删除 realpath() 吗? @DharmeshGoswami 抱歉,我不再拥有该代码。我怀疑这在 Yii 2.0 中也发生了显着变化。如果您按照我发布的 URL 和制作的 cmets,它可能表明需要更改的内容。根据记忆,这是一个 1-2 行更改。

以上是关于Yii 会话的负载均衡的主要内容,如果未能解决你的问题,请参考以下文章

Yii2 负载均衡找不到JS,CSS

Nginx负载均衡会话共享

负载均衡的会话保持和长短连接简介

WebSocket+SLB(负载均衡)会话保持解决重连问题

LVS负载均衡之持久性连接介绍(会话篇)

负载均衡设备会话保持机制介绍