如何为CentOS 8上的Nginx设置HAProxy作为负载均衡器

为了确保最大程度的网络应用可用性、可扩展性和高性能,现在常见的做法是实施引入冗余的技术,如服务器集群和负载均衡。例如,建立一个运行相同应用程序的服务器集群,然后在它们前面部署负载均衡器来分配流量。

HAProxy是一个开源的、强大的、高性能的、可靠的、安全的、广泛使用的高可用性TCP/HTTP负载均衡器、代理服务器和SSL/TLS终结器,专为非常高流量的网站构建。它在LinuxSolarisFreeBSDOpenBSD以及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 来检查),您必须在防火墙配置中添加 HTTPHTTPS 服务,以允许负载均衡器的请求通过防火墙传递到 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 服务器正常运行。

Test Nginx Installation on All CentOS 8 Client Machines

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
Verify HAProxy Status in CentOS 8

8. 现在我们将使用以下配置文件来配置HAProxy。

# vi /etc/haproxy/haproxy.cfg

配置文件分为四个主要部分。

  • 全局设置 – 设置进程范围的参数。
  • 默认值 – 该部分为其声明后的所有其他部分设置默认参数。
  • 前端 – 该部分描述了一组接受客户端连接的监听套接字。
  • 后端 – 该部分描述了代理将连接以转发传入连接的一组服务器。

要了解全局设置默认值下的选项,请阅读HAProxy文档(文章末尾提供了链接)。对于本指南,我们将使用默认值。

设置HAProxy日志记录

9. 一旦部署,HAProxy将在您的IT基础设施中发挥重要作用,因此为其配置日志记录是基本要求;这允许您获取有关每个连接到后端Web服务器的洞察。

日志参数(在下面的截图中突出显示)声明了一个全局Syslog服务器(例如rsyslog是CentOS中的默认值),它将接收日志消息。这里可以声明多个服务器。

默认配置指向localhost127.0.0.1),并且local2是用于在rsyslog下标识HAProxy日志消息的默认设施代码。

HAProxy Default Log Parameter

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设置用于在访问页面时添加基本身份验证(将haproxyLostp@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_backenduse_backend指令定义了后端服务器,在本例中由TL_web_servers引用。

请注意,如果请求没有被use_backenddefault_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

请注释掉其他前端和后端部分,如下面截图所示。保存文件并关闭。

Configuring HAProxy Front-end and Back-ends

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/
Check HAProxy Setup

19.要访问HAProxy统计页面,请使用以下地址。

http://10.42.0.247:9000/stats

然后使用您在HAProxy配置文件中定义的用户名和密码(参考stats auth参数)。

HAProxy Stats Login Page

登录成功后,您将进入HAProxy统计页面,该页面显示了涵盖服务器健康状况、当前请求率、响应时间等多种指标。

为了演示状态报告关于颜色代码的工作方式,我们已经将其中一个后端服务器放入。

HAProxy Statistics Report

第四步:使用自签名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
Create SSL for HAProxy

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
Configure HAProxy Front-end with SSL

保存文件并关闭。

22.然后重启HAProxy服务以应用新的更改。

# systemctl restart haproxy.service

23.接下来,打开一个网络浏览器,再次尝试访问该网站。由于自签名证书,浏览器将显示错误,点击高级继续进行。

HAProxy SSL Connection Error
Proceed with Connection
Access Site Over HTTPS

就这些了!每个网络应用程序都有自己的一套要求,您需要设计和配置负载均衡以适应您的IT基础设施和应用程序的要求。

要获取本指南中使用的一些配置选项的更多见解,以及通常如何使用HAProxy,请参阅官方HAProxy社区版文档HAProxy企业版文档。您可以通过下面的反馈表提交任何问题或想法。

Source:
https://www.tecmint.com/setup-nginx-haproxy-load-balancer-in-centos-8/