内容简介:
在本教程中,我们将了解如何利用HAProxy作为7层负载均衡器,用以支撑来自单一域名或者IP地址的多应用程序。负载均衡机制能够显著改进性能表现、可用性以及业务环境的弹性水平。
7层反射代理与负载均衡适用于单一域名支撑多应用程序的业务环境,其中的http请求将经过分析以决定由哪款应用程序接收相关流量。
本教程将以WordPress以及一套静态网站作为示例,但其基本概念也同样适用于其它应用程序。
先决条件
在推进教程内容之前,大家首先应当在独立服务器上运行至少两款应用程序。我们将使用一套由Nginx与WordPress托管的静态网站作为示例内容。如果大家希望严格遵循教程步骤,则可参阅以下指南以设置必要环境:
- wordpress-1 VPS: [如何利用MySQL设置远程数据库以优化站点性能](https://www.digitalocean.com/community/articles/how-to-set-up-a-remote-database-to-optimize-site-performance-with-mysql)
- web-1 VPS: [如何在Ubuntu 14.04上安装Nginx](https://www.digitalocean.com/community/articles/how-to-install-nginx-on-ubuntu-14-04-lts)
我们的起始环境应如下所示:
除了现有环境,我们还需要创建以下VPS(即虚拟专有服务器):
- haproxy-www: 我们的HAProxy服务器,用于负载均衡与反向代理
- wordpress-2: 我们的第二套WordPress Web应用服务器(如果大家需要对环境中的WordPress组件进行负载均衡的话)
- web-2: 我们的第二套Nginx Web服务器(如果大家需要对环境中的Nginx组件进行负载均衡的话)
如果大家对基础负载均衡概念或者术语不太熟悉,例如_7层负载均衡_ 或者_后端_或者_ACL_,可参阅[HAProxy与负载均衡概念简介](
https://www.digitalocean.com/community/articles/an-introduction-to-haproxy-and-load-balancing-concepts)进行了解。
学习目标
我们希望通过本篇教程构建起如下所示之环境:
这意味着我们的用户将能够通过_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: 由_defaults_、_listen_、_frontend_以及_backend_参数构成
再次强调,如果大家对基础负载均衡概念或者术语不太熟悉,例如_7层负载均衡_ 或者_后端_或者_ACL_,可参阅[HAProxy与负载均衡概念简介](https://www.digitalocean.com/community/articles/an-introduction-to-haproxy-and-load-balancing-concepts)进行了解。
>>>>
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作为HAProxy配置模式以执行7层,或者说应用层,负载均衡。这意味着该负载均衡器将着眼于http请求内容并根据frontend中的规则定义将其转发至正确的服务器处。如果大家对这一概念不太熟悉,请参阅[HAProxy简介](https://www.digitalocean.com/community/articles/an-introduction-to-haproxy-and-load-balancing-concepts#TypesofLoadBalancing)中的_负载均衡类型_章节。
先别急着关掉此配置文件,接下来我们还要向其中添加proxy配置。
>>>>
HAProxy配置: Proxy
>>>>
Frontend配置
我们首先要添加的就是frontend。在一套基础性7层反向代理与负载均衡设置方案中,我们需要定义用于将流量指向至正确后端服务器的ACL。我们可以在HAProxy中使用多种ACL,而这里仅使用其中一种(_path_beg_)——欲了解HAProxy中的完整ACL列表,请参阅官方说明文档:[HAProxy ACL](http://cbonte.github.io/haproxy-dconv/configuration-1.4.html#7.5.3)
在文件结尾,我们需要添加自己的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对流量进行转发的具体规则:
- http://example.com/wordpress: 任何以_/wordpress_开头的请求将被发送至_wordpress-backend_ (由_wordpress-1_服务器构成)
- http://example.com/: 任何其它请求将被发送至_web-backend_ (由_web-1_服务器构成)
到这里,我们已经实现了利用单一域名托管多款应用程序!接下来一起来看如何实现应用程序的负载均衡。
如何添加负载均衡机制
>>>>
对web-1进行负载均衡
要对一套基础Web服务器进行负载均衡,我们需要创建一套新的Web服务器,其配置与内容与初始服务器完全相同。我们将这套新服务器称为web-2。
我们可以通过以下两种方式创建这套新VPS:
1. 如果大家可以利用_web-1_快照创建新VPS,那么这也是最为便捷的_web-2_创建方式
2. 从零开始进行创建。安装全部软件,依原样配置,而后利用rsync将Nginx服务器root目录的内容从_web-1_复制到_web-2_(可参阅[Rsync使用教程](https://www.digitalocean.com/community/articles/how-to-use-rsync-to-sync-local-and-remote-directories-on-a-vps))。
注意:这两种方式都会对服务器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层负载均衡器](https://www.digitalocean.com/community/articles/how-to-use-haproxy-as-a-layer-4-load-balancer-for-wordpress-application-servers-on-ubuntu-14-04)一文。遵循该教程中的三个步骤,我们将顺利创建出第二套WordPress服务器,_wordpress-2_:
1. [创建第二套Web应用服务器](https://www.digitalocean.com/community/articles/how-to-use-haproxy-as-a-layer-4-load-balancer-for-wordpress-application-servers-on-ubuntu-14-04#CreateYourSecondWebApplicationServer)
2. [同步Web应用文件](https://www.digitalocean.com/community/articles/how-to-use-haproxy-as-a-layer-4-load-balancer-for-wordpress-application-servers-on-ubuntu-14-04#SynchronizeWebApplicationFiles)
3. [创建一个新数据库用户](https://www.digitalocean.com/community/articles/how-to-use-haproxy-as-a-layer-4-load-balancer-for-wordpress-application-servers-on-ubuntu-14-04#CreateaNewDatabaseUser)
在_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流量了!负载均衡就此实现!
关于ZStack
上海云轴信息科技有限公司成立于2015年,2017年获得阿里云巨额投资,公司总部设立在上海,在硅谷和成都设有分支机构,目前和阿里云达成战略合作,未来提供高度产品化的专有云和混合云产品。
上海云轴发起并维护着下一代开源云计算引擎ZStack,ZStack是全新的下一代IaaS软件,设计目标就是能够打造一款标准化的专有云产品,让海量的企业数据中心变身成为专有云。使用ZStack 产品搭建专有云生产环境的企业遍布金融,电信,电商,互联网,游戏,教育,汽车,纺织等行业。ZStack企业版是上海云轴公司在深入调研各行业对专有云的需求后,基于ZStack精心打磨的轻量级云管理平台,也是全球首款针对“虚拟化+”场景的产品级云平台。上海云轴将会持续帮助中国的企业转型“互联网+”,推出更加优秀的云计算产品。
上海云轴拥有一群追求卓越和价值的伙伴,核心团队来自硅谷、英特尔、微软、思科和阿里巴巴等优秀企业。公司崇尚多元企业文化,既有欧美优秀企业宽松的氛围,又兼具全球顶尖科技企业自由、创新的理念。
更多关于ZStack公司及最新产品信息,请访问: http://zstack.io