如何在Ubuntu14.04上使用HAProxy作为WordPress应用服务器的第4层负载均衡器
介绍
在本教程中,我们将教您如何使用 HAProxy 作为您的 WordPress 服务器的第 4 层负载均衡器——特别是 Web 应用程序层。 对应用程序服务器进行负载平衡可为您的设置添加冗余,从而在服务器故障或网络问题的情况下提高可靠性,并将负载分散到多个服务器以提高读取性能。 我们假设您的设置包括一个连接到单独 MySQL 数据库服务器的 WordPress 应用程序服务器(有关如何设置它的教程,请参阅先决条件)。
如果您只运行单个 Web 服务器应用程序,则第 4 层负载平衡适用于您的站点。 如果您的环境更复杂(例如 您想在单独的服务器上运行 WordPress 和静态 Web 服务器,并使用单个入口点),您需要研究应用层(第 7 层)负载平衡。
本教程以 WordPress 为示例编写,但其一般概念可用于负载均衡其他无状态 Web 应用程序。
先决条件
在继续本教程之前,您应该已经完成了使用单独的数据库服务器(或具有类似设置)设置 WordPress 站点的教程:如何设置远程数据库以使用 MySQL 优化站点性能
按照该教程在单独的 Web 应用程序和数据库服务器上设置 WordPress 后,您应该有两个 VPS。 因为我们将处理几个 VPS,出于参考目的,我们将您现有的两个 VPS 称为以下:
- wordpress-1:你的 WordPress Web 应用服务器
- mysql-1:你的 WordPress MySQL 服务器
您的环境的抽象视图当前看起来像这样:
除了您当前的环境,在本教程中我们还需要两个额外的 VPS。 我们称它们为:
- wordpress-2:您的第二个 WordPress Web 应用服务器
- haproxy-www:你的HAProxy服务器,用于负载均衡
如果您不熟悉基本的负载平衡概念或术语,例如 layer 4 负载平衡 或 backends 或 ACLs,这里有一篇解释基础知识的文章: HAProxy 和负载平衡概念简介。
我们的目标
在本教程结束时,我们希望有一个如下所示的环境:
也就是说,您的用户将通过访问您的 HAProxy 服务器来访问您的 WordPress 站点,该服务器将以循环方式将他们转发到您的负载平衡的 WordPress 应用程序服务器。 您的两个(或更多,如果您愿意)都将访问您的 MySQL 数据库。
快照您当前的环境
可选:在继续本教程之前,您需要创建当前环境的快照。 在本教程中,快照有两个目的:
- 如果犯了错误,要恢复到工作环境
- 对原服务器做一次复制,省去重新安装配置PHP和Nginx
注意: 从 2016 年 10 月开始,快照的费用为每月每 GB 0.05 美元,具体取决于文件系统内的已用空间量。
拍摄您的 wordpress-1 和 mysql-1 VPS 的快照。
现在我们有了快照,我们准备继续构建我们环境的其余部分。
创建您的第二个 Web 应用程序服务器
现在我们需要创建第二个 VPS,它将与我们原来的 Web 应用程序服务器共享负载。 有两种选择:
- 从您为原始 VPS 拍摄的快照创建一个新的 VPS,wordpress-1
- 从头开始创建一个新的 VPS 并使用与 wordpress-1 相同的软件和配置手动设置它
无论使用哪种方法,如果可用,请务必选择 Private Networking 选项。 建议对本教程中使用的所有 VPS 使用专用网络。
如果您没有私有网络选项,请将私有 IP 地址替换为您的 VPS 公有 IP 地址。 请注意,在您传输敏感数据时使用公有 IP 地址,例如在您的应用程序和应用程序之间传输未加密的数据库密码数据库服务器,这不是好的做法,因为该信息将通过公共互联网传播。
选项 1:使用快照创建新 VPS
使用您为 wordpress-1 拍摄的快照创建一个名为 wordpress-2 的新 VPS。
如果您选择了此方法,请跳过“选项 2”到“同步 Web 应用程序文件”部分。
选项 2:从头开始创建新的 VPS
这是“选项 1”的替代方案。
如果您想从头开始设置 wordpress-2 服务器,而不是使用 wordpress-1 的快照,请确保安装相同的软件。 如果您不记得如何安装和配置原始 WordPress 服务器,请参阅先决条件文档的 设置 Web 服务器 部分。
为了快速参考,这里列出了您需要安装或复制的相关软件和配置文件:
软件:
- MySQL 客户端
- Nginx
- PHP
要安装此软件,请在 wordpress-2 服务器上运行以下命令:
sudo apt-get update sudo apt-get install mysql-client sudo apt-get install nginx php5-fpm php5-mysql
需要编辑或创建以匹配您的原始应用程序服务器的配置文件:
- /etc/php5/fpm/php.ini
- /etc/php5/fpm/pool.d/www.conf
- /etc/nginx/sites-available/example.com
- /etc/nginx/sites-enabled/example.com
完成软件配置后,不要忘记使用以下命令重新启动 PHP 和 Nginx:
sudo service php5-fpm restart sudo service nginx restart
完成安装和配置新应用程序服务器后,我们需要同步 WordPress 应用程序文件。
同步 Web 应用程序文件
在应用程序进行负载平衡之前,我们需要确保新服务器的 Web 应用程序文件与您原来的 WordPress 服务器同步。 这些文件的位置取决于您安装 WordPress 的位置以及其他一些文件。 除了 WordPress 需要运行的 php 文件外,通过 WordPress 界面上传的文件和安装的插件需要在上传或安装时进行同步。 在先决条件文档中,我们在 /var/www/example.com
中安装了 WordPress——我们将在所有示例中使用此位置,但您需要将其替换为您的实际 WordPress 安装路径。
有几种方法可以在服务器之间同步文件——NFS 或 glusterFS 都是合适的选择。 我们将使用 glusterFS 来满足我们的同步需求,因为它允许每个应用程序服务器存储自己的应用程序文件副本,同时保持整个文件系统的一致性。 这是我们目标共享存储的概念图:
如果您不熟悉本节中使用的任何 glusterFS 术语,请参阅本节所基于的 this GlusterFS Tutorial。
注意: 以下小节经常在 wordpress-1 和 wordpress-2 服务器之间跳转。 一定要在正确的服务器上运行命令,否则你会遇到问题!
编辑主机文件
注意: 如果您有一个内部 DNS,并且它记录了您的 VPS 的私有 IP 地址,请随意跳过此步骤,并将这些主机名替换为 glusterFS 设置命令和配置的其余部分。
否则,在 wordpress-1 和 wordpress-2 VPS 上 :
编辑 /etc/hosts:
sudo vi /etc/hosts
添加以下两行,将突出显示的单词替换为您的应用程序服务器的 IP 各自的 IP 地址:
wordpress_1_private_IP wordpress-1 wordpress_2_private_IP wordpress-2
保存并退出。
安装 GlusterFS 并配置复制卷
在 wordpress-1 和 wordpress-2 VPS 上:
使用 apt-get 安装 glusterFS 服务器软件:
sudo apt-get install glusterfs-server
在 wordpress-1 上,运行以下命令与您的 wordpress-2 对等:
sudo gluster peer probe wordpress-2
在 wordpress-2 上,运行以下命令与 wordpress-1 对等:
sudo gluster peer probe wordpress-1
在 wordpress-1 和 wordpress-2 上,要创建 glusterFS 将存储它管理的文件的位置,运行:
sudo mkdir /gluster-storage
在 wordpress-1 上,要创建一个名为 volume1
的复制 glusterFS 卷,它将在两个应用程序服务器上将其数据存储在 /gluster-storage
中,运行:
sudo gluster volume create volume1 replica 2 transport tcp wordpress-1: /gluster-storage wordpress-2: /gluster-storage force
预期输出:volume create:volume1:success:请启动volume以访问数据
再次在 wordpress-1 上,运行以下命令启动刚刚创建的 glusterFS 卷,volume1
:
sudo gluster卷开始卷1
预期输出:卷开始:卷1:成功
在 wordpress-1 上,如果您想查看有关您刚刚创建并启动的 glusterFS 卷的信息,请运行:
sudo gluster volume info
你应该看到你有两个 glusterFS “砖”,一个用于每个 WordPress 服务器。
现在我们有一个 glusterFS 卷正在运行,让我们挂载它,以便我们可以将它用作复制文件系统。
挂载共享存储
让我们先在 wordpress-1 上挂载文件系统。
在 wordpress-1 上,编辑 fstab 以便我们的共享文件系统将在启动时挂载:
sudo vi /etc/fstab
将以下行添加到文件末尾以使用 /storage-pool
作为我们的挂载点。 随意替换它(这里和这个 glusterFS 设置的其余部分):
wordpress-1: /volume1 /storage-pool glusterfs 默认值,_netdev 0 0
保存并退出。
在 wordpress-1 上,您现在可以将 glusterFS 卷挂载到 /storage_pool
文件系统:
sudo mkdir /storage-pool sudo mount /storage-pool
这会在您的 wordpress-1 VPS 上安装共享卷 /storage-pool。 您可以运行 df -h
,它应该被列为已挂载的文件系统。 接下来,我们将按照类似的过程将共享存储挂载到 wordpress-2 上。
在 wordpress-2 上,编辑 fstab 以便我们的共享文件系统将在启动时挂载:
sudo vi /etc/fstab
将以下行添加到文件末尾以使用 /storage-pool
作为我们的挂载点。 如果您使用了不同的值,请确保在此处替换它:
wordpress-2: /volume1 /storage-pool glusterfs 默认值,_netdev 0 0
在 wordpress-2 上,您现在可以将 glusterFS 卷挂载到 /storage_pool
文件系统:
sudo mkdir /storage-pool sudo mount /storage-pool
现在,在 /storage-pool
文件系统中创建、修改或删除的任何文件都将在两台服务器之间同步,即使其中一台服务器暂时停机。
将 WordPress 文件移动到共享存储
下一步是将 wordpress-1 的 WordPress 文件移动到共享存储。 请用您自己的价值观替换突出显示的单词。 /var/www/example.com
表示您的 WordPress 文件所在的位置(以及 Nginx 查找文件的位置),而 example.com
本身就是目录的基本名称。
在 wordpress-1 上,运行以下命令将 WordPress 应用程序文件移动到共享文件系统 /storage-pool
:
sudo mv /var/www/example.com /storage-pool/ sudo chown www-data:www-data /storage-pool/example.com
接下来,您将要创建一个符号链接,该链接指向共享文件系统上的 WordPress 文件,您的 WordPress 文件最初通过运行存储在其中:
sudo ln -s /storage-pool/example.com /var/www/example.com
现在您的 WordPress 文件位于共享文件系统 /storage-pool
上,Nginx 仍然可以通过其原始位置 /var/www/example.com
访问它们。
将新应用服务器指向共享存储
下一步是在我们的新 Web 应用程序服务器上创建一个符号链接,该链接指向共享文件系统上的 WordPress 文件。
如果您使用 快照选项 创建了 wordpress-2,请在 wordpress-2 上运行以下命令 :
sudo rm /var/www/example.com sudo ln -s /storage-pool/example.com /var/www/example.com
如果您从头开始 创建了 *wordpress-2 ,请在 wordpress-2 上运行以下命令 :
sudo mkdir -p /var/www sudo ln -s /storage-pool/example.com /var/www/example.com
这就是同步 WordPress 应用程序文件的过程! 下一步是让我们的新应用服务器 wordpress-2 访问数据库。
创建一个新的数据库用户
因为 MySQL 通过用户名和源主机识别用户,所以我们需要创建一个新的 wordpressuser 可以从我们的新应用服务器 wordpress-2 连接。
在您的数据库 VPS mysql-1 上,连接到 MySQL 控制台:
mysql -u root -p
在以下 MySQL 语句中,将所有突出显示的单词替换为适合您环境的单词:
- wordpressuser:你的 MySQL WordPress 用户。 确保它与已经存在的用户名相同
- wordpress_2_private_IP:你的wordpress-2 VPS的私网IP
- password:你的 MySQL WordPress 用户的密码。 确保它与已经存在的密码相同(并且它是一个好的密码!)
运行此语句创建一个 MySQL 用户,该用户可以从您的新 WordPress 服务器 wordpress-2 进行连接:
CREATE USER ' wordpressuser '@' wordpress_2_private_IP ' IDENTIFIED BY '密码';
再次,将您自己的值替换为 wordpressuser
、wordpress_2_private_IP
,并且,如果您的 数据库 未命名为“wordpress”,请确保也进行更改。
GRANT SELECT,DELETE,INSERT,UPDATE ON wordpress .* TO ' wordpressuser '@' wordpress_2_private_IP '; 同花顺特权;
现在您的第二个 Web 应用程序服务器 wordpress-2 可以登录到您的数据库服务器 mysql-1 上的 MySQL。
尚未负载平衡
请注意,有两个 Web 应用程序服务器正在运行,但应用程序没有负载平衡,因为必须通过它们各自的公共 IP 地址访问每个服务器。 我们希望能够通过相同的 URL 访问应用程序,例如 http://example.com/,并在两个 Web 应用程序服务器之间平衡流量。 这就是 HAProxy 的用武之地。
安装 HAProxy
使用专用网络创建一个新的 VPS。 对于本教程,我们将其称为 haproxy-www。
在我们的 haproxy-www VPS 中,让我们使用 apt-get 安装 HAProxy:
sudo apt-get update sudo apt-get install haproxy
我们需要启用 HAProxy 初始化脚本,以便 HAProxy 将与您的 VPS 一起启动和停止。
sudo vi /etc/default/haproxy
将 ENABLED
的值更改为 1
以启用 HAProxy 初始化脚本:
ENABLED=1
保存并退出。 现在 HAProxy 将随您的 VPS 启动和停止。 此外,您现在可以使用 service
命令来控制您的 HAProxy。 让我们检查一下它是否正在运行:
user@haproxy-www:/etc/init.d$ sudo service haproxy status haproxy not running.
它没有运行。 没关系,因为在我们使用它之前需要对其进行配置。 接下来让我们为我们的环境配置 HAProxy。
HAProxy 配置
HAProxy 的配置文件分为两个主要部分:
- Global:设置进程范围的参数
- Proxies:由defaults、listen、frontend和backend参数组成
同样,如果您对 HAProxy 或基本负载平衡概念和术语不熟悉,请参考此链接:HAProxy 和负载平衡概念简介
HAProxy 配置:全局
所有 HAProxy 配置都应在您的 HAProxy VPS haproxy-www 上完成。
首先,让我们复制默认的 haproxy.cfg 文件:
cd /etc/haproxy; sudo cp haproxy.cfg haproxy.cfg.orig
现在在文本编辑器中打开 haproxy.cfg:
sudo vi /etc/haproxy/haproxy.cfg
您会看到已经定义了两个部分:global 和 defaults。 首先,我们将对一些默认参数进行一些更改。
在 defaults 下,查找以下行:
mode http option httplog
在这两种情况下,将“http”一词替换为“tcp”:
mode tcp option tcplog
选择 tcp 作为模式将 HAProxy 配置为执行第 4 层负载平衡。 在我们的例子中,这意味着特定 IP 地址和端口上的所有传入流量都将转发到同一个后端。 如果您不熟悉这个概念,请阅读我们的 HAProxy 简介 中的 负载平衡类型 部分。
暂时不要关闭配置文件! 接下来我们将添加代理配置。
HAProxy 配置:代理
我们要添加的第一件事是前端。 对于基本的第 4 层负载平衡设置,前端侦听特定 IP 地址和端口上的流量,然后将传入流量转发到指定的后端。
在文件的最后,让我们添加我们的前端,www。 请务必将 haproxy_www_public_IP
替换为您的 haproxy-www VPS 的 公网 IP:
前端 www 绑定haproxy_www_public_IP :80 default_backend wordpress-backend
以下是对上述前端配置片段中每一行含义的解释:
- frontend www:指定一个名为“www”的前端,因为我们将使用它来处理传入的www流量
- bind haproxy_www_public_IP:80:将
haproxy_www_public_IP
替换为haproxy-www的公网IP地址。 这告诉 HAProxy 这个前端将处理这个 IP 地址和端口上的传入网络流量 - default_backend wordpress-backend:指定此前端的所有流量都将转发到wordpress-backend,我们将在下一步中定义
完成前端配置后,通过添加以下行继续添加后端。 请务必将突出显示的单词替换为适当的值:
后端 wordpress-backend balance roundrobin 模式 tcp 服务器 wordpress-1 wordpress_1_private_IP :80 检查服务器 wordpress-2 wordpress_2_private_IP :80 检查
以下是对上述后端配置片段中每一行含义的解释:
- backend wordpress-backend:指定一个名为“wordpress-backend”的后端
- balance roundrobin:指定此后端将使用“roundrobin”负载平衡算法
- mode tcp:指定此后端将使用“tcp”或第 4 层代理
- server wordpress-1 ...:指定一个名为“wordpress-1”的后端服务器,私有IP(您必须替换)和它正在侦听的端口,在这种情况下为80 . “检查”选项使负载均衡器定期在此服务器上执行健康检查
- server wordpress-2 …:这指定了一个名为“wordpress-2”的后端服务器
现在保存并退出。 HAProxy 现在可以启动了,但让我们先启用日志记录。
启用 HAProxy 日志记录
在 HAProxy 中启用日志记录非常简单。 首先编辑 rsyslog.conf 文件:
sudo vi /etc/rsyslog.conf
然后找到以下两行,取消注释以启用 UDP syslog 接收。 完成后应该如下所示:
$ModLoad imudp $UDPServerRun 514 $UDPServerAddress 127.0.0.1
现在重新启动 rsyslog 以启用新配置:
sudo service rsyslog restart
HAProxy 日志记录现已启用! 一旦 HAProxy 启动,日志文件将在 /var/log/haproxy.log
创建。
启动 HAProxy 和 PHP/Nginx
在 haproxy-www 上,启动 HAProxy 以使您的配置更改生效:
sudo service haproxy restart
根据您设置新应用程序服务器的方式,您可能需要通过重新启动 PHP 和 Nginx 来重新启动 WordPress 应用程序。
在 wordpress-2 上,通过运行以下命令重新启动 PHP 和 Nginx:
sudo service php5-fpm restart sudo service nginx restart
现在 WordPress 应该在您的两个应用程序服务器上运行,并且它们是负载平衡的。 但是还有最后一个配置更改要做。
更新 WordPress 配置
现在您的 WordPress 应用程序的 URL 已更改,我们必须更新 WordPress 中的一些设置。
在任一 WordPress 服务器 上,编辑您的 wp-config.php。 它位于您安装 WordPress 的位置(在本教程中,它安装在 /var/www/example.com 但您的安装可能会有所不同):
cd /var/www/example.com ; 须藤 vi wp-config.php
找到顶部附近显示 define('DB_NAME', 'wordpress');
的行,并在其上方添加以下行,替换突出显示的值:
定义('WP_SITEURL',' http://haproxy_www_public_IP '); 定义('WP_HOME',' http://haproxy_www_public_IP ');
保存并退出。 现在,WordPress URL 已配置为指向您的负载均衡器,而不仅仅是您的原始 WordPress 服务器,当您尝试访问 wp-admin 仪表板时,它会发挥作用。
负载均衡完成!
您的 Web 应用程序服务器现在已实现负载平衡! 您的用户现在可以通过负载均衡器的公共 IP 地址或域名访问您的负载均衡 WordPress,haproxy-www!
结论
现在,您的用户负载将分散在您的两个 WordPress 服务器之间。 此外,如果您的 WordPress 应用程序服务器之一出现故障,您的站点仍然可用,因为其他 WordPress 服务器将转发所有流量!
使用此设置,请记住您的 HAProxy 负载平衡器服务器 haproxy-www 和数据库服务器 mysql-1 需要运行才能使您的站点正常工作。