我们使用Drupal创建了一个网站,但问题(好问题)是我们在服务器上获得WAAAAYY太多点击,以至于流量使服务器瘫痪.
现在我们想要在负载均衡器后面的3台服务器上运行应用程序,一台只服务于mysql,另外两台服务于Web应用程序,我之前使用Symofony为不同的项目完成了这项工作,而且相对容易.
但是我似乎无法与Drupal相提并论,此时的主要问题是能够将所有会话变量保存到mysql中,因此负载均衡器将请求发送到哪个服务器,应用程序有一个关于会议的单一参考点.
任何帮助将不胜感激,我正在寻找一个很好的教程或文档,因为我从一个不再在这里工作的人继承了这个项目:/
谢谢
注意:在我的回答中我假设您正在使用Apache.即使你正在使用像nginx等其他服务器,我的答案也是正确的.
你写:
但是我似乎无法与Drupal相提并论,此时的主要问题是能够将所有会话变量保存到mysql中,因此负载均衡器将请求发送到哪个服务器,应用程序有一个关于会话的会议参考的单一参考点.
会话是在核心PHP级别和 Drupal + MySQL级别处理的.实际上,当浏览器访问您的服务器时,PHP核心会话处理逻辑会分配一个唯一的PHPSESSID cookie.该cookie在每个后续请求中由该浏览器发回.
[另一方面,使用PHPSESSID,PHP核心会话逻辑可能会关联一些其他数据,如注释首选项,需要在下一页视图上显示的drupal消息等.所有这些都是使用$ _SESSION PHP变量完成的.PHP非常无缝地完成这项工作.请注意,在此之前MySQL 仍未输入图片.当Drupal需要将额外数据与PHPSESSID(例如用户ID等)相关联时,MySQL才会输入图片.
简而言之,PHP通过分配PHPSESSID cookie来完成一些会话处理.现在假设负载均衡器将请求发送到Apache Webserver 1并且mod_php(PHP apache模块)分配一个唯一的PHPSESSID,例如"563"(它在现实生活中是一个更长的字符串).现在,下次此客户端访问您的网站时,Cookie PHPSESSID将以值563发送.现在可能会出现两种不同的情况:
负载均衡器(同时)将请求发送到最初分配了PHPSESSID cookie的Apache 1.它识别567并且事情正常
负载均衡器将请求发送到Apache 2. PHPSESSID是567,Apache 2 mod_php从未分配过.因此它会混淆并指定一个新的PHPSESSID.这就是你的问题发生的地方.
如何解决您的问题:您面临的问题是一个常见问题.您只需要告诉负载均衡器,一旦客户端被发送到特定的Web服务器,相同的 Web 服务器就应该继续处理该请求.这通常是通过告诉负载均衡器本身发送一个cookie来说明哪个服务器处理初始请求来完成的.将来,客户端会将此cookie提供给负载均衡器,负载均衡器会将请求定向到处理请求的原始服务器.这正如我上面解释的那样重要,因为只有该服务器知道它分配的PHPSESSID.
所有体面的负载平衡器都能够分配cookie.查找有关会话的负载均衡器.参考的配置详细信息.
更多精神错乱的东西在通过配置负载均衡器来分配cookie来解决会话问题之后,您需要考虑一个更重要的问题.files
你的服务器的文件夹必须分享如何.这是有道理的.如果用户在一台服务器上上传图像,则通过另一台服务器访问该站点的其他人应该可以访问同一图像.这是通过NFS (Networked File System)
安装或SAN实现的.
只有这样,您才能拥有Drupal的全功能多服务器安装.正如其他人所指出的那样,您可能希望在网上引用一些参考文章.建议进一步优化,例如将会话表存储在memcache而不是MySQL中,但这又与我上面写的内容无关.实际上需要负载均衡器发行cookie.
我为什么要经历这么多的悲痛?我过去做过多服务器的东西,除非你的网站有一些严重的流量,否则它不值得.你的交通量足够大吗?在Drupal面前建立一个像Varnish这样的缓存层,甚至更好,使用该boost
模块可以解决您的问题,如果您的大多数用户都是匿名的.
观看此视频http://sf2010.drupal.org/conference/sessions/24-million-page-views-day-60-m-month-one-server.这家伙只使用一台服务器提供了大量的页面浏览量.使用一台服务器,一切都变得如此简单.试试看!只有最大的网站可能需要多台服务器.