介绍
在本教程中,我们将教你如何使用HAProxy作为您的WordPress服务器的4层负载平衡器 - 特别是Web应用程序层。 应用程序服务器的负载平衡增加了您的设置,这增加了服务器故障或网络问题的可靠性,并在多个服务器上分散了负载以提高读取性能。
如果你的环境更复杂(例如,你想在单独的入口点上运行WordPress和静态Web服务器),你需要看看应用程序层(Layer 7)的负载平衡。
本教程是用WordPress作为示例写的,但其一般概念可以用来加载其他无状态的Web应用程序。
前提条件
在继续本教程之前,您应该完成有关设置一个WordPress网站与单独的数据库服务器的教程(或具有类似的设置): 如何设置远程数据库以优化网站性能与MySQL
在遵循该教程后,在单独的Web应用程序和数据库服务器上设置WordPress,您应该有两个VPS,因为我们将处理几个VPS,为参考目的,我们将称呼您的两个现有的VPS如下:
- wordpress-1:您的WordPressWeb应用程序服务器
- mysql-1:您的MySQL服务器为WordPress
对你的环境的抽象观点目前看起来像这样:
除了您目前的环境之外,我们还需要在本教程中添加两个VPS,我们会给他们打电话:
- wordpress-2:您的第二个WordPressWeb应用程序服务器
- haproxy-www:您的HAProxy服务器,负载平衡
如果您不熟悉基本的负荷平衡概念或术语,例如 layer 4 负荷平衡 或 backends 或 ACLs,这里有一篇文章解释了基本知识: HAProxy 和负荷平衡概念的介绍。
我们的目标
在本教程结束时,我们希望有一个看起来像这样的环境:
也就是说,您的用户将通过访问您的HAProxy服务器访问您的WordPress网站,该服务器将其转发到您的负载均衡WordPress应用程序服务器以轮回方式。
扫描你的当前环境
Optional:在继续本教程之前,您将想要创建当前环境的快照。
要重返工作环境如果出现错误 2 要一次性复制原始服务器,消除需要重新安装和配置 PHP 和 Nginx
<$>[注] 注: 从 2016 年 10 月开始,每月每 gigabyte 的快照成本为 0.05 美元,取决于文件系统中所使用的空间量。
拍摄您的 wordpress-1 和 mysql-1 VPS 的快照。
现在,我们有了快照,我们已经准备好继续建设我们的其他环境。
创建你的第二个 Web 应用程序服务器
现在我们需要创建第二个VPS,它将与我们的原始Web应用程序服务器共享负载。
- 创建一个新的VPS从你从原来的VPS拍摄的瞬间, wordpress-1 2 创建一个新的VPS从头开始,并手动设置它与同样的软件和配置 wordpress-1
使用任何一种方法,请确保选择 Private Networking 选项,如果可用,建议在本教程中使用的所有 VPS 使用私人网络。
** 如果您没有私有网络选项,请将私有 IP 地址替换为 VPS 的公共 IP 地址。** 请注意,当您在应用程序和数据库服务器之间传输敏感数据时使用公共 IP 地址,例如未加密的数据库密码,不是良好的做法,因为这些信息将通过公共互联网移动。
选项1:创建新的VPS与Snapshot
创建一个名为 wordpress-2 的新的 VPS,使用您拍摄的 wordpress-1 的快照。
如果您选择了此方法,请跳过选项2
到同步 Web 应用程序文件
部分。
选项2:从零创建新的VPS
这是选择1
的替代方案。
如果您想从头开始设置 wordpress-2 服务器,而不是使用 wordpress-1 的快照,请确保安装相同的软件。如果您不记得如何安装和配置原始 WordPress 服务器,请参阅先决条件文档的 设置 Web 服务器部分。
为了快速参考,以下是您需要安装或复制的相关软件和配置文件的列表:
软件:
- MySQL 客户端 Nginx PHP
要安装此软件,请在您的 wordpress-2 服务器上运行以下操作:
1sudo apt-get update
2sudo apt-get install mysql-client
3sudo 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 一旦你完成了软件的配置,使用这些命令:
1sudo service php5-fpm restart
2sudo service nginx restart
在您完成安装和配置新应用程序服务器后,我们将需要同步 WordPress 应用程序文件。
同步 Web 应用程序文件
在应用程序可以负载平衡之前,我们需要确保新服务器的Web应用程序文件与原始WordPress服务器同步。这些文件的位置取决于您安装WordPress的位置,以及其他一些文件。除了WordPress需要运行的php文件外,通过WordPress接口上传的文件和安装的插件需要同步,因为它们被上传或安装。在前提文件中,我们在‘/var/www/example.com’中安装WordPress,我们将使用这个位置用于我们的所有示例,但您需要用您的实际WordPress安装路径来代替。
我们将使用glusterFS来满足我们的同步需求,因为它允许每个应用程序服务器存储自己的应用程序文件副本,同时保持整个文件系统的一致性。
如果您不熟悉本节所使用的任何 glusterFS 术语,请参阅此 GlusterFS 教程(https://www.digitalocean.com/community/articles/how-to-create-a-redundant-storage-pool-using-glusterfs-on-ubuntu-servers),本节是基于的。
** 注意:** 以下子部分经常跳到 wordpress-1 和 wordpress-2 服务器之间,请确保在正确的服务器上运行命令,否则你会遇到问题!
Edit 主持人檔案
** 注意:** 如果您有内部 DNS,并且它有您的 VPS 私人 IP 地址的记录,请轻松跳过此步骤,并替换这些主机名称为其余的 glusterFS 设置命令和配置。
否则,在WordPress-1和WordPress-2 VPS上:**
编辑 /etc/ 主机:
1sudo vi /etc/hosts
添加以下两行,用应用程序服务器的 IP 地址代替突出的单词:
wordpress_1_private_IP wordpress-1 wordpress_2_private_IP wordpress-2
保存和停止。
安装 GlusterFS 并配置复制卷
在 wordpress-1 和 wordpress-2 VPS 上:**
使用 apt-get 来安装 glusterFS 服务器软件:
1sudo apt-get install glusterfs-server
** 在WordPress-1**上,运行以下命令以与您的WordPress-2_同行:
1sudo gluster peer probe wordpress-2
** 在 wordpress-2**上,运行以下命令以与 wordpress-1 同行:
1sudo gluster peer probe wordpress-1
在 wordpress-1 和 wordpress-2上,要创建 glusterFS 将其管理的文件存储的位置,运行:
1sudo 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
Expected Output: volume create: volume1: success: please start the volume to access data
** 在 wordpress-1**上再次运行以下命令来启动您刚刚创建的 glusterFS 卷 volume1
:
sudo gluster volume start volume1
Expected Output: volume start: volume1: success
** 在 wordpress-1**上,如果你想看到有关你刚刚创建和启动的 glusterFS 卷的信息,请运行:
1sudo gluster volume info
你应该看到,你有两个glusterFS砖
,一个为每个WordPress服务器。
现在我们有一个 glusterFS 卷运行,让我们安装它,以便我们可以将其用作复制文件系统。
山区共享仓库
让我们先在WordPress-1上安装文件系统。
** 在 wordpress-1**上,编辑 fstab 以便我们的共享文件系统启动:
1sudo vi /etc/fstab
将下列行添加到文件的末尾,以使用 /storage-pool
作为我们的安装点. 请自由地替换这个(在这里和本 glusterFS 设置的其余部分):
wordpress-1:/volume1 /storage-pool glusterfs defaults,_netdev 0 0
保存和停止。
** 在 wordpress-1**上,您现在可以将 glusterFS 卷安装到 /storage_pool
文件系统:
sudo mkdir /storage-pool sudo mount /storage-pool
这将共享卷, / storage-pool,安装在您的 wordpress-1 VPS 上. 您可以运行df -h
,并且应该列为安装的文件系统。
** 在 wordpress-2**上,编辑 fstab 以便我们的共享文件系统启动:
1sudo vi /etc/fstab
将下列行添加到文件的末尾以使用 /storage-pool
作为我们的安装点. 如果您使用了不同的值,请确保您在这里取代它:
wordpress-2:/volume1 /storage-pool glusterfs defaults,_netdev 0 0
** 在 wordpress-2**上,您现在可以将 glusterFS 卷安装到 /storage_pool
文件系统:
1sudo mkdir /storage-pool
2sudo mount /storage-pool
现在,在/storage-pool
文件系统中创建、修改或删除的任何文件都会在两个服务器上同步,即使其中一个服务器暂时停机。
将WordPress文件迁移到共享存储
下一步是将 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
,它们仍然可以通过原始位置, /var/www/example.com
访问 Nginx。
指向新的应用程序服务器共享存储
下一步是在我们的新的Web应用程序服务器上创建一个符号链接,该链接指向共享文件系统上的WordPress文件。
如果您使用 snapshot 选项创建了 wordpress-2,请在 wordpress-2上运行以下命令:
sudo rm /var/www/example.com sudo ln -s /storage-pool/example.com /var/www/example.com
如果您创建了 wordpress-2 from zero,请执行以下命令 _on 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控制台:
1mysql -u root -p
在以下 MySQL 语句中,用适用于您的环境的任何文字代替所有突出的单词:
- wordpressuser:您的MySQLWordPress用户. 确保它与现有用户名相同
- wordpress_2_private_IP:您的WordPress-2_VPS
- password:您的MySQLWordPress用户密码。 确保它与现有密码相同(而且它是一个很好的密码!)
运行此声明创建一个MySQL用户,可以从你的新的WordPress服务器连接, wordpress-2:
CREATE USER 'wordpressuser'@'wordpress_2_private_IP' IDENTIFIED BY 'password';
再次,替换自己的值为wordpressuser
,wordpress_2_private_IP
,如果您的 database 没有被命名为wordpress
,请确保也改变了。
GRANT SELECT,DELETE,INSERT,UPDATE ON wordpress.* TO 'wordpressuser'@'wordpress_2_private_IP'; FLUSH PRIVILEGES;
现在你的第二个 Web 应用程序服务器 wordpress-2 可以登录到您的数据库服务器上的 MySQL, mysql-1。
尚未负荷均衡
请注意,有两个 Web 应用程序服务器正在运行,但应用程序没有负载平衡,因为每个服务器必须通过其相应的公共 IP 地址访问。我们希望能够通过相同的 URL 访问应用程序,如 http://example.com/,并在两个 Web 应用程序服务器之间的流量平衡。
安装 HAProxy
创建一个新的VPS与私人网络. 对于本教程,我们将称之为 haproxy-www。
在我们的 haproxy-www VPS 中,让我们用 apt-get 安装 HAProxy:
1sudo apt-get update
2sudo apt-get install haproxy
我们需要启用HAProxy init脚本,因此HAProxy将与您的VPS一起启动和停止。
1sudo vi /etc/default/haproxy
将ENABLED
的值更改为1
,以启用 HAProxy init 脚本:
1ENABLED=1
现在HAProxy将启动和停止您的VPS。 此外,您现在可以使用服务
命令来控制您的HAProxy。
1user@haproxy-www:/etc/init.d$ sudo service haproxy status
2haproxy not running.
它不运行,这很好,因为它需要配置,然后我们可以使用它。
HAProxy 配置
HAProxy 的配置文件分为两个主要部分:
- 全球:设置整个流程的参数
- Proxies:包括 defaults、 listen、 frontend 和 backend 参数
再次,如果你不熟悉HAProxy或基本的负荷平衡概念和术语,请参阅此链接: HAProxy和负荷平衡概念的介绍
HAProxy 配置: 全球
**所有HAProxy配置都应该在您的HAProxy VPS上完成, haproxy-www。
首先,让我们创建一个默认 haproxy.cfg 文件的副本:
1cd /etc/haproxy; sudo cp haproxy.cfg haproxy.cfg.orig
现在在文本编辑器中打开 haproxy.cfg:
1sudo vi /etc/haproxy/haproxy.cfg
您将看到已经定义的两个部分: global 和 defaults. 首先,我们将对一些默认参数进行一些更改。
在 defaults 中,搜索以下行:
1mode http
2option httplog
在这两种情况下,将http
代替为tcp
:
1mode tcp
2option tcplog
选择 tcp 作为模式将 HAProxy 配置为执行层 4 负荷平衡。在我们的情况下,这意味着在特定 IP 地址和端口上的所有流量将被转移到相同的后端。
不要关闭 config 文件! 接下来我们将添加 proxy 配置。
HAProxy 配置: Proxies
对于基本的4层负载平衡设置,前端听取特定IP地址的流量,然后将输入流量转移到指定的后端。
在文件的末尾,让我们添加我们的前端, www. 请确保用您的 haproxy-www VPS 的 公共 IP代替haproxy_www_public_IP
:
frontend www
bind haproxy_www_public_IP:80
default_backend wordpress-backend
以下是对前端 config 片段中的每个行意味着什么的解释:
- frontend www:指定一个名为
www
的前端,因为我们将使用它来处理到来的 www 流量 - bind haproxy_www_public_IP:80:用 haproxy-www的公共 IP 地址代替
haproxy_www_public_IP
这告诉 HAProxy 这个前端将处理这个 IP 地址和端口上的入口网络流量 - default_backend wordpress-backend:这说明这个前端的所有流量将被转发到 wordpress-backend,我们将在下一步定义
完成配置前端后,请继续通过添加以下行来添加后端。
backend wordpress-backend balance roundrobin mode tcp server wordpress-1 wordpress_1_private_IP:80 check server wordpress-2 wordpress_2_private_IP:80 check
以下是对上面的后端配置片段中的每个行意味着什么的解释:
- backend wordpress-backend:指定名为
wordpress-backend
的后端 - balance roundrobin:指定此后端将使用
roundrobin
负载平衡算法 - mode tcp:指定此后端将使用
tcp
或4层代理 - server wordpress-1...:指定名为
wordpress-1
的后端服务器,私人IP(您必须取代)和端口,在这种情况下它正在收听, 80。
HAProxy现在已经准备好启动,但让我们先启用登录。
启用 HAProxy 记录
在 HAProxy 中启用登录非常简单. 首先,编辑 rsyslog.conf 文件:
1sudo vi /etc/rsyslog.conf
然后找出以下两行,并解除评论以启用UDP syslog接收. 完成后应该看起来如下:
1$ModLoad imudp
2$UDPServerRun 514
3$UDPServerAddress 127.0.0.1
现在重新启动 rsyslog 以启用新的配置:
1sudo service rsyslog restart
HAProxy 登录已启用! HAProxy 启动后,日志文件将创建在 `/var/log/haproxy.log。
启动 HAProxy 和 PHP/Nginx
** 在 haproxy-www** 上,启动 HAProxy 以使配置更改生效:
1sudo service haproxy restart
根据您如何设置新的应用程序服务器,您可能需要通过重新启动PHP和Nginx来重新启动您的WordPress应用程序。
在 wordpress 2 中,通过运行以下命令重新启动 PHP 和 Nginx:
1sudo service php5-fpm restart
2sudo service nginx restart
现在WordPress应该在您的两个应用程序服务器上运行,并且负荷均衡,但仍有最后一个配置更改要做。
更新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');’,并在上面添加以下行,取代突出值:
define('WP_SITEURL', 'http://haproxy_www_public_IP'); define('WP_HOME', 'http://haproxy_www_public_IP');
现在,WordPress URL已配置为指向您的负载平衡器,而不仅仅是您的原始WordPress服务器,当您尝试访问WP-admin仪表板时,它就会发挥作用。
充电平衡全程!
您的 Web 应用程序服务器现在负荷均衡! 您的负荷均衡 WordPress 现在可以通过您的负荷均衡器的公共 IP 地址或域名访问您的用户, haproxy-www!
结论
现在你的用户的负载将分布在你的两个WordPress服务器之间,此外,如果你的WordPress应用服务器中的一台下跌,你的网站仍然可用,因为其他WordPress服务器将转发所有流量!
使用此设置,请记住您的 HAProxy 负载平衡服务器 haproxy-www 和您的数据库服务器 mysql-1 需要运行,以便您的网站正常工作。