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

提供:ZStack云计算

系列教程

本教程为利用HAProxy实现WordPress负载均衡系列四篇中的第二篇。

内容介绍

在本教程中,我们将探讨如何利用HAProxy作为4层负载均衡器以支持WordPress服务器——特别是其Web应用层。对应用服务器进行负载均衡相当于在设置中引入冗余机制,其能够提升服务器在发生故障或者遭遇网络问题时的可靠性,同时将负载分配至多台服务器上以提升读取性能。这里,我们假定大家的设置当中已经包含一套接入至独立MySQL数据库服务器的WordPress应用服务器(具体设置方法详见先决条件部分)。

4层负载均衡机制适用于仅在服务器上运行单一Web应用的情况。如果大家的环境较为复杂(例如希望在不同服务器上分别运行WordPress及静态Web服务器,且二者使用同一入口点),则应考虑使用应用层(即7层)负载均衡机制。

本教程以WordPress为示例,但其中的负载均衡基本思路也适用于其它各类Web应用。

先决条件

在进行本教程前,大家应当首先拥有一套具备独立数据库服务器的WordPress站点,具体可参阅如何利用MySQL设置远程数据库以优化站点性能

在完成了Web应用与数据库服务器之上的WordPress设置后,大家应该已经拥有两套VPS。考虑到接下来需要频繁用到这两套VPS,因此我们将其分别命名为:

  • wordpress-1: WordPress Web应用服务器
  • mysql-1: MySQL服务器

现在大家的环境抽象图所下所示:

除了现有环境,我们在教程中还需要用到其它两套VPS。二者分别命名为:

  • wordpress-2: 第二WordPress Web应用服务器
  • haproxy-www: 用于实现负载均衡的HAProxy服务器

如果大家对于负载均衡中的部分基础概念或术语不太熟悉,请参阅HAProxy与负载均衡概念介绍

目标

在教程完成时,我们希望建立起下面这样一套环境:

意味着用户需要通过HAProxy服务器访问WordPress,HAProxy负责将用户以循环负载均衡的方式定向至WordPress应用服务器。最终,用户将借此访问MySQL数据库中的内容。

为现有环境保存快照

可选: 在继续进行之前,我们首先需要为现有环境创建一套快照。快照的作用有二:

  1. 发生错误时实现工作环境恢复
  2. 建立一套一次性原始服务器副本,避免再次安装并配置PHP与Nginx

注意:为环境创建快照要求大家暂时关闭VPS。

wordpress-1mysql-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相同的软件。具体参阅设置Web服务器内容。

作为参考,下面列出我们需要安装或者复制的各软件及配置文件:

软件:

  • 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执行同步任务,因为其允许各应用服务器存储自己的应用文件副本,同时保持文件系统的一致性。下面来看目标共享存储的概念示意图:

如果大家对glusterFS不太熟悉,请参阅相关教程

注意:以下章节会频繁在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-1wordpress-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的配置文件分为两大组成部分:

  • Global: 设置作用于整个进程的参数
  • Proxies: 由defaults、listen、frontend与backend参数构成

如果大家对于HAProxy或负载均衡基础概念及术语不太熟悉,请参阅HAProxy与负载均衡概念介绍

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介绍一文。

先不要关闭配置文件,接下来我们需要添加代理配置内容。

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。

本文来源自DigitalOcean Community。英文原文:How To Use HAProxy As A Layer 4 Load Balancer for WordPress Application Servers on Ubuntu 14.04 By Mitchell Anicas

翻译:diradw

猜你喜欢

转载自blog.csdn.net/zstack_org/article/details/70595152
今日推荐