2012-07-09 49 views
1

我对负载平衡相当陌生,而且在使亚马逊的Elastic Load Balancer与子域进行良好配合方面遇到了一些问题。AWS Elastic Load Balancing存在问题粘性会话 - 从不同服务器提供子域名?

我的负载均衡器后面有两台EC2服务器。当我去mydomain.comwww.mydomain.com,这两个网址由不同的EC2服务器提供服务。我需要www.mydomain.commydomain.com将从同一台服务器提供,以便会话正常工作。

我有负载平衡器 “与粘性” 设置为LBCookieStickinessPolicy像这样:

enter image description here

和我的两个EC2实例都是 “在服务” 的背后我的负载平衡器:

enter image description here

我不知道它是否对故障排除有用,但我的apache配置如下所示:

enter image description here

当我认为在Firebug的会议上,我看到了下面......

对于mydomain.com:

enter image description here

对于www.mydomain.com(注意附加“ WWW。“)

enter image description here

我不知道为什么,但实际上,在查看www.mydomain.com的cookies时,实际上是设置了两个AWSELB cookie。

我使用Zend框架,和我设置我的cookie_domain像这样:

Zend_Session::start(array('cookie_domain' => '.mydomain.com')); 

这在工地移动到两个负载平衡EC2服务器之前,在过去工作的罚款。我们的网站使用一些子域名,例如api.mydomain.com和my.mydomain.com,这使cookie_domain变得重要。而且,当然,这可能是好的。很有可能一旦我们让负载平衡器会话“粘性”在子域之间正常工作,会话变量将按预期工作(希望!)。

任何想法为什么我们的网站是由不同的服务器提供服务时,“www”。被添加到域名?

谢谢!

+1

我想评论一下,我使用“Application-Controlled Session Stickiness”(http://docs.amazonwebservices.com/ElasticLoadBalancing/latest/DeveloperGuide/US_EnableStickySessionsAppCookies.html)解决了我的问题。我仍然喜欢听到我原来的问题的任何答案。 – clone45 2012-08-07 23:16:33

回答

0

您可以管理会话的一种方式是使用共享会话存储。而不是使用文件系统来存储会话数据(例如PHP的默认设置),设置类似ElastiCache(memcached)或数据库来处理会话数据的存储。那么你的应用程序就不会关心它在哪个服务器上,它有一个会话数据的中央存储从中拉出。

的文章中,我找到了解决这个概念的基础有趣的是在这里:http://shlomoswidler.com/2010/04/elastic-load-balancing-with-sticky-sessions.html

3

Cookie是由域设置,包括子域的一部分。当您访问http://example.com时,www.example.com cookie无法阅读,因此ELB会设置新的cookie。

要解决此问题,可以将Apache设置为301,将所有传入请求重定向到一个规范域。也就是说,要么所有http://example.com/ *都被重定向到http://www.example.com/ *,反之亦然。然后,您只需处理规范域中的Cookie,并且会话粘性将按预期工作。

相关问题