Php 使用负载平衡器时需要注意什么?

Php 使用负载平衡器时需要注意什么?,php,apache2,load-balancing,haproxy,Php,Apache2,Load Balancing,Haproxy,我有一个用PHP编写的web应用程序,它已经部署在Apache服务器上,并且工作得非常好 应用程序使用Mysql作为数据库,会话保存在memcached服务器中 我计划迁移到一个具有2台服务器的HAproxy环境 我所知道的:我将把应用程序部署到服务器并配置HAproxy 我的问题是:代码中是否有我必须关心/更改的东西?您将遇到的最大问题是与php会话相关。默认情况下,php会话使用单个服务器维护状态。当您将第二台服务器添加到混合中并启动到这两台服务器的负载平衡连接时,PHP会话将在第二台被命中

我有一个用PHP编写的web应用程序,它已经部署在Apache服务器上,并且工作得非常好

应用程序使用Mysql作为数据库,会话保存在memcached服务器中

我计划迁移到一个具有2台服务器的HAproxy环境

我所知道的:我将把应用程序部署到服务器并配置HAproxy


我的问题是:代码中是否有我必须关心/更改的东西?

您将遇到的最大问题是与php会话相关。默认情况下,php会话使用单个服务器维护状态。当您将第二台服务器添加到混合中并启动到这两台服务器的负载平衡连接时,PHP会话将在第二台被命中的服务器上无效

像haproxy这样的负载平衡器需要一个“无状态”的应用程序。要使PHP无状态,您很可能需要为会话使用不同的机制。如果您没有/无法使应用程序成为无状态,那么您可以配置HAProxy,使其通过cookie或粘贴表(源IP等)执行粘性会话

您将遇到的下一件事是,您将丢失原始请求者IP地址。这是因为haproxy(负载平衡器)终止TCP会话,然后创建一个到apache的新TCP会话。为了继续查看原始requstors IP地址是什么,您需要使用类似x-forwarded-for的东西。在haproxy配置中,选项为:

选择转发

你可能遇到的最后一件事是haproxy如何保持活力。Haproxy具有acl,即确定将流量路由到何处的规则。如果启用了keep alives,haproxy将仅根据第一个请求决定在何处发送流量

例如,假设您有两条路径,并且希望将流量发送到两个不同的服务器场(后端):

somedomain/foo->BACKEND\u serverfarm-foo

somedomain/bar->BACKEND\u serverfarm-bar

对somedomain/foo的第一个请求转到后端服务器farm-foo。对somedomain/bar的下一个请求也会转到后端服务器farm-foo。这是因为haproxy仅在使用keep alives时处理第一个请求的ACL。这对您来说可能不是问题,因为您只有2台apache服务器,但如果是,则需要haproxy终止保持活动会话。Haproxy对此有几个选项,但这两个选项在本场景中发挥了最大的作用:

期权强制关闭

选项http服务器关闭

高级别的区别在于forceclose同时关闭服务器端和客户端的保持活动会话。http server close仅关闭服务器端保持活动会话,该会话允许客户端与haproxy保持保持活动。

视情况而定

您是否试图解决性能或冗余问题

如果您的数据库(MySQL)和会话处理程序(memcached)运行在一台或多台与两台Apache服务器分开的服务器上,那么您的代码必须做的唯一不同的事情就是管理转发的IP地址(通过
X-forwarded-FOR
),HAProxy很乐意在Apache服务器之间循环处理您的请求

如果数据库和会话处理程序当前运行在同一台服务器上,则需要确定您试图解决的性能或冗余问题是数据库、会话管理还是Apache本身

对于数据库/会话密集型web应用程序的性能问题,最简单的解决方案是将MySQL和memcached放在第二台服务器上,以分离您的关注点。如果这解决了你和一个服务器的性能问题,那么你可以考虑解决的问题。 如果上述解决方案无法解决性能问题,并且您注意到Apache在为您的网站文件提供服务时遇到问题,那么您可以选择“混合”方法,其中Apache将存在于两台服务器上,但您还可以在其中一台服务器上运行MySQL/memcached。如果您决定使用这种方法,那么可以使用HAProxy并为混合服务器设置较低的权重

如果您试图解决冗余问题,那么最好将每个部分隔离到逻辑组中(例如数据库集群、memcached集群、Apache集群和冗余HAProxy对),并根据需要为每个逻辑组添加冗余