如何在Ubuntu14.04上使用HAProxy作为WordPress和Nginx的第7层负载均衡器
介绍
在本教程中,我们将教您如何使用 HAProxy 作为第 7 层负载均衡器,以从单个域名或 IP 地址为多个应用程序提供服务。 负载平衡可以提高环境的性能、可用性和弹性。
如果您想拥有一个服务于多个应用程序的域名,第 7 层反向代理和负载平衡适合您的站点,因为可以分析 http 请求以确定哪个应用程序应该接收流量。
本教程是以 WordPress 和一个静态网站为例编写的,但它的一般概念可以与其他应用程序一起使用,以达到类似的效果。
先决条件
在继续本教程之前,您应该至少有两个应用程序在不同的服务器上运行。 我们将使用托管在 Nginx 和 WordPress 上的静态网站作为我们的两个应用程序。 如果您想完全按照本教程进行操作,以下是我们用于设置先决条件环境的教程:
- wordpress-1 VPS: 如何设置远程数据库以使用 MySQL 优化站点性能
- web-1 VPS: 如何在 Ubuntu 14.04 上安装 Nginx
我们的启动环境如下所示:
除了您当前的环境,我们还将创建以下 VPS:
- haproxy-www:您的 HAProxy 服务器,用于负载平衡和反向代理
- wordpress-2:您的第二个 WordPress Web 应用程序服务器(仅当您想要对环境的 WordPress 组件进行负载平衡时才需要)
- web-2:您的第二个 Nginx Web 服务器(仅当您想要对环境的 Nginx 组件进行负载平衡时才需要)
如果您不熟悉基本的负载平衡概念或术语,例如 layer 7 负载平衡 或 backends 或 ACLs,这里有一篇解释基础知识的文章: HAProxy 和负载平衡概念简介。
我们的目标
在本教程结束时,我们希望有一个如下所示的环境:
也就是说,您的用户将通过 http://example.com 访问您的两个应用程序。 所有以 http://example.com/wordpress 开头的请求都将被转发到您的 WordPress 服务器,所有其他请求都将被转发到您的基本 Nginx 服务器。 请注意,您不一定需要对应用程序进行负载平衡以使它们出现在单个域中,但我们将在本教程中介绍负载平衡。
笔记: DigitalOcean 负载均衡器 are a fully-managed, highly available load balancing service. If you are running your application on DigitalOcean, the Load Balancer service may be able to replace HAProxy in these types of configurations. To try this out, follow our 从第 2 步开始设置负载均衡器的指南 instead of setting up HAProxy.
安装 HAProxy
使用专用网络创建一个新的 VPS。 对于本教程,我们将其称为 haproxy-www。
在我们的 haproxy-www VPS 中,让我们使用 apt-get 安装 HAProxy:
sudo apt-get update sudo apt-get install haproxy
我们需要启用 HAProxy 初始化脚本,以便 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 的配置文件分为两个主要部分:
- Global:设置进程范围的参数
- Proxies:由defaults、listen、frontend和backend参数组成
同样,如果您对 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
您会看到已经定义了两个部分:global 和 defaults。 首先我们来看看一些默认参数。
在 defaults 下,查找以下行:
mode http option httplog
选择 http 作为模式将 HAProxy 配置为执行第 7 层或应用层负载平衡。 这意味着负载均衡器将查看 http 请求的内容,并根据前端定义的规则将其转发到适当的服务器。 如果您不熟悉这个概念,请阅读我们的 HAProxy 简介 中的 负载平衡类型 部分。
暂时不要关闭配置文件! 接下来我们将添加代理配置。
HAProxy 配置:代理
前端配置
我们要添加的第一件事是前端。 对于基本的第 7 层反向代理和负载平衡设置,我们需要定义一个 ACL,用于将我们的流量定向到适当的后端服务器。 HAProxy 中可以使用的 ACL 有很多,本教程只介绍其中一个(path_beg)——HAProxy 中 ACL 的完整列表,请查看官方文档: HAProxy ACL
在文件的最后,让我们添加我们的前端,www。 请务必将 haproxy_www_public_IP
替换为您的 haproxy-www VPS 的 公网 IP:
前端 www 绑定haproxy_www_public_IP :80 选项 http-server-close acl url_wordpress path_beg /wordpress use_backend wordpress-backend if url_wordpress default_backend web-backend
以下是对上述前端配置片段中每一行含义的解释:
- frontend www:指定一个名为“www”的前端,因为我们将使用它来处理传入的www流量
- bind haproxy_www_public_IP:80:将
haproxy_www_public_IP
替换为haproxy-www的公网IP地址。 这告诉 HAProxy 这个前端将处理这个 IP 地址和端口上的传入网络流量 - option http-server-close:在服务器上启用HTTP连接关闭模式,并保持在客户端支持HTTP keep-alive和流水线的能力。 此选项将允许 HAProxy 使用单个连接处理多个客户端请求,这通常会提高性能
- acl url_wordpress path_beg /wordpress:指定一个名为 url_wordpress 的 ACL,如果请求的路径以“/wordpress”开头,则评估为真,例如 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,我们将在接下来定义步
后端配置
完成前端配置后,通过添加以下行继续添加您的第一个后端。 请务必将突出显示的单词替换为适当的值:
后端网络后端服务器 web-1 web_1_private_IP :80 检查
以下是对上述后端配置片段中每一行含义的解释:
- backend web-backend:指定一个名为web-backend的后端
- server web-1 …:指定一个名为 web-1 的后端服务器、私有 IP(您必须替换)和它正在侦听的端口,80[X157X ] 在这种情况下。 check 选项使负载均衡器定期在此服务器上执行健康检查
然后为您的 WordPress 应用程序添加后端:
后端 wordpress-后端 reqrep ^([^\ :] )\/ wordpress /(. ) \1\ /\2 服务器 wordpress-1 wordpress_1_private_IP :80 检查
以下是对上述后端配置片段中每一行含义的解释:
- backend wordpress-backend:指定一个名为wordpress-backend的后端
- reqrep …:将流量转发到 WordPress 服务器时,将对 /wordpress 的请求重写为 /。 如果 WordPress 应用程序安装在服务器根目录中,则这不是必需的,但我们希望它可以通过 HAProxy 服务器上的 /wordpress 访问
- server wordpress-1 …:指定一个名为 wordpress-1 的后端服务器、私有 IP(您必须替换它)和它正在侦听的端口,80[X169X ] 在这种情况下。 check 选项使负载均衡器定期在此服务器上执行健康检查
HAProxy 配置:统计
如果您想启用 HAProxy 统计信息,这对于确定 HAProxy 如何处理传入流量很有用,您需要将以下内容添加到您的配置中:
听统计:1936 统计启用 stats scope www stats scope web-backend stats scope wordpress-backend stats uri / stats realm Haproxy\ Statistics stats auth user : password
这是上面 listen stats 配置片段中重要行的解释:
- listen stats :1936:配置HAProxy的统计页面可以在1936端口访问(即 http://haproxy_www_public_IP:1936 )
- stats scope ...:收集指定前端或后端的统计信息
- stats uri /:指定stats页面的URI为/
- stats realm Haproxy\ Statistics:启用统计并设置认证领域(弹窗认证)名称,与stats auth选项配合使用
- stats auth haproxy:password:指定统计页面的身份验证凭据。 将用户名和密码更改为您自己的
现在保存并退出。 当您启动 HAProxy 时,一旦您启动 HAProxy 服务,就会通过 http://haproxy_www_public_ip:1936/ 访问统计页面。 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
创建。
更新 WordPress 配置
现在您的 WordPress 应用程序的 URL 已更改,我们必须更新 WordPress 中的一些设置。
在任一 WordPress 服务器 上,编辑您的 wp-config.php。 它位于您安装 WordPress 的位置(在本教程中,它安装在 /var/www/example.com 但您的安装可能会有所不同):
cd /var/www/example.com ; 须藤 vi wp-config.php
找到顶部附近显示 define('DB_NAME', 'wordpress');
的行,并在其上方添加以下行,替换突出显示的值:
定义('WP_SITEURL',' http://haproxy_www_public_IP '); 定义('WP_HOME',' http://haproxy_www_public_IP ');
保存并退出。 现在,WordPress URL 已配置为指向您的负载均衡器,而不仅仅是您的原始 WordPress 服务器,当您尝试访问 wp-admin 仪表板时,它会发挥作用。
启动 HAProxy
在 haproxy-www 上,启动 HAProxy 以使您的配置更改生效:
sudo service haproxy restart
反向代理完成
现在您的应用程序可以通过同一个域 example.com 访问,通过第 7 层反向代理,但它们还没有负载平衡。 您的环境应如下图所示:
根据我们之前定义的前端,这里是 HAProxy 将如何转发您的流量的描述:
- http://example.com/wordpress:任何以 /wordpress 开头的请求都将被发送到 wordpress-backend(由您的 wordpress-1 服务器)
- http://example.com/:任何其他请求都将发送到 web-backend(由您的 web-1 服务器组成)
如果您只想在一个域上托管多个应用程序,那么您就完成了! 如果您想对应用程序进行负载平衡,则需要继续阅读。
如何添加负载平衡
负载平衡 web-1
要对基本 Web 服务器进行负载平衡,您需要做的就是创建一个新的 Web 服务器,其配置和内容与您的原始服务器相同。 我们将这个新服务器命名为:web-2。
创建新 VPS 时有两种选择:
- 如果您可以选择从 web-1 的快照创建新 VPS,这是创建 web-2 的最简单方法
- 从头开始创建它。 安装所有相同的软件,进行相同的配置,然后使用 rsync 将 Nginx 服务器根目录的内容从 web-1 复制到 web-2(参见 Rsync 教程 [X179X ])。
注意:上述两种方法都会一次性复制您的服务器根目录内容。 如果您在其中一个服务器节点 web-1 或 web-2 上更新任何文件,请确保再次同步文件。
设置相同的 Web 服务器后,将其添加到 HAProxy 配置中的 web-backend。
在 haproxy-www 上,编辑 haproxy.cfg:
sudo vi /etc/haproxy/haproxy.cfg
找到配置的 web-backend 部分:
后端网络后端服务器 web-1 web_1_private_IP :80 检查
然后在下一行添加您的 web-2 服务器:
服务器 web-2 web_2_private_IP :80 检查
保存并退出。 现在重新加载 HAProxy 以使您的更改生效:
sudo service haproxy reload
现在你的 web-backend 有两台服务器来处理你所有的非 WordPress 流量! 它是负载平衡的!`
负载平衡 wordpress-1
对 WordPress 等应用程序进行负载平衡比对静态 Web 服务器进行负载平衡稍微复杂一些,因为您必须担心诸如同步上传文件和其他数据库用户之类的事情。
在另一个负载平衡教程中描述了创建额外的相同 WordPress 服务器所需的所有步骤:如何使用 HAProxy 作为 WordPress 的第 4 层负载平衡器。 完成该教程中的以下三个步骤以创建您的第二个 WordPress 服务器 wordpress-2:
到达名为 Not Yet Load Balanced 的部分后停止。
创建 wordpress-2 并正确设置数据库后,您只需将其添加到 HAProxy 配置中的 wordpress-backend 即可。
在 haproxy-www 上,编辑 haproxy.cfg:
sudo vi /etc/haproxy/haproxy.cfg
找到配置的 wordpress-backend 部分:
后端 wordpress-后端服务器 wordpress-1 wordpress_1_private_IP :80 检查
然后在下一行添加您的 wordpress-2 服务器:
服务器 wordpress-2 wordpress_2_private_IP :80 检查
保存并退出。 现在重新加载 HAProxy 以使您的更改生效:
sudo service haproxy reload
现在你的 wordpress-backend 有两台服务器来处理你所有的 WordPress 流量! 它是负载均衡的!
结论
现在您已经完成了本教程,您应该能够扩展反向代理和负载平衡概念,以向您的环境添加更多应用程序和服务器,使其更好地满足您的需求。 请记住,配置环境的方法是无限的,如果您有更复杂的要求,可能需要深入研究 HAProxy 配置手册。
此外,如果您正在寻找另一种方法来提高 WordPress 实例的性能,您可能需要研究 MySQL 复制。 查看本教程,该教程描述了如何使用 WordPress 进行设置: