红联Linux门户
Linux帮助

在Ubuntu上利用HAProxy作为WordPress应用服务器的4层负载均衡器

发布时间:2017-04-24 15:21:28来源:www.zstack.org.cn作者:ZStack云计算
在本教程中,我们将探讨如何利用HAProxy作为4层负载均衡器以支持WordPress服务器——特别是其Web应用层。对应用服务器进行负载均衡相当于在设置中引入冗余机制,其能够提升服务器在发生故障或者遭遇网络问题时的可靠性,同时将负载分配至多台服务器上以提升读取性能。这里,我们假定大家的设置当中已经包含一套接入至独立MySQL数据库服务器的WordPress应用服务器(具体设置方法详见先决条件部分)。
4层负载均衡机制适用于仅在服务器上运行单一Web应用的情况。如果大家的环境较为复杂(例如希望在不同服务器上分别运行WordPress及静态Web服务器,且二者使用同一入口点),则应考虑使用应用层(即7层)负载均衡机制。
本教程以WordPress为示例,但其中的负载均衡基本思路也适用于其它各类Web应用。
 
先决条件
在进行本教程前,大家应当首先拥有一套具备独立数据库服务器的WordPress站点。
在完成了Web应用与数据库服务器之上的WordPress设置后,大家应该已经拥有两套VPS。考虑到接下来需要频繁用到这两套VPS,因此我们将其分别命名为:
wordpress-1: WordPress Web应用服务器
mysql-1: MySQL服务器
现在大家的环境抽象图所下所示:
在Ubuntu上利用HAProxy作为WordPress应用服务器的4层负载均衡器
除了现有环境,我们在教程中还需要用到其它两套VPS。二者分别命名为:
wordpress-2: 第二WordPress Web应用服务器
haproxy-www: 用于实现负载均衡的HAProxy服务器
 
目标
在教程完成时,我们希望建立起下面这样一套环境:
在Ubuntu上利用HAProxy作为WordPress应用服务器的4层负载均衡器
意味着用户需要通过HAProxy服务器访问WordPress,HAProxy负责将用户以循环负载均衡的方式定向至WordPress应用服务器。最终,用户将借此访问MySQL数据库中的内容。
为现有环境保存快照
可选: 在继续进行之前,我们首先需要为现有环境创建一套快照。快照的作用有二:
1.发生错误时实现工作环境恢复
2.建立一套一次性原始服务器副本,避免再次安装并配置PHP与Nginx
注意:为环境创建快照要求大家暂时关闭VPS。
为wordpress-1与mysql-1 VPS创建快照。
现在我们已经完成了快照创建,接下来进行其它环境构建工作。
 
创建第二Web应用服务器
现在我们需要创建第二VPS,负责同原始Web应用服务器共享负载。具体作法分为以下两种:
1.利用wordpress-1原始VPS快照创建新VPS
2.重新创建新VPS,并以手动方式按照wordpress-1进行软件安装及配置
无论采用哪种方法,请确保在可行时选择Private Networking选项。本教程中的全部VPS推荐使用专有网络。
如果大家无法选用专有网络,则可使用VPS的公共IP地址。请注意,在传输未加密数据库密码等敏感数据时,使用公共IP地址往往不太安全。
 
选项一:利用快照创建新VPS
创建名为wordpress-2的新VPS,使用wordpress-1快照。
如果大家选择这种方法,请直接跳过选项二内容。
 
选项二:重新创建VPS
如果大家打算手动设置wordpress-2,请确保安装与wordpress-1相同的软件。
作为参考,下面列出我们需要安装或者复制的各软件及配置文件:
软件:
MySQL Client
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。除了必要的php文件之外,我们还需要同步已经上传或者安装的文件与插件。本示例将WordPress安装在/var/www/example.com,因此接下来将始终使用此位置。
我们可以通过多种方式实现服务器间的文件同步——NFS或glusterFS都是理想的选择。在这里,我们将使用glusterFS执行同步任务,因为其允许各应用服务器存储自己的应用文件副本,同时保持文件系统的一致性。下面来看目标共享存储的概念示意图:
在Ubuntu上利用HAProxy作为WordPress应用服务器的4层负载均衡器
注意:以下章节会频繁在wordpress-1与wordpress-2服务器之间切换,确保在正确的服务器上运行命令,否则将出现错误!
 
编辑host文件
注意:如果大家拥有内部DNS,而且其已经包含各VPS的专有IP地址记录,则可直接跳过此章节。
否则,在wordpress-1与-2 VPS上运行:
Edit /etc/hosts:
sudo 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服务器软件:
sudo apt-get install glusterfs-server
On wordpress-1上运行以下命令以匹配wordpress-2:
sudo gluster peer probe wordpress-2
在wordpress-2上运行以下命令以匹配wordpress-1:
sudo gluster peer probe wordpress-1
在两套VPS上创建目录,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
Expected Output:volume create: volume1: success: please start the volume to access data
还是在-1 VPS上,运行以下命令以启动刚刚创建的volume1分卷:
sudo gluster volume start volume1
Expected Output: volume start: volume1: success
在-1 VPS中,如果大家希望查看glusterFS分卷相关信息,则:
sudo gluster volume info
可以看到我们拥有两个glusterFS “bricks”,各对应一套WordPress服务器。
现在我们的glusterFS分卷已经开始运行,下面将其作为复制文件系统使用。
 
Mount共享存储
首先在-1 VPS上mount该文件系统。
在-1上编辑fstab文件,从而在引导过程中完成共享文件系统mount:
sudo vi /etc/fstab
在文件末尾添加以下行,旨在将/storage-pool作为mount点:
wordpress-1:/volume1/storage-pool   glusterfs defaults,_netdev 0 0
保存并退出。
在-1上,大家现在已经可以将glusterFS分卷mount至/storage-pool文件系统:
sudo mkdir /storage-pool
sudo mount /storage-pool
以上命令在-1 VPS上mount共享分卷/storage-pool。大家也可以运行df -h以列出当前已经加载的文件系统。接下来,我们以同样的方式在-2 VPS上mount共享存储。
在-2上编辑fstab以在引导中mount该共享文件系统:
sudo vi /etc/fstab
在文件末尾添加以下行,旨在将/storage-pool作为mount点:
wordpress-2:/volume1/storage-pool   glusterfs defaults,_netdev 0 0
在-2上,现在可以将glusterFS分卷mount至/storage-pool文件系统:
sudo mkdir /storage-pool
sudo mount /storage-pool
到这里,/storage-pool文件系统内的一切创建、修改或删除操作都会在两台服务器间同步——即使其中一台服务器暂时离线。
 
将WordPress文件移动至共享存储
下一步是将-1中的WordPress文件移动到共享存储内。请注意根据实际情况替换其中的高亮值。
/var/www/example.com代表WordPress文件的实际位置(以及Nginx在哪里查找这些文件),而example.com本身则为该目录的basename。
在-1上运行以下命令以将WordPress应用文件移动至/storage-pool共享文件系统内:
sudo mv /var/www/example.com /storage-pool/
sudo chown www-data:www-data /storage-pool/example.com
接下来,我们需要创建一项符号链接,负责将WordPress初始存储位置与共享文件系统中的目标文件对接起来:
sudo ln -s /storage-pool/example.com/var/www/example.com
现在我们的WordPress文件已经位于共享文件系统当中,且仍可由Nginx通过初始位置/var/www/example.com进行访问。
 
将新应用服务器指向共享存储
下一步是创建符号链接将新Web应用服务器与共享文件系统上的WordPress文件对接起来。
如果大家使用快照选项创建-2,则在-2上运行以下命令:
sudo rm /var/www/example.com
sudo ln -s /storage-pool/example.com/var/www/example.com
如果大家从头开始创建-2,则运行以下命令:
sudo mkdir -p /var/www
sudo ln -s /storage-pool/example.com/var/www/example.com
这样WordPress应用文件的同步机制就完成了!下面,我们要让新应用服务器-2接入数据库。
 
创建一个新数据库用户
由于MySQL通过用户名与源主机识别用户,因此我们需要创建一个新的wordpressuser以实现由新应用服务器-2到数据库的连接。
在mysql-1数据库VPS上接入MySQL控制台:
mysql -u root -p
在以下MySQL语句中,请注意将高亮部分替换为环境下的实际值:
wordpressuser: MySQL WordPress用户,确保其与现有用户名一致
wordpress_2_private_IP:-2 VPS的专有IP
password: MySQL WordPress用户的密码,确保其与现有密码保持一致
运行以下语句以创建一个能够立足于-2 WordPress服务器实现连接的MySQL用户:
CREATE USER 'wordpressuser'@'wordpress_2_private_IP' IDENTIFIED BY 'password';
请注意将其中的wordpressuser、wordpress_2_private_IP等部分替换为您的实际值。
GRANT SELECT,DELETE,INSERT,UPDATE ON wordpress.* TO 'wordpressuser'@'wordpress_2_private_IP';
FLUSH PRIVILEGES;
现在第二Web应用服务器wordpress-2已经能够登录到mysql-1数据库服务器上的MySQL了。
 
建立负载均衡
请注意,现在两套Web应用服务器都已经开始运行,但应用尚未实现负载均衡。这是因为每套服务器都能够自己的公共IP地址接受访问。我们希望通过同样的URL访问应用程序,并将流量均衡至两台应用服务器上,这时HAProxy就正式出场了。
 
安装HAProxy
创建一套配备专有网络的新VPS,本教程中我们将其命名为haproxy-www。
在我们的haproxy-www VPS中,使用apt-get安装HAProxy:
sudo apt-get update
sudo apt-get install haproxy
我们需要启用HAProxy init脚本,这样HAProxy就会同VPS一起运行及停止。
sudo vi /etc/default/haproxy
将ENABLED的值变更为1以启用该HAProxy init脚本:
ENABLED=1
保存并退出。现在HAProxy将随VPS一同启动与停止。另外,大家也可以使用service命令控制HAProxy——下面来看其是否正在运行:
user@haproxy-www:/etc/init.d$ sudo service haproxy status
haproxy not running.
其尚未运行。很好,因为我们还要进行配置才能加以使用。
 
HAProxy配置
HAProxy的配置文件分为两大组成部分:
1.Global: 设置作用于整个进程的参数
2.Proxies: 由defaults、listen、frontend与backend参数构成
 
HAProxy配置: Global
全部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配置: Proxies
首先添加前端。对于基本的4层负载均衡设置来说,前端会监听特定IP地址及端口上的流量,而后将输入流量定向至特定后端。
在文件末尾添加前端,即www。请确保将haproxy_www_public_IP替换为大家haproxy-www VPS的实际公共IP:
frontend www
bind 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 VPS的实际公共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。“check”选项则定期对服务器执行运行状态检查。
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安装位置:
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也调整完成,大家可以访问wp-admin仪表板查看其运行状态了。
负载均衡完成!
大家的Web应用服务器现在已经拥有了负载均衡机制!用户则能够通过公共IP地址或者负载均衡域名进行访问。
 
总结
现在用户负载被分配到两套WordPress服务器上,另外,如果其中一套应用服务器发生故障,站点仍可由另一服务器负责支撑。
在这套配置中,我们的HAProxy负载均衡服务器为haproxy-www,数据库服务器则为mysql-1。
 
本文永久更新地址:http://www.linuxdiyf.com/linux/30266.html