在本教程中,我们将教您如何使用 HAProxy 作为 WordPress 服务器(特别是 Web 应用程序层)的第 4 层负载均衡器。负载平衡应用程序服务器为您的设置添加了冗余,从而提高了服务器故障或网络问题时的可靠性,并将负载分散到多个服务器上以提高读取性能。我们假设您的设置包括一个连接到单独的 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 服务器,用于负载平衡
如果您不熟悉基本的负载平衡概念或术语,例如四层负载均衡 or backends or ACLs,这里有一篇文章解释了基础知识:HAProxy 和负载均衡概念简介.
在本教程结束时,我们希望拥有一个如下所示的环境:
也就是说,您的用户将通过 HAProxy 服务器访问您的 WordPress 站点,HAProxy 服务器将以循环方式将它们转发到负载平衡的 WordPress 应用程序服务器。您的两个(或更多,如果您愿意的话)都将访问您的 MySQL 数据库。
Optional:在继续本教程之前,您需要创建当前环境的快照。在本教程中,快照有两个目的:
- 如果发生错误,恢复到工作环境
- 对原始服务器进行一次性复制,无需再次安装和配置 PHP 和 Nginx
Note:从 2016 年 10 月开始,快照费用为每月每 GB 0.05 美元,具体取决于文件系统内的已利用空间量。
拍一张你的快照WordPress-1 and mysql-1 VPSs.
现在我们有了快照,我们准备好继续构建环境的其余部分。
现在我们需要创建第二个 VPS,它将与我们原来的 Web 应用程序服务器共享负载。有两种选择:
- 从原始 VPS 的快照创建一个新的 VPS,WordPress-1
- 从头开始创建一个新的 VPS,并使用与之前相同的软件和配置手动设置它WordPress-1
无论采用哪种方法,请务必选择专用网络选项(如果可用)。建议本教程中使用的所有 VPS 使用专用网络。
如果您没有专用网络选项,请将专用 IP 地址替换为您的 VPS 公共 IP 地址。请注意,在传输敏感数据(例如应用程序和数据库服务器之间的未加密数据库密码)时使用公共 IP 地址并不是一个好的做法,因为该信息将通过公共 Internet 传输。
创建一个新的 VPS,名为wordpress-2,使用您拍摄的快照WordPress-1.
如果您选择此方法,请跳过“选项 2”到“同步 Web 应用程序文件”部分。
这是“选项 1”的替代方案。
如果您想设置wordpress-2从头开始服务器,而不是使用快照WordPress-1,确保安装相同的软件。请参阅设置网络服务器如果您不记得如何安装和配置原始 WordPress 服务器,请参阅先决条件文档的部分。
为了快速参考,以下是您需要安装或复制的相关软件和配置文件的列表:
软件:
要安装此软件,请在您的计算机上运行以下命令wordpress-2 server:
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 应用程序文件与原始 WordPress 服务器同步。这些文件的位置取决于您安装 WordPress 和其他一些文件的位置。除了WordPress需要运行的php文件之外,通过WordPress界面上传的文件和安装的插件在上传或安装时也需要同步。在先决条件文档中,我们安装了 WordPress/var/www/example.com
–我们将在所有示例中使用此位置,但您需要将其替换为实际的 WordPress 安装路径。
有多种方法可以在服务器之间同步文件 - NFS 或 glusterFS 都是合适的选择。我们将使用 glusterFS 来满足我们的同步需求,因为它允许每个应用程序服务器存储自己的应用程序文件副本,同时保持整个文件系统的一致性。这是我们的目标共享存储的概念图:
如果您不熟悉本节中使用的任何 glusterFS 术语,请参阅这个 GlusterFS 教程,本节以此为基础。
Note:以下小节之间跳转WordPress-1 and wordpress-2服务器频繁。请务必在正确的服务器上运行命令,否则您会遇到问题!
Note:如果您有内部 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
前>
保存并退出。
On WordPress-1 and wordpress-2 VPSs:
使用 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 上,创建一个名为的复制 glusterFS 卷volume1
,它将把它的数据存储在/gluster-storage
在两台应用程序服务器上运行:
sudo gluster volume create volume1 副本 2 传输 tcp wordpress-1:/gluster-storage wordpress-2:/gluster-storage 力
前>
预期输出:卷创建:卷1:成功:请启动卷以访问数据
前>
在 wordpress-1 上再次运行以下命令来启动刚刚创建的 glusterFS 卷,volume1
:
sudo gluster 卷启动 volume1
前>
预期输出:卷开始:卷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 /存储池
sudo mount /存储池
前>
这会将共享卷 /storage-pool 安装在您的WordPress-1虚拟专用服务器。你可以运行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-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通过用户名和源主机来识别用户,所以我们需要创建一个新的wordpress用户可以从我们的新应用程序服务器连接,wordpress-2.
在您的数据库 VPS 上,mysql-1,连接到MySQL控制台:
mysql -u root -p
在以下 MySQL 语句中,将所有突出显示的单词替换为适合您的环境的内容:
-
wordpress用户:您的 MySQL WordPress 用户。确保它与已有的用户名相同
-
wordpress_2_private_IP:你的私有IPwordpress-2 VPS
-
password:您的 MySQL WordPress 用户的密码。确保它与已有的密码相同(并且这是一个好的密码!)
运行此语句创建一个可以从新的 WordPress 服务器连接的 MySQL 用户,wordpress-2:
创建用户 'wordpressuser'@'wordpress_2_private_IP' 由“密码'标识;
前>
再次,用你自己的价值观代替wordpressuser
, wordpress_2_private_IP
,并且,如果您的database未命名为“wordpress”,请确保也更改它。
将 wordpress.* 上的选择、删除、插入、更新授予 'wordpressuser'@' wordpress_2_private_IP';
同花顺特权;
前>
现在是您的第二个 Web 应用程序服务器,wordpress-2,可以登录到你的数据库服务器上的MySQL,mysql-1.
请注意,有两个正在运行的 Web 应用程序服务器,但应用程序未实现负载平衡,因为每个服务器都必须通过其各自的公共 IP 地址进行访问。我们希望能够通过相同的 URL 访问应用程序,例如http://example.com/,并在两个 Web 应用程序服务器之间平衡流量。这就是 HAProxy 发挥作用的地方。
使用专用网络创建新的 VPS。对于本教程,我们将其称为haproxy-www.
In our haproxy-wwwVPS,让我们安装 HAProxyapt-get:
sudo apt-get update
sudo apt-get install haproxy
我们需要启用 HAProxy 初始化脚本,以便 HAProxy 将与您的 VPS 一起启动和停止。
sudo vi /etc/default/haproxy
改变值ENABLED
to 1
启用 HAProxy 初始化脚本:
ENABLED=1
保存并退出。现在 HAProxy 将随您的 VPS 一起启动和停止。另外,您现在可以使用service
命令来控制您的 HAProxy。让我们检查一下它是否正在运行:
user@haproxy-www:/etc/init.d$ sudo service haproxy status
haproxy not running.
它没有运行。没关系,因为我们需要先对其进行配置才能使用它。接下来让我们为我们的环境配置 HAProxy。
HAProxy的配置文件分为两个主要部分:
-
Global:设置进程范围的参数
-
Proxies: 由组成defaults, listen, frontend, and backend参数
再次强调,如果您不熟悉 HAProxy 或基本负载均衡概念和术语,请参考此链接:HAProxy 和负载均衡概念简介
所有 HAProxy 配置都应在您的 HAProxy VPS 上完成,haproxy-www.
首先,我们复制一份默认的haproxy.cfg file:
cd /etc/haproxy; sudo cp haproxy.cfg haproxy.cfg.orig
现在在文本编辑器中打开 haproxy.cfg:
sudo vi /etc/haproxy/haproxy.cfg
您将看到已经定义了两个部分:global and defaults。首先,我们将对一些默认参数进行一些更改。
Under defaults,查找以下行:
mode http
option httplog
在这两种情况下将单词“http”替换为“tcp”:
mode tcp
option tcplog
选择 tcp 作为模式会将 HAProxy 配置为执行第 4 层负载均衡。在我们的例子中,这意味着特定 IP 地址和端口上的所有传入流量都将转发到同一后端。如果您不熟悉这个概念,请阅读负载平衡的类型我们的部分HAProxy 简介.
暂时不要关闭配置文件!接下来我们将添加代理配置。
我们要添加的第一件事是前端。对于基本的第 4 层负载平衡设置,前端侦听特定 IP 地址和端口上的流量,然后将传入流量转发到指定的后端。
在文件的末尾,让我们添加我们的前端,www。一定要更换haproxy_www_public_IP
与公共IP您的 haproxy-www VPS 的:
前端 www
绑定 haproxy_www_public_IP:80
default_backend WordPress 后端
前>
以下是上面前端配置片段中每一行含义的解释:
-
前端 www:指定一个名为“www”的前端,因为我们将使用它来处理传入的 www 流量
-
绑定 haproxy_www_public_IP:80: 代替
haproxy_www_public_IP
使用 haproxy-www 的公共 IP 地址。这告诉 HAProxy 该前端将处理该 IP 地址和端口上的传入网络流量
-
default_backend WordPress 后端:这指定该前端的所有流量都将转发到WordPress 后端,我们将在下一步中定义
完成前端配置后,通过添加以下行继续添加后端。请务必将突出显示的单词替换为适当的值:
后端 WordPress 后端
平衡循环赛
TCP模式
服务器 wordpress-1 wordpress_1_private_IP:80 检查
服务器 wordpress-2 wordpress_2_private_IP:80 检查
前>
以下是上面后端配置片段中每一行含义的解释:
-
后端 WordPress 后端:指定名为“wordpress-backend”的后端
-
平衡循环赛:指定该后端将使用“roundrobin”负载平衡算法
-
mode tcp:指定该后端将使用“tcp”或第 4 层代理
-
服务器 WordPress-1 ...:指定名为“wordpress-1”的后端服务器、私有IP(您必须替换)和它正在侦听的端口,80在这种情况下。 “check”选项使负载均衡器定期对此服务器执行健康检查
-
服务器 WordPress-2 ...:这指定了一个名为“wordpress-2”的后端服务器
现在保存并退出。 HAProxy 现在已准备好启动,但我们首先启用日志记录。
在 HAProxy 中启用日志记录非常简单。首先编辑rsyslog.conf文件:
sudo vi /etc/rsyslog.conf
然后找到以下两行,取消注释以启用 UDP 系统日志接收。完成后,它应该如下所示:
$ModLoad imudp
$UDPServerRun 514
$UDPServerAddress 127.0.0.1
现在重新启动 rsyslog 以启用新配置:
sudo service rsyslog restart
HAProxy 日志记录现已启用!日志文件将创建于/var/log/haproxy.log
HAProxy 启动后。
关于 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 应用程序的 URL 已更改,我们必须更新 WordPress 中的一些设置。
在任一 WordPress 服务器上,编辑您的 wp-config.php。它位于您安装 WordPress 的位置(在本教程中,它安装在/var/www/example.com但您的安装可能会有所不同):
cd /var/www/example.com; sudo 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,需要运行您的网站才能正常工作。
作者:Mitchell Anicas