我有一个用 PHP 编写的 Web 应用程序,已经部署在 Apache 服务器上并且运行良好。
该应用程序使用 Mysql 作为数据库,会话保存在 memcached 服务器中。
我计划迁移到具有 2 台服务器的 HAproxy 环境。
我所知道的:我会将应用程序部署到服务器并配置 HAproxy。
我的问题是:我需要关心/更改代码吗?
我有一个用 PHP 编写的 Web 应用程序,已经部署在 Apache 服务器上并且运行良好。
该应用程序使用 Mysql 作为数据库,会话保存在 memcached 服务器中。
我计划迁移到具有 2 台服务器的 HAproxy 环境。
我所知道的:我会将应用程序部署到服务器并配置 HAproxy。
我的问题是:我需要关心/更改代码吗?
您将遇到的最大问题将与 php 会话有关。默认情况下,php 会话使用单个服务器维护状态。当您将第二台服务器添加到混合中并开始对它们进行负载平衡连接时,PHP 会话将在第二台服务器上无效。
像 haproxy 这样的负载均衡器需要一个“无状态”的应用程序。要使 PHP 无状态,您很可能需要为会话使用不同的机制。如果您不/不能使您的应用程序无状态,那么您可以配置 HAProxy 以使用 cookie 或粘贴表(源 IP 等)进行粘性会话。
您将遇到的下一件事是您将丢失原始请求者的 IP 地址。这是因为 haproxy(负载均衡器)终止了 TCP 会话,然后创建了一个到 apache 的新 TCP 会话。为了继续查看原始请求者 IP 地址是什么,您需要查看使用类似 x-forwarded-for 的东西。在 haproxy 配置中,选项是:
期权转发
您可能会遇到的最后一件事是 haproxy 如何处理保活。Haproxy 具有 acl 的规则,用于确定将流量路由到何处。如果启用了保持活动,haproxy 将仅根据第一个请求决定将流量发送到何处。
例如,假设您有两条路径,并且您希望将流量发送到两个不同的服务器场(后端):
somedomain/foo -> BACKEND_serverfarm-foo
somedomain/bar -> BACKEND_serverfarm-bar
对 somedomain/foo 的第一个请求转到 BACKEND_serverfarm-foo。对 somedomain/bar 的下一个请求也发送到 BACKEND_serverfarm-foo。这是因为 haproxy 仅在使用 keep alives 时处理第一个请求的 ACL。这对您来说可能不是问题,因为您只有 2 个 apache 服务器,但如果是这样,您将需要让 haproxy 终止保持活动会话。Haproxy 对此有多种选择,但在这种情况下,这两种选择最多:
选项 forceclose
选项 http-server-close
高级别的区别是 forceclose 关闭服务器端和客户端保持活动会话。http-server-close 只关闭服务器端保持活动会话,允许客户端使用 haproxy 保持活动。
这取决于。
您是否正在尝试解决性能或冗余问题?
如果您的数据库 ( MySQL ) 和会话处理程序 ( memcached ) 运行在与两台Apache服务器分开的一台或多台服务器上,那么您的代码唯一需要做的主要事情就是管理转发的 IP 地址 (via X-FORWARDED-FOR
) 和 HAProxy很乐意在 Apache 服务器之间循环您的请求。
如果您的数据库和会话处理程序当前运行在同一台服务器上,那么您需要确定您要解决的性能或冗余问题是与数据库、会话管理还是 Apache 本身有关。
对于数据库/会话繁重的 Web 应用程序的性能问题,最简单的解决方案是首先将 MySQL 和 memcached 放在第二台服务器上以分离您的关注点。如果这解决了您在一台服务器上遇到的性能问题,那么您可以考虑解决问题。
如果上述解决方案不能解决性能问题,并且您注意到 Apache 在为您的网站文件提供服务时遇到问题,那么您可以选择“混合”方法,其中 Apache 将同时存在于两台服务器上,但您也可以运行MySQL/memcached 在其中一台服务器上。如果您决定使用这种方法,那么您可以使用 HAProxy 并为混合服务器设置较低的权重。
如果您正在尝试解决冗余问题,那么您最好的选择是将每个部分隔离到逻辑组(例如数据库集群、memcached 集群、Apache 集群和冗余 HAProxy 对),并为每个逻辑组添加冗余觉得合适。