如何在 CentOS 8 上将 HAProxy 设置为 Nginx 的负载均衡器
为了确保 Web 应用程序的最大可用性、可扩展性和高性能,现在通常会实施引入冗余的技术,例如服务器集群和负载平衡。例如,设置一个运行相同应用程序的服务器集群,然后在它们前面部署负载平衡器来分配流量。
HAProxy是一款开源、功能强大、高性能、可靠、安全且广泛使用的高可用性TCP/HTTP负载均衡器、代理服务器和 SSL/TLS 终止器,专为高流量网站构建。它可在Linux、Solaris、FreeBSD、OpenBSD以及 AIX 操作系统上可靠运行。
本指南介绍如何在CentOS 8上使用HAProxy设置专用的高可用性负载均衡器,以控制NGINX Web 服务器集群中的流量。它还演示了如何在HAProxy中配置SSL/TLS终止。
先决条件:
总共 4 台服务器,最少安装 CentOS 8。
测试环境设置
----------- HAProxy Server Setup ----------- HA Proxy Server - hostname: haproxy-server.example.lan; IP: 10.42.0.247 Test Site Domain: www.example.lan ----------- Client Web Servers Setup ----------- Web Server #1 - hostname: websrv1.example.lan; IP: 10.42.0.200 Web Server #2 - hostname: websrv2.example.lan; IP: 10.42.0.21 Web Server #3 - hostname: websrv3.example.lan; IP: 10.42.0.34
步骤1:在客户端计算机上设置Nginx HTTP服务器
1.登录所有CentOS 8客户端计算机并使用dnf 包管理器安装Nginx Web 服务器,如图所示。
# dnf install Nginx
2.接下来,启动Nginx服务,现在,使其在系统启动时自动启动,并通过检查其状态来确认它已启动并正在运行,使用systemctl 命令(在所有客户端计算机上执行此操作)。
# systemctl start nginx # systemctl enable nginx # systemctl status nginx
3.此外,如果所有客户端计算机上都运行了防火墙服务(您可以通过运行 systemctl startfirewalld 进行检查),则必须在防火墙配置中添加 HTTP和HTTPS服务,以允许来自负载均衡器的请求通过防火墙到达Nginx Web 服务器。然后重新加载防火墙服务以使新更改生效(在所有客户端计算机上执行此操作)。
# firewall-cmd --zone=public --permanent --add-service=http # firewall-cmd --zone=public --permanent --add-service=https # firewall-cmd --reload
4.接下来,在本地计算机上打开 Web 浏览器并测试Nginx安装是否正常运行。使用客户端 IP 进行导航,一旦看到Nginx测试页面,就意味着安装在客户端计算机上的 Web 服务器正常运行。
5.接下来,我们需要在客户端机器上创建测试页面,稍后我们将使用这些页面来测试HAProxy设置。
----------- Web Server #1 ----------- # cp /usr/share/nginx/html/index.html /usr/share/nginx/html/index.html.orig # echo "Showing site from websrv1.example.lan"> /usr/share/nginx/html/index.html ----------- Web Server #2 ----------- # cp /usr/share/nginx/html/index.html /usr/share/nginx/html/index.html.orig # echo "Showing site from websrv2.example.lan"> /usr/share/nginx/html/index.html ----------- Web Server #3 ----------- # cp /usr/share/nginx/html/index.html /usr/share/nginx/html/index.html.orig # echo "Showing site from websrv3.example.lan"> /usr/share/nginx/html/index.html
步骤2:在 CentOS 8 上安装和配置 HAProxy 服务器
6.现在通过运行以下命令在HAProxy服务器上安装HAProxy包。
# dnf install haproxy
7.接下来,启动HAProxy服务,使其在系统启动时自动启动并验证其状态。
# systemctl start haproxy # systemctl enable haproxy # systemctl status haproxy
8.现在我们将使用以下配置文件配置HAProxy。
# vi /etc/haproxy/haproxy.cfg
配置文件分为四个主要部分。
- 全局设置——设置整个流程的参数。
- defaults – 此部分为其声明后的所有其他部分设置默认参数。
- 前端——本节描述一组接受客户端连接的监听套接字。
- 后端- 此部分描述代理将连接以转发传入连接的一组服务器。
要了解全局设置和默认值下的选项,请阅读 HAProxy 文档(文章末尾提供链接)。在本指南中,我们将使用默认值。
设置 HAProxy 日志
9. HAProxy一旦部署将在您的 IT 基础设施中发挥重要作用,因此为其配置日志记录是一项基本要求;这使您可以深入了解与后端 Web 服务器的每个连接。
log参数(下图中突出显示)声明了一个全局Syslog服务器(例如CentOS 中默认的rsyslog),该服务器将接收日志消息。这里可以声明多个服务器。
默认配置指向本地主机(127.0.0.1),local2是用于在rsyslog下识别 HAProxy 日志消息的默认设施代码。
10.接下来,您需要告诉rsyslog服务器如何接收和处理HAProxy日志消息。打开 rsyslog 配置文件/etc/rsyslog.conf或在/etc/rsyslog.d目录中创建一个新文件,例如/etc/rsyslog.d/haproxy.conf。
# vi /etc/rsyslog.d/haproxy.conf
复制并粘贴以下配置以在默认端口514上使用UDP收集日志。
$ModLoad imudp $UDPServerAddress 127.0.0.1 $UDPServerRun 514
还添加这些行以指示rsyslog根据严重性写入两个单独的日志文件,其中local2是上面的 HAProxy 配置中定义的设施代码。
local2.* /var/log/haproxy-traffic.log local2.notice /var/log/haproxy-admin.log
11.保存文件并关闭。然后重新启动rsyslog服务以应用最近的更改。
# systemctl restart rsyslog
配置 HAProxy 前端和后端
12.在本节中,我们将演示如何配置前端和后端代理。返回HAProxy配置文件并修改默认的前端和后端部分,如下所示。我们不会详细解释每个参数,您可以随时参考官方文档。
以下配置定义了用于提供HAProxy 统计页面的listen部分。bind参数将侦听器分配给给定的 IP 地址(在本例中为 all)和端口( 9000 )。*
统计启用设置启用可使用URI /stats(即)访问的统计页面http://server_ip:9000/stats
。
stats auth设置用于在访问页面时添加基本身份验证(用您选择的用户名和密码替换haproxy和Lostp@1ss )。
listen stats bind *:9000 stats enable stats hide-version stats uri /stats stats admin if LOCALHOST stats auth haproxy:Lostp@1ss
13.下一个配置定义了一个名为TL 的前端部分(您可以随意命名)。mode参数定义了 HAProxy 的运行模式。
acl (访问控制列表)参数用于根据从请求中提取的内容做出决定。在此示例中,如果请求不是通过SSL发出的,则该请求被视为纯HTTP。
然后使用http-request set-header设置向请求添加 HTTP 标头。这有助于通知Nginx初始请求是通过HTTP(或通过端口80)发出的。
default_backend或use_backend指令定义后端服务器,在本例中由TL_web_servers引用。
请注意,如果请求未通过use_backend或default_backend指令路由,HAProxy将返回“ 503 服务不可用错误”。
frontend TL bind *:80 mode http acl http ssl_fc,not http-request set-header X-Forwarded-Protocol http if http default_backend TL_web_servers
14.然后我们需要定义一个后端部分,其中平衡设置定义了如果没有持久性方法覆盖该选择, HAProxy如何选择后端服务器来处理请求。
cookie指令启用基于 cookie 的持久性,它指示HAProxy向客户端发送名为SERVERID的 cookie ,并将其与提供初始响应的服务器的ID相关联。
服务器指令用于以服务器名称(例如websrv1)、服务器 IP:端口和选项格式定义上游服务器。
一个关键选项是检查,它告诉HAProxy继续检查服务器的可用性并在统计页面上报告。
backend TL_web_servers mode http balance roundrobin option httpchk HEAD / cookie SERVERUID insert indirect nocache server websrv1 10.42.0.200:80 cookie websrv1 check server websrv2 10.42.0.21:80 cookie websrv2 check server websrv3 10.42.0.34:80 cookie websrv3 check
注释掉任何其他前端和后端部分,如下面的屏幕截图所示。保存文件并关闭它。
15.现在重新启动HAProxy服务以应用新的更改。
# systemctl restart haproxy
16.接下来,确保防火墙中已打开HTTP(端口80)和HTTPS(端口433)服务,以便接受客户端请求,如下所示。此外,在防火墙中打开端口9000以访问统计页面,然后重新加载防火墙设置。
# firewall-cmd --zone=public --permanent --add-service=http # firewall-cmd --zone=public --permanent –add-service=https # firewall-cmd --zone=public --permanent --add-port=9000/tcp # firewall-cmd --reload
步骤3:测试HAProxy设置并查看统计数据
17.现在是时候测试HAPrxoy设置了。在您访问所有服务器的本地台式机上,在/etc/hosts文件中添加以下行,以便我们使用虚拟站点域。
10.42.0.247 www.example.lan
18.然后打开浏览器并使用服务器地址或站点域进行导航。
http://10.42.0.247/ OR http://www.example.lan/
19.要访问HAProxy统计信息页面,请使用以下地址。
http://10.42.0.247:9000/stats
然后使用您在 HAProxy 配置文件中定义的用户名和密码(参考 stats auth 参数)。
成功登录后,您将进入HAProxy统计页面,该页面显示涵盖服务器运行状况、当前请求率、响应时间等的指标。
为了演示状态报告如何根据颜色代码发挥作用,我们放置了一台后端服务器。
步骤 4:使用自签名 SSL 证书在 HAProxy 中配置 HTTPS
20.在最后一节中,我们将演示如何配置SSL/TLS以保护 HAProxy 服务器和客户端之间的所有通信。HAProxy 支持四种主要的HTTPS配置模式,但在本指南中,我们将使用SSL/TLS卸载。
在SSL/TLS卸载模式下,HAProxy解密客户端的流量并以清晰的流量连接到后端服务器。
我们将首先创建证书和密钥,如下所示(根据证书创建期间的公司详细信息回答相应的问题,如屏幕截图中突出显示的那样)。
# mkdir /etc/ssl/example.lan # cd /etc/ssl/example.lan/ # openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/example.lan.key -out /etc/ssl/example.lan.crt # cd /etc/ssl/example.lan/ # cat example.crt example.key >example.pem # ls -l
21.接下来,打开HAProxy配置文件(/etc/haproxy/haproxy.cfg)并编辑前端部分。
frontend TL bind *:80 bind *:443 ssl crt /etc/ssl/example.lan/example.pem redirect scheme https if !{ ssl_fc } mode http acl http ssl_fc,not acl https ssl_fc http-request set-header X-Forwarded-Protocol http if http http-request set-header X-Forwarded-Protocol https if https default_backend TL_web_servers
保存文件并关闭。
22.然后重新启动 HAProxy 服务以应用新的更改。
# systemctl restart haproxy.service
23.接下来,打开 Web 浏览器并再次尝试访问该网站。浏览器将由于自签名证书而显示错误,请单击“高级”继续。
目前就这些了!每个 Web 应用程序都有自己的一套要求,您需要设计和配置负载平衡以满足您的 IT 基础设施和应用程序的要求。
要详细了解本指南中使用的某些配置选项以及HAProxy 的一般使用方法,请参阅官方HAProxy 社区版文档或HAProxy 企业版文档。您可以通过下面的反馈表发布任何问题或想法。