本指南将引导您了解如何在 Rocky Linux 8 上安装 HAProxy。HAProxy 是当前事实上的标准开源负载均衡器。 它为基于 TCP 和 HTTP 的应用程序提供高可用性、负载平衡和代理。
在提供负载均衡的同时,HAProxy 支持不同的负载均衡算法。 一些常用的包括;
- 循环 – 这是默认算法,它使 HAProxy 可以根据权重依次选择每个服务器来服务请求。
- 最小连接 – 连接数最少的服务器接收连接。 建议在需要很长会话的地方使用,例如 LDAP、SQL。
- 来源 – 使用此算法,源 IP 地址被散列并除以正在运行的服务器的总权重,以指定哪个服务器将接收请求。 这可确保只要没有服务器关闭或打开,相同的客户端 IP 地址将始终到达相同的服务器。 如果由于正在运行的服务器数量发生变化而导致散列结果发生变化,许多客户端将被定向到不同的服务器。
在文档页面上阅读有关 HAProxy 负载平衡算法的更多信息。
在 Rocky Linux 8 上安装 HAProxy
为了演示 HAProxy 的基本运作方式,本指南使用了三个虚拟机;
- 一个作为 HAProxy 负载均衡器运行
- 另外两个运行 Web 服务器,提供基本的 html 页面。
在 Rocky Linux 8 上从源代码安装 HAProxy
在撰写本文时,HAProxy 2.4.2 是当前稳定的 LTS 版本,如 HAProxy.org 页面。
默认的 Rocky Linux 8 存储库提供 HAProxy 1.8;
dnf info haproxy
Available Packages Name : haproxy Version : 1.8.27 Release : 2.el8 Architecture : x86_64 Size : 1.4 M Source : haproxy-1.8.27-2.el8.src.rpm Repository : appstream Summary : HAProxy reverse proxy for high availability environments URL : https://www.haproxy.org/ License : GPLv2+
为了安装当前稳定版本的 HAProxy,您需要从源代码构建。
安装所需的构建工具
因此,首先安装所需的构建工具。
dnf install gcc pcre-devel tar make openssl-devel readline-devel systemd-devel wget vim
安装LUA 5.3;
wget https://www.lua.org/ftp/lua-5.3.5.tar.gz
cd /tmp/ && tar xzf lua-5.3.5.tar.gz
cd lua-5.3.5 && make linux install
创建 HAProxy 系统用户
运行以下命令创建 HAProxy 系统用户。
useradd -M -d /var/lib/haproxy -s /sbin/nologin -r haproxy
下载 HAProxy 源代码
导航到 HAProxy 下载页面并获取 HAProxy 2.4.2 源代码。 您可以简单地使用下面的命令来下载它。
wget https://www.haproxy.org/download/2.4/src/haproxy-2.4.2.tar.gz -P /tmp
下载完成后提取源代码。
cd /tmp/ && tar xzf haproxy-2.4.2.tar.gz
安装 HAProxy
cd haproxy-2.4.2
make -j $(nproc) TARGET=linux-glibc USE_OPENSSL=1 USE_LUA=1 USE_PCRE=1 USE_SYSTEMD=1
sudo make install
在 Rocky Linux 8 上配置 HAProxy
/etc/haproxy/haproxy.cfg
是默认的 HAProxy 配置文件。
但是,从源安装时不会创建目录和配置文件。
因此,创建目录;
mkdir /etc/haproxy/
下面是一个示例 HAProxy 默认配置文件;
global log 127.0.0.1 local2 chroot /var/lib/haproxy pidfile /var/run/haproxy.pid maxconn 4000 user haproxy group haproxy daemon stats socket /var/lib/haproxy/stats ssl-default-bind-ciphers PROFILE=SYSTEM ssl-default-server-ciphers PROFILE=SYSTEM defaults mode http log global option httplog option dontlognull option http-server-close option forwardfor except 127.0.0.0/8 option redispatch retries 3 timeout http-request 10s timeout queue 1m timeout connect 10s timeout client 1m timeout server 1m timeout http-keep-alive 10s timeout check 10s maxconn 3000 frontend main bind *:5000 acl url_static path_beg -i /static /images /javascript /stylesheets acl url_static path_end -i .jpg .gif .png .css .js use_backend static if url_static default_backend app backend static balance roundrobin server static 127.0.0.1:4331 check backend app balance roundrobin server app1 127.0.0.1:5001 check server app2 127.0.0.1:5002 check server app3 127.0.0.1:5003 check server app4 127.0.0.1:5004 check
在上面的配置文件中可以看到,HAProxy有四个配置部分;
- 这
global
定义适用于所有运行 HAProxy 的服务器的参数的设置 - 这
default
settings 部分定义了适用于配置中所有代理子部分的参数(frontend
,backend
, 和listen
)。 - 这
frontend
settings 部分定义了用于客户端连接请求的服务器侦听套接字。 - 这
backend
settings 部分定义了真实服务器 IP 地址以及负载均衡器调度算法。 - 有时,两者
backend
和frontend
可以组合下listen
部分。
在 HAProxy 基本部分或下面阅读有关这些部分的更多信息 doc/configuration.txt
源代码目录下。
定义全局 HAProxy 设置
在我们的配置中,这里是我们的全局设置。
global log 127.0.0.1 local2 chroot /var/lib/haproxy pidfile /var/run/haproxy.pid maxconn 4000 user haproxy group haproxy daemon stats socket /var/lib/haproxy/stats ssl-default-bind-ciphers PROFILE=SYSTEM ssl-default-server-ciphers PROFILE=SYSTEM
定义 HAProxy 默认设置
我们按原样使用这些默认设置;
defaults mode http log global option httplog option dontlognull option http-server-close option forwardfor except 127.0.0.0/8 option redispatch retries 3 timeout http-request 10s timeout queue 1m timeout connect 10s timeout client 1m timeout server 1m timeout http-keep-alive 10s timeout check 10s maxconn 3000
定义 HAProxy 前端设置
在本节中,我们将定义如何从外部访问 HAProxy 以启用对后端服务器的访问。 由于大多数选项已在默认设置部分定义,这是我们的前端设置;
frontend lb01 bind 192.168.60.19:80 default_backend kifaruapps
在哪里;
- 绑定 定义 HAProxy 侦听的给定 IP 地址和端口。
default_backend
给出一个名字backend
将流量发送到的服务器。
定义 HAProxy 后端设置
在后端部分,定义真实的后端服务器 IP 地址以及负载均衡器调度算法。
backend kifaruapps balance roundrobin server webapp01 192.168.60.21:8080 check server webapp02 192.168.59.23:80 check
- 平衡 设置定义了循环负载均衡器调度算法。
- 服务器 设置指定后端可用的服务器。
- 查看 – 在服务器上启用健康检查。 默认情况下,始终认为服务器可用。 如果设置,则服务器在接受定期 TCP 连接时可用,以确保它确实能够为请求提供服务。
定义 HAProxy 侦听设置
您可以选择添加侦听部分以启用 HAProxy 统计信息。 HAProxy 提供了一个名为 HAProxy 统计页面 显示与服务器健康状况、当前请求率、响应时间等相关的指标,提供基于前端、后端和服务器的详细数据。
可以启用统计页面,如下所示;
listen stats bind 192.168.60.19:8088 # Bind stats to port 8088 log global # Enable Logging stats enable # enable statistics reports stats hide-version # Hide the version of HAProxy stats refresh 30s # HAProxy refresh time stats show-node # Shows the hostname of the node stats auth lbadmin:[email protected] # Authentication for Stats page stats uri /lb_stats # Statistics URL
确保防火墙上允许 stats 端口。
firewall-cmd --add-port=8088/tcp --permanent
firewall-cmd --reload
请务必检查 SELinux 日志,以防万一无法访问。
最后,这就是我们的 HAProxy 配置文件, /etc/haproxy/haproxy.cfg
, 就好像;
global log 127.0.0.1 local2 chroot /var/lib/haproxy pidfile /var/run/haproxy.pid maxconn 4000 user haproxy group haproxy daemon stats socket /var/lib/haproxy/stats ssl-default-bind-ciphers PROFILE=SYSTEM ssl-default-server-ciphers PROFILE=SYSTEM defaults mode http log global option httplog option dontlognull option http-server-close option forwardfor except 127.0.0.0/8 option redispatch retries 3 timeout http-request 10s timeout queue 1m timeout connect 10s timeout client 1m timeout server 1m timeout http-keep-alive 10s timeout check 10s maxconn 3000 frontend lb01 bind 192.168.60.19:80 default_backend kifarunixapps backend kifarunixapps balance roundrobin server webapp01 192.168.60.21:8080 check server webapp02 192.168.59.23:80 check listen stats bind 192.168.60.19:8088 # Bind stats to port 8088 stats enable # enable statistics reports stats hide-version # Hide the version of HAProxy stats refresh 30s # HAProxy refresh time stats show-node # Shows the hostname of the node stats auth lbadmin:[email protected] # Authentication for Stats page stats uri /lb_stats # Statistics URL
在 HAProxy 文档页面上阅读有关配置选项的更多信息。
创建 HAProxy chroot 目录;
mkdir /var/lib/haproxy/
验证 HAProxy 配置
要检查 HAProxy 配置文件是否有任何语法错误,请运行以下命令;
haproxy -c -f /etc/haproxy/haproxy.cfg
如果一切顺利,你应该得到这样的输出;
Configuration file is valid
在防火墙上打开 HAProxy 端口。
firewall-cmd --add-port=80/tcp --permanent firewall-cmd --reload
在 Rocky Linux 8 上运行 HAProxy
首先,您需要创建 HAProxy systemd 配置文件。
cat > /etc/systemd/system/haproxy.service << 'EOL' [Unit] Description=HAProxy Load Balancer After=network-online.target Wants=network-online.target [Service] Environment="CONFIG=/etc/haproxy/haproxy.cfg" "PIDFILE=/run/haproxy.pid" EnvironmentFile=/etc/sysconfig/haproxy ExecStartPre=/usr/local/sbin/haproxy -f $CONFIG -c -q $OPTIONS ExecStart=/usr/local/sbin/haproxy -Ws -f $CONFIG -p $PIDFILE $OPTIONS ExecReload=/usr/local/sbin/haproxy -f $CONFIG -c -q $OPTIONS ExecReload=/bin/kill -USR2 $MAINPID SuccessExitStatus=143 KillMode=mixed Type=notify [Install] WantedBy=multi-user.target EOL
echo 'OPTIONS="-Ws"' > /etc/sysconfig/haproxy
重新加载 systemd 配置;
systemctl daemon-reload
要启动 HAProxy 以运行以下命令;
systemctl start haproxy
使其能够在启动时运行;
systemctl enable haproxy
检查 HAProxy 的状态。
systemctl status haproxy
● haproxy.service - HAProxy Load Balancer Loaded: loaded (/etc/systemd/system/haproxy.service; disabled; vendor preset: disabled) Active: active (running) since Sun 2021-07-25 09:57:36 EAT; 4s ago Process: 39550 ExecStartPre=/usr/local/sbin/haproxy -f $CONFIG -c -q $OPTIONS (code=exited, status=0/SUCCESS) Main PID: 39552 (haproxy) Tasks: 2 (limit: 4938) Memory: 3.6M CGroup: /system.slice/haproxy.service ├─39552 /usr/local/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid -Ws └─39555 /usr/local/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid -Ws Jul 25 09:57:36 localhost.localdomain systemd[1]: haproxy.service: Succeeded. Jul 25 09:57:36 localhost.localdomain systemd[1]: Stopped HAProxy Load Balancer. Jul 25 09:57:36 localhost.localdomain systemd[1]: Starting HAProxy Load Balancer... Jul 25 09:57:36 localhost.localdomain systemd[1]: Started HAProxy Load Balancer. Jul 25 09:57:36 localhost.localdomain haproxy[39552]: [NOTICE] (39552) : New worker #1 (39555) forked
在 Rocky Linux 8 上配置 HAProxy 日志记录
要配置 HAProxy 标准日志记录,请编辑 /etc/rsyslog.conf 并通过删除注释在端口 514 上启用 UDP 系统日志接收(#) 就行, #module(load=”imudp”) 和 #input(type=”imudp” port=”514″) 如下所示。
sed -i '/="imudp"/s/^#//g' /etc/rsyslog.conf
接下来,禁用发送到的私人身份验证消息的日志记录 本地2 设施, (local2.none) 在 /var/日志/消息 并启用登录 /var/log/haproxy.log 如下所示。
sed -i 's/*.info;mail.none;authpriv.none;cron.none/*.info;mail.none;authpriv.none;cron.none;local2.none/' /etc/rsyslog.conf
echo 'local2.* /var/log/haproxy.log' >> /etc/rsyslog.conf
Save 配置文件并运行以下命令以检查任何错误。
rsyslogd -N1
接下来,重启 Rsyslog 和 HAProxy
systemctl restart rsyslog haproxy
您现在应该可以登录 HAProxy /var/log/haproxy.log
.
tail -f /var/log/haproxy.log
配置 Apache X-Forwarded-For 登录后端服务器
由于我们已经配置 HAProxy 为所有发送到后端服务器的请求添加 HTTP 标头“X-Forwarded-For”(选项转发),您可以在后端服务器上为其配置日志记录。 这确保捕获请求客户端的 IP 地址而不是 HAProxy 负载均衡器。
配置可以是;
- /etc/httpd/conf/httpd.conf
- /etc/apache2/apache2.conf
因此,登录到后端服务器并配置 Apache 记录 X-Forwarded-For 标头。 我们正在更改的默认行是;
... LogFormat "%h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-Agent}i"" combined LogFormat "%h %l %u %t "%r" %>s %b" common ...
因此,编辑此行,使其看起来像;
... LogFormat ""%{X-Forwarded-For}i" %l %u %t "%r" %>s %b "%{Referer}i" "%{User-Agent}i"" combined LogFormat "%h %l %u %t "%r" %>s %b" common ...
Save 文件并运行 Apache 配置文件语法检查命令。
apachectl configtest
Syntax OK
重新开始 Apache
systemctl restart httpd
或者
systemctl restart apache2
在 Rocky Linux 8 上测试 HAProxy 负载均衡器
要验证 HAProxy 是否能够对 http 请求进行负载平衡,请导航到浏览器并使用主机名或 IP 地址访问 HAProxy。
由于它使用的是 roundrobin
算法,当您刷新页面时,您应该能够从两个后端服务器获取内容。
检查 HAProxy 统计信息
要检查前端和后端服务器的统计信息,只需导航到监听部分定义的 stats url; https://server-IP_OR_hostname:8088/lb_stats. 设置适当的 URL。
出现提示时,使用定义的凭据进行身份验证 stats auth
在 聆听部分,在这个演示中, 管理员:[email protected], 用于用户名和密码。
HAProxy 统计
这标志着我们关于如何在 Rocky Linux 8 上安装 HAProxy 的指南结束。
阅读有关 HAProxy 文档的更多信息。
相关教程
在 Ubuntu 20.04 上使用 Keepalived 配置高可用的 HAProxy
在 Ubuntu 20.04 上安装和设置 HAProxy
在 CentOS 8 上安装和设置 HAProxy