
HAProxy(高可用性代理)是一个免费、非常快速且可靠的解决方案,为基于 TCP 和 HTTP 的应用程序提供高可用性、负载均衡和代理功能。它特别适合流量极高的网站,并为世界上许多访问量最大的网站提供支持。它具有通过 HTTP Cookie 实现的连接持久性、负载均衡、双向的请求头和响应头的添加、修改和删除功能。它还具备请求阻断能力,并提供显示服务器状态的界面。
本文将通过实践演示在 Debian 12 系统上安装最新稳定版 HAProxy 3.2,并进行基本配置,实现后端应用的负载均衡与健康检查,同时启用状态监控界面。
HAProxy 在 Debian 12 的默认软件仓库中可用。但是,可用的软件包可能不是最新的。
apt show haproxy
输出示例:

默认仓库提供的是 2.6.12 版本,而当前最新稳定版是 3.2.3。

访问:https://haproxy.debian.net/ 根据系统查找需要版本号并加入到软件安装源。

# 需要提前安装 curl 软件:apt install curl -y
curl https://haproxy.debian.net/haproxy-archive-keyring.gpg \
> /usr/share/keyrings/haproxy-archive-keyring.gpg
echo deb "[signed-by=/usr/share/keyrings/haproxy-archive-keyring.gpg]" \
http://haproxy.debian.net bookworm-backports-3.2 main \
> /etc/apt/sources.list.d/haproxy.list
更新软件并安装 Haproxy 3.2 版本
apt update
apt install haproxy=3.2.\* # 这将安装 3.2 版本下的最新版本
haproxy -v # 验证安装版本
输出示例:

使用 HAProxy,您可以定义多个代理服务并配置 HAProxy 为这些代理的流量进行负载均衡。代理由前端系统和一或多个后端系统组成。前端系统定义了代理监听的 IP 地址和端口,以及用于特定代理的后端系统。
HAProxy 的主配置文件是 /etc/haproxy/haproxy.cfg。
HAProxy 配置文件由四个主要部分组成:
frontend) 和后端 (backend) 部分的配置设置。您可以定义多个默认部分,但后续的默认部分会覆盖之前的设置。前端和后端部分可以使用 listen 部分合并。listen 部分也可用于提供 HAProxy 统计信息页面。
默认的 HAProxy 配置文件内容如下(过滤掉了注释行):
grep -v '^\s*#' /etc/haproxy/haproxy.cfg
输出示例:
global
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy
stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners
stats timeout 30s
user haproxy
group haproxy
daemon
ca-base /etc/ssl/certs
crt-base /etc/ssl/private
ssl-default-bind-ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
ssl-default-bind-ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256
ssl-default-bind-options ssl-min-ver TLSv1.2 no-tls-tickets
defaults
log global
mode http
option httplog
option dontlognull
timeout connect 5000
timeout client 50000
timeout server 50000
errorfile 400 /etc/haproxy/errors/400.http
errorfile 403 /etc/haproxy/errors/403.http
errorfile 408 /etc/haproxy/errors/408.http
errorfile 500 /etc/haproxy/errors/500.http
errorfile 502 /etc/haproxy/errors/502.http
errorfile 503 /etc/haproxy/errors/503.http
errorfile 504 /etc/haproxy/errors/504.http
在我们的配置文件中,将修改上述内容以包含前端 (frontend) 和后端 (backend) 部分。
在继续之前,请备份默认配置文件后再打开文件:
cp /etc/haproxy/haproxy.cfg{,.factory}
vi /etc/haproxy/haproxy.cfg
如前所述,前端部分定义了客户端可以连接到的 IP 地址和端口(HAProxy 服务器本身的 IP 地址和端口)。因此,我们的前端配置如下:
frontend oneh
bind 192.168.2.218:80 # ssl crt /etc/ssl/certs/haproxy.pem
default_backend webapps
option forwardfor
bind: 在前端服务器中定义一个或多个监听地址和/或端口。ssl crt: 配置 HAProxy 的 SSL/TLS 终止(SSL Termination),并指定 SSL/TLS 证书的路径。default_backend: 指定当没有匹配任何 "use_backend" 规则时使用的后端。option forwardfor: HAProxy 以反向代理模式运行。此选项使后端服务器能够看到客户端的真实 IP 地址,而不是 HAProxy 服务器的 IP 地址。注意:在此演示中,我们的代理后端未使用 SSL/TLS 证书。如需使用,需要在 HAProxy 上配置 SSL/TLS 证书作为终止点(SSL Termination),而不是在每个后端应用程序上配置终止其 SSL/TLS 连接(SSL Passthrough)。
在本节中,我们将以基本形式定义 HAProxy 的调度算法以及被代理/负载均衡的后端服务器。
backend webapps
balance roundrobin
server webapp01 127.0.0.1:8081 check
server webapp02 127.0.0.1:8082 check
balance 参数定义了负载均衡器的调度算法。roundrobin 轮询选择服务器。leastconn,它使负载均衡器将请求转发给连接数最少的服务器。server 设置指定后端可用的服务器。check 选项启用对服务器的健康检查,这样如果其中一台服务器宕机,请求将被定向到可用的后端服务器。webapp01/02 为我在后台创建的两个web服务器测试容器。根据 HAProxy 统计页面文档,HAProxy 附带了一个称为 HAProxy 统计页面(Stats Page)的仪表板,它显示了大量的指标,涵盖服务器健康状况、当前请求速率、响应时间等。这些指标提供了按前端、后端和服务器细分的详细数据。这可以通过 stats enable 指令启用,该指令可以添加到 frontend 或 listen 部分。本实践中我们使用 listen 部分。
listen stats
bind 192.168.2.218:8443 # ssl crt /etc/ssl/certs/haproxy.pem
stats enable # 启用统计报告
stats hide-version # 隐藏 HAProxy 的版本号
stats refresh 30s # 统计信息刷新时间间隔 (30秒)
stats show-node # 显示节点的主机名
stats auth haadmin:P@ssword # 为统计页面启用基本身份验证
stats uri /stats # 统计信息的访问URI (URL路径)
请注意,行 bind 192.168.2.218:8443 # ssl crt /etc/ssl/certs/haproxy.pem 定义了访问 HAProxy 统计信息的前端 IP 和端口,以及要使用的 SSL/TLS 证书(本文实践并未使用)。
完成配置后保存并退出文件。
总的来说,我们的整体配置如下所示。注意如果使用SSL需要在 SSL/TLS 配置选项部分添加行 tune.ssl.default-dh-param 2048。
global
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy
stats socket /run/haproxy/admin.sock mode 660 level admin
stats timeout 30s
user haproxy
group haproxy
daemon
# Default SSL material locations
ca-base /etc/ssl/certs
crt-base /etc/ssl/private
# See: https://ssl-config.mozilla.org/#server=haproxy&server-version=2.0.3&config=intermediate
ssl-default-bind-ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
ssl-default-bind-ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256
ssl-default-bind-options ssl-min-ver TLSv1.2 no-tls-tickets
tune.ssl.default-dh-param 2048 # 如果配置了SSL请添加此行
defaults
log global
mode http
option httplog
option dontlognull
timeout connect 5000
timeout client 50000
timeout server 50000
errorfile 400 /etc/haproxy/errors/400.http
errorfile 403 /etc/haproxy/errors/403.http
errorfile 408 /etc/haproxy/errors/408.http
errorfile 500 /etc/haproxy/errors/500.http
errorfile 502 /etc/haproxy/errors/502.http
errorfile 503 /etc/haproxy/errors/503.http
errorfile 504 /etc/haproxy/errors/504.http
frontend oneh
bind 192.168.2.218:443 # ssl crt /etc/ssl/certs/haproxy.pem
default_backend webapps
option forwardfor
backend webapps
balance roundrobin
server webapp01 192.168.2.231:80 check
server webapp02 192.168.2.232:80 check
listen stats
bind 192.168.2.218:8443 # ssl crt /etc/ssl/certs/haproxy.pem
stats enable # 启用统计报告
stats hide-version # 隐藏 HAProxy 的版本号
stats refresh 30s # 统计信息刷新时间间隔 (30秒)
stats show-node # 显示节点的主机名
stats auth haadmin:P@ssword # 为统计页面启用基本身份验证
stats uri /stats # 统计信息的访问URI (URL路径)
配置完成后,在启动 HAProxy 之前运行以下命令来验证配置语法:
sudo haproxy -f /etc/haproxy/haproxy.cfg -c -V
如果一切正常,您应该会看到输出:

否则,您会在标准输出上看到错误信息。请务必在继续之前修复这些错误。
安装后,HAProxy 默认已启动并设置为开机自启。您可以通过运行以下命令重启它并查看状态:
systemctl restart haproxy && systemctl status haproxy
输出示例:

如果 UFW 防火墙正在运行,请开放端口 443 以及统计信息端口:
sudo ufw allow 443/tcp
sudo ufw allow 8443/tcp
现在可以通过浏览器访问 HAProxy 来确认 LB 设置。 使用地址 http[s]://lb-server-IP。
第一页显示的内容来自第一个定义的后端,在本演示中为 webserver01。 请记住这里使用的 LB 算法:roundrobin。

快速点击“刷新”按钮将会看到在webserver01/02间来回切换。

还可以通过 http[s]://lb-server-IP[:port]/stats 查看 HAProxy 的统计数据。 如果启用了基本身份验证,系统会提示输入用户和密码。

下图便是haproxy的统计数据:

至此,您已在 Debian 12 上成功部署并配置了 HAProxy 负载均衡器。通过访问应用地址,可以验证请求已在后端服务器间轮询分发;通过统计页面,可实时监控服务器状态与流量。
延伸阅读: 后续可探索 HTTPS 优化、访问控制列表 (ACL) 等高级配置以进一步增强 HAProxy 功能。