介绍
在本教程中,我们将教您如何将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:您的MySQL服务器为WordPress
您的环境的抽象视图目前看起来像这样:
除了当前的环境之外,在本教程中还需要两个VPS。 我们将称之为:
- WordPress的-2:你的第二个WordPress的Web应用程序服务器
- HAProxy的-WWW:您HAProxy的服务器进行负载平衡
如果你不熟悉基本的负载均衡概念或术语,如第4层负载均衡或后端或访问控制列表 ,这里是解释的基础知识的文章: 简介HAProxy的和负载平衡概念 。
我们的目标
在本教程结束时,我们希望有一个如下所示的环境:
也就是说,您的用户将访问您的WordPress网站,通过转到您的HAProxy服务器,它将以循环方式将其转发到负载平衡的WordPress应用程序服务器。 你的两个(或更多,如果你愿意)都将访问你的MySQL数据库。
快照您当前的环境
可选 :本教程继续之前,您需要创建当前环境的快照。 快照在本教程中有两个目的:
- 如果发生错误,要恢复到工作环境
- 对原始服务器进行一次性复制,无需再次安装和配置PHP和Nginx
注:在2016年10月开始,快照成本每月每千兆字节$ 0.05,在文件系统中的使用的空间量。
把你的WordPress-1和mysql-1的VPS的快照。
现在我们有快照,我们准备继续建设我们的环境的其余部分。
创建第二个Web应用程序服务器
现在我们需要创建第二个VPS,它将与我们的原始Web应用程序服务器共享负载。 有两个选项:
- 创建一个从你把原来的VPS的快照新的VPS,WordPress的-1
- 从头开始创建一个新的VPS与手动相同的软件和配置,WordPress的-1进行设置
无论使用哪种方法,一定要选择专用网络选项,如果它是可用。 对于本教程中使用的所有VPS,建议使用专用网络。
如果你没有一个专用网络选项,你的VPS公网IP地址代替私有IP地址。请注意,使用公网IP地址,当你在传输敏感数据,如应用程序和数据库服务器之间未加密的数据库密码,是不是好因为这些信息将通过公共互联网传播。
选项1:使用快照创建新的VPS
创建一个新的VPS名为WordPress的-2,用了你的WordPress的-1的快照。
如果选择此方法,请跳过“选项2”到“同步Web应用程序文件”部分。
选项2:从头开始创建新的VPS
这是“选项1”的替代方法。
如果你想从头开始设置WordPress的-2服务器,而不是使用WordPress的-1快照,请确保您安装相同的软件。 请参阅设置Web服务器的前提下文档的部分,如果你不记得你如何安装和配置你原来的WordPress服务器做。
有关快速参考,以下是您需要安装或复制的相关软件和配置文件的列表:
软件:
- 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界面安装的文件上传和插件需要在上传或安装时同步。 在前提文件,我们安装的WordPress /var/www/example.com
-我们将使用此位置我们所有的例子,但你需要用实际的WordPress安装路径来替代这一点。
有几种方法可以在服务器之间同步文件 - NFS或glusterFS都是合适的选项。 我们将使用glusterFS来满足我们的同步需求,因为它允许每个应用程序服务器存储自己的应用程序文件副本,同时保持整个文件系统的一致性。 以下是我们的目标共享存储的概念图:
如果你不熟悉任何本节请参照使用的术语glusterFS的这个GlusterFS教程 ,在本条的基础上的。
注意:以下小节的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,创建一个名为复制glusterFS量volume1
,将存储在数据/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卷信息,运行:
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 defaults,_netdev 0 0
保存并退出。
WordPress的-1,你现在能够将glusterFS卷装入到/storage_pool
文件系统:
sudo mkdir /storage-pool sudo mount /storage-pool
挂载共享卷,/存储池,在你的WordPress-1 VPS。 您可以运行df -h
,它应该被列为安装的文件系统。 接下来,我们将遵循类似的过程安装WordPress的-2共享存储。
WordPress的-2,编辑fstab,这样我们的共享文件系统将安装在启动:
sudo vi /etc/fstab
以下行添加到文件的末尾使用/storage-pool
作为我们的挂载点。 如果您使用了不同的值,请确保在此处替换它:
wordpress-2:/volume1 /storage-pool glusterfs defaults,_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
- 密码 :你的MySQL的WordPress用户的密码。 确保它与已经存在的密码相同(并且它是一个好的密码!)
运行该语句创建一个MySQL用户,可以从你的新的WordPress服务器连接,WordPress的-2:
CREATE USER 'wordpressuser'@'wordpress_2_private_IP' IDENTIFIED BY 'password';
再次,替换自己的值wordpressuser
, wordpress_2_private_IP
,并且,如果你的数据库是不是名为“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的地方。
安装HAProxy
使用专用网络创建新的VPS。 在本教程中,我们将它称为HAProxy的-WWW。
在我们HAProxy的www的 VPS,让我们安装与HAProxy的apt-get的 :
sudo apt-get update
sudo apt-get install haproxy
我们需要启用HAProxy init脚本,因此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的配置文件分为两个主要部分:
- 全球 :套工艺范围的参数
- 代理 :由违约 , 听 , 前端和后端的参数
同样,如果你不熟悉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
你会看到,已经有定义的两个部分: 全局和默认值 。 首先,我们将对一些默认参数进行一些更改。
根据默认设置 ,查找下面几行:
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:
frontend www bind haproxy_www_public_IP:80 default_backend wordpress-backend
以下是前端配置片段中每行代码的解释:
- 前端WWW:指定一个名为“www”的前端,我们将用它来处理传入的WWW流量
- 绑定haproxy_www_public_IP:80:更换
haproxy_www_public_IP
与HAProxy的www的公共IP地址。 这告诉HAProxy这个前端将处理此IP地址和端口上的传入网络流量 - default_backend WordPress的后端 :指定所有这些前端的流量将被转发到WordPress的后端 ,我们将在下一步定义
完成前端配置后,通过添加以下行继续添加后端。 请务必使用适当的值替换突出显示的字词:
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
以下是后端配置代码段中每行代码的解释:
- 后端WordPress的后端 :指定一个名为“WordPress的后端”后端
- 平衡roundrobin:指定这个后端将使用“roundrobin”负载均衡算法
- 模式TCP:指定这个后端将使用“TCP”或4层代理
- 服务器WordPress的-1 ...:80指定在这种情况下,一个名为“WordPress的-1”的后端服务器,私有IP(你必须替换)和端口,它正在侦听。 “检查”选项使负载平衡器定期对此服务器执行运行状况检查
- 服务器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日志记录现在已启用! 日志文件将在被创建/var/log/haproxy.log
一旦HAProxy的开始。
启动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; 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是现在可以通过负载平衡器,HAProxy的-WWW的公网IP地址或域名访问你的用户!
结论
现在,您的用户的负载将分布在两个WordPress服务器之间。 此外,如果您的一个WordPress应用程序服务器关闭,您的网站仍然可用,因为其他WordPress服务器将转发所有的流量!
有了这个设置,请记住您HAProxy的负载均衡服务器,HAProxy的www的 ,和你的数据库服务器,MySQL-1,需要运行为您的网站才能正常工作。