介绍
在本教程中,我们将教你如何使用HAProxy作为7层负载平衡器,从单个域名或IP地址服务多个应用程序。
Layer 7反向代理和负载平衡适用于您的网站,如果您希望有一个单一的域名,可服务于多个应用程序,因为可以分析HTTP请求,以决定哪个应用程序应该接收流量。
本教程是用WordPress和静态网站作为示例编写的,但其一般概念可以与其他应用程序相似地使用。
前提条件
在继续本教程之前,您应该至少有两个应用程序在单独的服务器上运行。我们将使用在 Nginx 和 WordPress 上托管的静态网站作为我们的两个应用程序。
- wordpress-1 VPS: 如何设置远程数据库以优化网站性能与MySQL
- web-1 VPS: 如何在Ubuntu 14.04上安装Nginx
我们的初始环境是这样的:
除了您的当前环境,我们还将创建以下VPS:
- haproxy-www:您的HAProxy服务器,用于负载平衡和反向代理
- wordpress-2:您的第二个WordPressWeb应用程序服务器(如果您只需要加载环境中的WordPress元件平衡)
- web-2:您的第二个NginxWeb服务器(如果您只需要加载环境中的Nginx元件平衡)
如果您不熟悉基本的负荷平衡概念或术语,例如 layer 7 负荷平衡 或 backends 或 ACLs,这里有一篇文章解释了基本知识: HAProxy 和负荷平衡概念的介绍。
我们的目标
在本教程结束时,我们希望有一个看起来像这样的环境:
也就是说,您的用户将通过 http://example.com 访问您的两个应用程序. 所有以 http://example.com/wordpress 开始的请求将被转发到您的 WordPress 服务器,所有其他请求将被转发到您的基本 Nginx 服务器。 请注意,您不一定需要加载平衡您的应用程序以使它们出现在一个域,但我们将在本教程中涵盖负荷平衡。
<$>[注] 注: DigitalOcean Load Balancers是一个完全管理的,高度可用的负载平衡服务. 如果您在DigitalOcean上运行您的应用程序,则负载平衡器服务可能会在这些类型的配置中取代HAProxy。
安装 HAProxy
创建一个新的VPS与私人网络. 对于本教程,我们将称之为 haproxy-www。
在我们的 haproxy-www VPS 中,让我们用 apt-get 安装 HAProxy:
1sudo apt-get update
2sudo apt-get install haproxy
我们需要启用HAProxy init脚本,因此HAProxy将与您的VPS一起启动和停止。
1sudo vi /etc/default/haproxy
将ENABLED
的值更改为1
,以启用 HAProxy init 脚本:
1ENABLED=1
现在HAProxy将启动和停止您的VPS。 此外,您现在可以使用服务
命令来控制您的HAProxy。
1user@haproxy-www:/etc/init.d$ sudo service haproxy status
2haproxy not running.
它不运行,这很好,因为它需要配置,然后我们可以使用它。
HAProxy 配置
HAProxy 的配置文件分为两个主要部分:
- 全球:设置整个流程的参数
- Proxies:包括 defaults、 listen、 frontend 和 backend 参数
再次,如果你不熟悉HAProxy或基本的负荷平衡概念和术语,请参阅此链接: HAProxy和负荷平衡概念的介绍
HAProxy 配置: 全球
**所有HAProxy配置都应该在您的HAProxy VPS上完成, haproxy-www。
首先,让我们创建一个默认 haproxy.cfg 文件的副本:
1cd /etc/haproxy; sudo cp haproxy.cfg haproxy.cfg.orig
现在在文本编辑器中打开 haproxy.cfg:
1sudo vi /etc/haproxy/haproxy.cfg
您将看到已经定义的两个部分: global 和 defaults. 首先,我们将看看一些默认参数。
在 defaults 中,搜索以下行:
1mode http
2option httplog
选择 http 作为模式将 HAProxy 配置为执行 7 层或应用层负载平衡,这意味着负载平衡器将查看 http 请求的内容,并根据前端定义的规则将其传送到相应的服务器。
不要关闭 config 文件! 接下来我们将添加 proxy 配置。
HAProxy 配置: Proxies
前端配置
我们要添加的第一件事是前端。对于一个基本的7层反向代理和负载平衡设置,我们将想要定义一个ACL,用于将我们的流量导向到相应的后端服务器。在HAProxy中可以使用的ACL有很多,我们将在本教程中只涵盖其中一个(path_beg) - 在HAProxy中找到完整的ACL列表,请查看官方文档: HAProxy ACLs
在文件的末尾,让我们添加我们的前端, www. 请确保用您的 haproxy-www VPS 的 公共 IP代替haproxy_www_public_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
以下是对前端 config 片段中的每个行意味着什么的解释:
- ** 前端 www**:指定一个前端,取名"www",因为我们将用它来处理收到的www.orgs.
- bind haproxy_www_public_IP:80:用haproxy-www的公共IP地址取代`haproxy_www_public_IP'。 这告诉了HAProxy,此前端将处理此IP地址和端口上接通的网络流量
- ** option http-server-close**: 启用服务器上的 HTTP 连接-关闭模式,并保持支持 HTTP 保持在客户端和管道中线的能力. 此选项将允许 HAProxy 以单一连接处理多个客户端请求, 这往往能改善性能
- ** acl url_wordpress path_beg / wordpress** : 指定一个名为_url_wordpress_的ACL, 如果请求的路径以"/wordpress"开头, 则评价为真实的, 例如 http://example.com/wordpress/hello-world
- ** us_backend wordpress** : 引导任何匹配_url_wordpress_ACL到_wordpress-backend_的流量, 我们将很快定义 *** 默认_后端网络后端** : 此指定任何流量不匹配_use-backend_规则的流量将转发给_webbb后端,我们将在下一步定义_KBR1_
后台配置
在您完成配置前端后,请继续添加您的第一个后端,添加以下行。
backend web-backend
server web-1 web_1_private_IP:80 check
以下是对上面的后端配置片段中的每个行意味着什么的解释:
- backend web-backend:指定名为 web-backend
- server web-1... 的后端:指定名为 web-1 的后端服务器,私人 IP (您必须取代) 和它正在收听的端口 80 在这种情况下。
然后添加您的WordPress应用程序的后端:
backend wordpress-backend reqrep ^([^\ :]*)\ /wordpress/(.*) \1\ /\2 server wordpress-1 wordpress_1_private_IP:80 check
以下是对上面的后端配置片段中的每个行意味着什么的解释:
- backend wordpress-backend:指定名为 wordpress-backend
- reqrep...:在将流量转发到WordPress服务器时重写请求 /wordpress 到 / 这不是必要的,如果WordPress应用程序安装在服务器根中,但我们希望它能够通过我们的HAProxy服务器
- 服务器 wordpress-1...:指定名为 _wordpress-1_的后端服务器,私人IP(您必须取代)并且该端口正在收听, _80_在这种情况下。
HAProxy 配置: 统计
如果您想要启用 HAProxy 统计数据,这可能有助于确定 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 配置片段中非微妙的线条的解释:
- listen statistics :1936:配置HAProxy的统计页面可在1936年端访问(即 http://haproxy_www_public_IP:1936 )
- stats scope...:收集指定的前端或后端
- stats uri /:指定统计页面的URI为 /
- stats realm Haproxy\ Statistics:启用统计数据并设置身份验证领域(弹出式身份验证)名称,与 stats auth 选项
- stats auth haproxy:password一起使用:为统计页面指定身份验证凭证。
当您启动 HAProxy 时,统计页面将在您启动 HAProxy 服务后通过 http://haproxy_www_public_ip:1936/ 可用。
启用 HAProxy 记录
在 HAProxy 中启用登录非常简单. 首先,编辑 rsyslog.conf 文件:
1sudo vi /etc/rsyslog.conf
然后找出以下两行,并解除评论以启用UDP syslog接收. 完成后应该看起来如下:
1$ModLoad imudp
2$UDPServerRun 514
3$UDPServerAddress 127.0.0.1
现在重新启动 rsyslog 以启用新的配置:
1sudo 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 以使配置更改生效:
1sudo 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服务器,它具有与原来的配置和内容相同的内容。
您在创建新VPS时有两种选择:
如果你有机会从 web-1 的快照中创建一个新的 VPS,这是创建 web-2 2 的最简单方法。从头开始创建它。安装所有相同的软件,以相同的方式配置,然后使用 rsync 复制您的 Nginx 服务器根的内容,然后从 web-1 复制到 _web-2 (见 Rsync 教程)。
** 注意**:上述两种方法都会一次性地复制您的服务器根内容. 如果您更新您的服务器节点中的任何一个文件, web-1 或 web-2,请确保您重新同步文件。
设置相同的 Web 服务器后,在 HAProxy 配置中将其添加到 web-backend。
在 haproxy-www**上,编辑 haproxy.cfg:
1sudo 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 以使您的更改生效:
1sudo service haproxy reload
现在你的 web-backend 有两个服务器处理你的所有非WordPress流量! 它是负荷平衡!`
加载平衡 wordpress-1
像WordPress这样的应用程序的负载平衡比静态网页服务器的负载平衡稍微复杂一些,因为你必须担心上传文件和额外的数据库用户的同步等事情。
创建另一个相同的WordPress服务器所需的所有步骤都描述在另一个负载平衡教程中: 如何使用HAProxy作为WordPress的4层负载平衡器。
一旦你到达称为 Not Yet Load Balanced的部分,就停止。
一旦您创建了 wordpress-2 并正确设置了您的数据库,您只需在 HAProxy 配置中将其添加到您的 wordpress-backend。
在 haproxy-www**上,编辑 haproxy.cfg:
1sudo 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 以使您的更改生效:
1sudo service haproxy reload
现在您的 wordpress-backend 有两个服务器处理您的所有WordPress流量! 负荷均衡!
结论
现在你已经完成了这个教程,你应该能够扩展反向代理和负载平衡概念,将更多的应用程序和服务器添加到你的环境,使其更好地匹配你的需求。
此外,如果你正在寻找另一种方法来提高你的WordPress实例的性能,你可能想看看MySQL复制。
- [如何在Ubuntu 14.04上使用MySQL复制优化WordPress性能]