提供:ZStack云计算

系列教程

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

内容简介

在本教程中,我们将了解如何利用HAProxy作为7层负载均衡器,用以支撑来自单一域名或者IP地址的多应用程序。负载均衡机制能够显著改进性能表现、可用性以及业务环境的弹性水平。

7层反射代理与负载均衡适用于单一域名支撑多应用程序的业务环境,其中的http请求将经过分析以决定由哪款应用程序接收相关流量。

本教程将以WordPress以及一套静态网站作为示例,但其基本概念也同样适用于其它应用程序。

先决条件

在推进教程内容之前,大家首先应当在独立服务器上运行至少两款应用程序。我们将使用一套由Nginx与WordPress托管的静态网站作为示例内容。如果大家希望严格遵循教程步骤,则可参阅以下指南以设置必要环境:

我们的起始环境应如下所示:

除了现有环境,我们还需要创建以下VPS(即虚拟专有服务器):

  • haproxy-www: 我们的HAProxy服务器,用于负载均衡与反向代理
  • wordpress-2: 我们的第二套WordPress Web应用服务器(如果大家需要对环境中的WordPress组件进行负载均衡的话)
  • web-2: 我们的第二套Nginx Web服务器(如果大家需要对环境中的Nginx组件进行负载均衡的话)

如果大家对基础负载均衡概念或者术语不太熟悉,例如7层负载均衡 或者后端或者ACL,可参阅HAProxy与负载均衡概念简介进行了解。

学习目标

我们希望通过本篇教程构建起如下所示之环境:

这意味着我们的用户将能够通过http://example.com访问两款应用程序。全部以http://example.com/wordpress开头的请求都将被转发至WordPress服务器,而其它请求则将被转发至我们的基础Nginx服务器。请注意,并不是说必须对应用程序进行负载均衡才能使其体现在同一域名之上,但本教程仍将对这种常见需求的实现方法进行阐述。

安装HAProxy

利用Private Networking创建一套新的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一同启动及停止。另外,大家也可以利用servicecommand控制自己的HAProxy。下面让我们检查其是否正在运行:

user@haproxy-www:/etc/init.d$ sudo service haproxy status
haproxy not running.

其并未运行。很好,因为我们需要进行配置才能加以使用。下面开始为整套环境配置HAProxy。

HAProxy配置

HAProxy的配置文件分为两大主要部分:

  • Global: 设定各项进程参数
  • Proxies: 由defaultslistenfrontend以及backend参数构成

再次强调,如果大家对基础负载均衡概念或者术语不太熟悉,例如7层负载均衡 或者后端或者ACL,可参阅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

可以看到,其中已经有两部分被定义完成:globaldefaults。现在让我们看看其默认参数。

defaults当中,可以看到以下行:

mode    http
option  httplog

选择http作为HAProxy配置模式以执行7层,或者说应用层,负载均衡。这意味着该负载均衡器将着眼于http请求内容并根据frontend中的规则定义将其转发至正确的服务器处。如果大家对这一概念不太熟悉,请参阅HAProxy简介中的负载均衡类型章节。

先别急着关掉此配置文件,接下来我们还要向其中添加proxy配置。

HAProxy配置: Proxy

Frontend配置

我们首先要添加的就是frontend。在一套基础性7层反向代理与负载均衡设置方案中,我们需要定义用于将流量指向至正确后端服务器的ACL。我们可以在HAProxy中使用多种ACL,而这里仅使用其中一种(path_beg)——欲了解HAProxy中的完整ACL列表,请参阅官方说明文档:HAProxy ACL

在文件结尾,我们需要添加自己的frontend,即www。请确保将其中的haproxy_www_public_IP替换为我们VPS的公共IP:

frontend www
bind haproxy_www_public_IP:80
option http-server-close
acl url_wordpress path_beg /wordpress
use_backend wordpress-backend if url_wordpress
default_backend web-backend

下面来看以上frontend配置片段中各行内容的含义:

  • frontend www: 指定一个名为“www”的frontend,我们将利用其处理输入的www流量
  • bind haproxy_www_public_IP:80: 利用haproxy-www的公共IP地址替换haproxy_www_public_IP。这样HAProxy将利用此frontend处理来自该IP地址及端口的输入网络流量。
  • option http-server-close: 在服务器上启用HTTP连接关闭模式,同时在客户端上维持对HTTP keep-alive及pipelining的支持能力。此选项将允许HAProxy利用单一连接处理多条客户端请求,从而实现性能提升
  • acl url_wordpress path_beg /wordpress: 指定名为url_wordpress的ACL,其将在请求路径以”/wordpress”开头时被判断为true,例如http://example.com/wordpress/hello-world
  • use_backend wordpress-backend if url_wordpress: 将任何符合url_wordpress ACL的流量定向至wordpress-backend,我们将在稍后对其进行定义
  • default_backend web-backend: 指定将任何不符合use_backend规则的流量转发至web-backend,我们将在稍后对其进行定义
Backend配置

在完成了对frontend的配置后,接下来我们通过以下命令添加首个backend。请确保将其中的高亮部分替换为正确的值:

backend web-backend
server web-1 web_1_private_IP:80 check

以下为上述各行的具体含义:

  • backend web-backend: 指定一个名为web-backend的backend
  • server web-1 …: 指定一套名为web-1的后端服务器,该专有IP(请注意替换)与端口都将接收监听,本示例中使用的为80。而check选项则保证此负载均衡器将定期对服务器执行运行状态检查

而后为我们的WordPress应用程序添加该backend:

backend wordpress-backend
reqrep ^([^\ :]*)\ /wordpress/(.*) \1\ /\2
server wordpress-1 wordpress_1_private_IP:80 check

以下为各行内容的具体含义:

  • backend wordpress-backend: 指定一个名为wordpress-backend的后端
  • reqrep …: 在将流量转发至此WordPress服务器时,将请求重写为/wordpress to/。如果大家将WordPress应用安装在该服务器的root目录下则不需要此步骤,不过在本示例中我们需要保证其可通过HAProxy服务器上的/wordpress进行访问
  • server wordpress-1 …: 指定一套名为wordpress-1的后端服务器,该专有IP(请注意替换)与端口都将接收监听,本示例中使用的为80。而check选项则保证此负载均衡器将定期对服务器执行运行状态检查

HAProxy配置: Stats

如果大家需要启用HAProxy stats以检测HAProxy如何处理输出流量,则可将以下行添加至配置文件当中:

listen stats :1936
stats enable   
stats scope www
stats scope web-backend
stats scope wordpress-backend
stats uri /
stats realm Haproxy\ Statistics
stats auth user:password

下面来看以上各行的具体含义:

  • listen stats :1936: 配置HAProxy的stats页面以通过端口1936进行访问(例如:http://haproxy_www_public_IP:1936
  • stats scope …: 收集特定frontend或者backend的stats
  • stats uri /: 将该stats页岩的URI指定为/
  • stats realm Haproxy\ Statistics: 启用统计机制并设定身份验证框(弹出验证)名称,同stats auth选项配合使用
  • stats auth haproxy:password: 为此stats页面指定身份凭证,可按需求变更用户名与密码

现在保存并退出。在启动HAProxy后,此stats页面将可通过http://haproxy_www_public_ip:1936/进行访问。HAProxy现在已经准备就绪,但我们还需要启用登录机制。

启用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登录机制已经启用完成!在HAProxy启动之后,日志文件将被创建为/var/log/haproxy.log。

更新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仪表板,其将开始发挥作用。

启动HAProxy

在haproxy-www上启动HAProxy令各配置变更生效:

sudo service haproxy restart

反向代理完成

现在我们的应用程序已经能够通过7层反向代理经由同一example.com域名进行访问,不过目前其尚未经过负载均衡。此时我们的环境如下图所示:

根据我们此前在frontend中进行的定义,以下为我们对于HAProxy对流量进行转发的具体规则:

到这里,我们已经实现了利用单一域名托管多款应用程序!接下来一起来看如何实现应用程序的负载均衡。

如何添加负载均衡机制

对web-1进行负载均衡

要对一套基础Web服务器进行负载均衡,我们需要创建一套新的Web服务器,其配置与内容与初始服务器完全相同。我们将这套新服务器称为web-2。

我们可以通过以下两种方式创建这套新VPS:

  1. 如果大家可以利用web-1快照创建新VPS,那么这也是最为便捷的web-2创建方式
  2. 从零开始进行创建。安装全部软件,依原样配置,而后利用rsync将Nginx服务器root目录的内容从web-1复制到web-2(可参阅Rsync使用教程)。

注意:这两种方式都会对服务器root目录内容进行一次复制。如果我们对任一服务器节点中的文件进行了更新,请确保再次执行同步。

在第二套Web服务器设置完成后,将其添加至HAProxy配置中的web-backend当中。

在haproxy-www上编辑haproxy.cfg文件:

sudo vi /etc/haproxy/haproxy.cfg

找到该配置中的web-backend部分:

backend web-backend
server web-1 web_1_private_IP:80 check

在下一行中添加web-2服务器:

server web-2 web_2_private_IP:80 check

保存并退出。现在重载HAProxy并启用各项变更:

sudo service haproxy reload

现在我们的已经可以利用两套服务器处理全部非WordPress流量了!负载均衡就此实现!

对wordpress-1进行负载均衡

对WordPress这样的应用进行负载均衡在复杂程度上要略高于静态Web服务器,这是因为我们需要考虑上传文件同步以及其他数据库用户等情况。

关于创建新WordPress服务器的工作可参阅如何利用HAProxy作为WordPress的4层负载均衡器一文。遵循该教程中的三个步骤,我们将顺利创建出第二套WordPress服务器,wordpress-2

  1. 创建第二套Web应用服务器
  2. 同步Web应用文件
  3. 创建一个新数据库用户

wordpress-2创建完成后,我们已经正确设置了自己的数据库,接下来要做的就是将其添加至HAProxy配置中的wordpress-backend当中。

在haproxy-www当中编辑haproxy.cfg文件:

sudo vi /etc/haproxy/haproxy.cfg

找到配置文件中的wordpress-backend部分:

backend wordpress-backend
server wordpress-1 wordpress_1_private_IP:80 check

在下一行中添加wordpress-2服务器:

server wordpress-2 wordpress_2_private_IP:80 check

保存并退出。现在重载HAProxy以启用各项变更:

sudo service haproxy reload

现在我们的wordpress-backend已经拥有两套服务器来处理全部WordPress流量了!负载均衡就此实现!

总结

现在我们已经完成了今天的教程,大家应该能够将反向代理与负载均衡概念应用在业务环境中的更多应用及服务器当中,从而更好地满足实际需求。请记住,环境的配置方式多种多样,大家可以认真阅读HAProxy配置手册以解决更为复杂的难题。

本文来源自DigitalOcean Community。英文原文:How To Use HAProxy As A Layer 7 Load Balancer For WordPress and Nginx On Ubuntu 14.04 By Mitchell Anicas

翻译:diradw

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐