为了确保最大程度的网络应用可用性、可扩展性和高性能,现在常见的做法是实施引入冗余的技术,如服务器集群和负载均衡。例如,建立一个运行相同应用程序的服务器集群,然后在它们前面部署负载均衡器来分配流量。
HAProxy是一个开源的、强大的、高性能的、可靠的、安全的、广泛使用的高可用性TCP/HTTP负载均衡器、代理服务器和SSL/TLS终结器,专为非常高流量的网站构建。它在Linux、Solaris、FreeBSD、OpenBSD以及AIX操作系统上都能可靠地运行。
本指南展示了如何在CentOS 8上设置一个专用的高可用性负载均衡器HAProxy,以控制NGINX网络服务器集群中的流量。它还演示了如何在HAProxy中配置SSL/TLS终结。
先决条件:
A total of 4 servers with minimal CentOS 8 installation.
测试环境设置
----------- HAProxy Server Setup ----------- HA Proxy Server - hostname: haproxy-server.tecmint.lan; IP: 10.42.0.247 Test Site Domain: www.tecmint.lan ----------- Client Web Servers Setup ----------- Web Server #1 - hostname: websrv1.tecmint.lan; IP: 10.42.0.200 Web Server #2 - hostname: websrv2.tecmint.lan; IP: 10.42.0.21 Web Server #3 - hostname: websrv3.tecmint.lan; IP: 10.42.0.34
第一步:在客户机上设置Nginx HTTP服务器
1.登录到所有的CentOS 8客户机,并使用dnf包管理器安装Nginx网络服务器,如下所示。
# dnf install Nginx
2.接下来,启动 Nginx 服务,并确保在系统启动时自动启用它,并通过使用 systemctl 命令 检查其状态来确认其正在运行(在所有客户机上执行此操作)。
# systemctl start nginx # systemctl enable nginx # systemctl status nginx
3. 另外,如果在所有客户机上运行 firewalld 服务(您可以通过运行 systemctl start firewalld 来检查),您必须在防火墙配置中添加 HTTP 和 HTTPS 服务,以允许负载均衡器的请求通过防火墙传递到 Nginx Web 服务器。然后重新加载 firewalld 服务以应用新更改(在所有客户机上执行此操作)。
# 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.tecmint.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.tecmint.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.tecmint.lan"> /usr/share/nginx/html/index.html
第二步:在 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
配置文件分为四个主要部分。
- 全局设置 – 设置进程范围的参数。
- 默认值 – 该部分为其声明后的所有其他部分设置默认参数。
- 前端 – 该部分描述了一组接受客户端连接的监听套接字。
- 后端 – 该部分描述了代理将连接以转发传入连接的一组服务器。
要了解全局设置和默认值下的选项,请阅读HAProxy文档(文章末尾提供了链接)。对于本指南,我们将使用默认值。
设置HAProxy日志记录
9. 一旦部署,HAProxy将在您的IT基础设施中发挥重要作用,因此为其配置日志记录是基本要求;这允许您获取有关每个连接到后端Web服务器的洞察。
日志参数(在下面的截图中突出显示)声明了一个全局Syslog服务器(例如rsyslog是CentOS中的默认值),它将接收日志消息。这里可以声明多个服务器。
默认配置指向localhost(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
复制并粘贴以下配置,以通过UDP在默认端口514上收集日志。
$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前端和后端
在这一部分,我们将演示如何配置前端和后端代理。返回到HAProxy配置文件,并按照以下方式修改默认的前端和后端部分。我们不会详细解释每个参数,您可以随时参考官方文档。
以下配置定义了一个用于提供HAProxy统计页面的监听部分。绑定参数将监听器分配给给定的IP地址(在本例中为*
)和端口(9000)。
stats enable设置启用统计页面,该页面将使用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的前端部分(您可以随意命名)。模式参数定义了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.然后我们需要定义一个后端部分,其中balance设置定义了HAProxy如何选择后端服务器来处理请求,如果没有持久性方法覆盖该选择。
cookie指令启用了基于cookie的持久性,它指示HAProxy向客户端发送一个名为SERVERID的cookie,并将其与给出初始响应的服务器的ID关联起来。
server指令用于定义上游服务器的格式为服务器名称(例如websrv1)、服务器IP:端口和选项。
其中一个关键选项是check,告诉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
第三步:测试HAProxy设置和查看统计信息
17.现在是测试HAPrxoy设置的时候。在访问所有服务器的本地桌面机器上,将以下行添加到/etc/hosts文件中,以便我们可以使用虚拟站点域名。
10.42.0.247 www.tecmint.lan
18.然后打开浏览器,使用服务器地址或站点域名进行导航。
http://10.42.0.247/ OR http://www.tecmint.lan/

19.要访问HAProxy统计页面,请使用以下地址。
http://10.42.0.247:9000/stats
然后使用您在HAProxy配置文件中定义的用户名和密码(参考stats auth参数)。

登录成功后,您将进入HAProxy统计页面,该页面显示了涵盖服务器健康状况、当前请求率、响应时间等多种指标。
为了演示状态报告关于颜色代码的工作方式,我们已经将其中一个后端服务器放入。

第四步:使用自签名SSL证书在HAProxy中配置HTTPS
20.在本节的最后部分,我们将演示如何配置SSL/TLS,以确保HAProxy服务器与客户端之间的所有通信。HAProxy支持四种主要的HTTPS配置模式,但在本指南中,我们将使用SSL/TLS卸载。
在SSL/TLS卸载模式中,HAProxy在客户端解密流量,并以明文连接到后端服务器。
我们将从创建证书和密钥开始,如图所示(在创建证书期间根据您公司的详细信息回答问题,如屏幕截图中所示)。
# mkdir /etc/ssl/tecmint.lan # cd /etc/ssl/tecmint.lan/ # openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/tecmint.lan.key -out /etc/ssl/tecmint.lan.crt # cd /etc/ssl/tecmint.lan/ # cat tecmint.crt tecmint.key >tecmint.pem # ls -l

21.接下来,打开HAProxy配置文件(/etc/haproxy/haproxy.cfg)并编辑前端部分。
frontend TL bind *:80 bind *:443 ssl crt /etc/ssl/tecmint.lan/tecmint.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.接下来,打开一个网络浏览器,再次尝试访问该网站。由于自签名证书,浏览器将显示错误,点击高级继续进行。



就这些了!每个网络应用程序都有自己的一套要求,您需要设计和配置负载均衡以适应您的IT基础设施和应用程序的要求。
要获取本指南中使用的一些配置选项的更多见解,以及通常如何使用HAProxy,请参阅官方HAProxy社区版文档或HAProxy企业版文档。您可以通过下面的反馈表提交任何问题或想法。
Source:
https://www.tecmint.com/setup-nginx-haproxy-load-balancer-in-centos-8/