在 Rocky Linux 8 上安装 HAProxy

本指南将引导您了解如何在 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 地址以及负载均衡器调度算法。
  • 有时,两者 backendfrontend 可以组合下 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