介绍
HAProxy,即高可用性代理服务器,是基于TCP和HTTP的广泛使用的代理服务器,在Linux,Solaris和FreeBSD上运行,通过在多个服务器之间分发请求来加载平衡应用程序,并确保应用程序对用户高度可用。
默认情况下,在许多 CentOS 8 安装中,HAProxy 并未配置为将其日志输出写入到文件中.本快速启动教程将解释如何通过使用 Unix 域插槽来配置 HAProxy 登录与 Rsyslog,以确保可靠性、速度和安全性。
前提条件
要完成本教程,您需要运行 CentOS 8 的服务器。 该服务器应该具有非根用户的管理权限。 要设置此功能,请遵循 CentOS 8 初始服务器设置指南 教程。
第1步:安装和启用HAProxy
要安裝 HAProxy,請執行以下「dnf」命令:
1sudo dnf install haproxy
当你被提示这是OK [y/N]:
时,输入y
并按RETURN
来安装包。
一旦安装了 HAProxy,请使用systemctl
命令启用并启动它:
1sudo systemctl enable haproxy.service
你应该得到以下的输出:
1[secondary_label Output]
2Created symlink /etc/systemd/system/multi-user.target.wants/haproxy.service → /usr/lib/systemd/system/haproxy.service.
现在启用了 HAProxy 服务,您可以启动它,以确保它在您的服务器上运行默认配置:
1sudo systemctl start haproxy.service
接下来检查HAProxy的状态,以确保它正在运行:
1sudo systemctl status haproxy.service
注意输出中突出的活跃(运行)
部分.如果您的服务器显示相同突出的部分,则HAProxy在您的服务器上运行正确,您可以继续配置日志。
1[secondary_label Output]
2● haproxy.service - HAProxy Load Balancer
3 Loaded: loaded (/usr/lib/systemd/system/haproxy.service; enabled; vendor preset: disabled)
4 Active: active (running) since Wed 2020-09-09 21:16:39 UTC; 4min 39s ago
5 Process: 21340 ExecStartPre=/usr/sbin/haproxy -f $CONFIG -c -q (code=exited, status=0/SUCCESS)
6 Main PID: 21341 (haproxy)
7 Tasks: 2 (limit: 2881)
8 Memory: 2.7M
9 CGroup: /system.slice/haproxy.service
10 ├─21341 /usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid
11. . .
如果您的输出不同,或者状态显示了类似的)教程中的故障排除步骤来确定是什么阻止HAProxy正确启动。
一旦您确认 HAProxy 已启用并运行,您可以继续到下一步,即配置 HAProxy 的日志指令。
步骤 2 — 配置 HAProxy 日志指令
要配置 HAProxy 的日志指令,请在vi
或您偏好的编辑器中打开/etc/haproxy/haproxy.cfg
:
1sudo vi /etc/haproxy/haproxy.cfg
按i
切换到INSERT
模式,然后找到行log 127.0.0.1 local2
并通过在行开始时添加一个#
字符来评论它,如下示例所示:
1[label /etc/haproxy/haproxy.cfg]
2. . .
3# 2) configure local2 events to go to the /var/log/haproxy.log
4# file. A line like the following can be added to
5# /etc/sysconfig/syslog
6#
7# local2.* /var/log/haproxy.log
8#
9 #log 127.0.0.1 local2
10
11 chroot /var/lib/haproxy
12 pidfile /var/run/haproxy.pid
13. . .
现在,在评论的排行后直接添加一个行,其中包含以下内容:
1log /dev/log local0
您编辑的/etc/haproxy/haproxy.cfg
的整个部分应该包含以下几行:
1[label /etc/haproxy/haproxy.cfg]
2. . .
3# local2.* /var/log/haproxy.log
4#
5 #log 127.0.0.1 local2
6 log /dev/log local0
7
8 chroot /var/lib/haproxy
9 pidfile /var/run/haproxy.pid
10. . .
chroot
行很重要,因为它限制了 HAProxy 流程只访问 `/var/lib/haproxy’ 目录中的文件。
一旦您完成了在/etc/haproxy/haproxy.cfg
中的日志
行编辑,请按ESC
,键入:wq
,然后按ENTER
来保存和关闭文件。
在本节中您需要完成的最后一步是创建 /var/lib/haproxy/dev
目录,因为它默认不存在。
使用mkdir
命令创建目录,然后重新启动 HAProxy:
1sudo mkdir /var/lib/haproxy/dev
2sudo systemctl restart haproxy.service
现在您已经配置了 HAProxy 将其日志发送到位于 `/var/lib/haproxy/dev/log 的 Unix 域接口中。
步骤 3 — 配置 Rsyslog 以收集 HAProxy 日志
在 CentOS 8 上,Rsyslog 的默认配置不处理 HAProxy 日志. 若要从 HAProxy 服务中收集日志,请使用 vi
或您喜爱的编辑器打开一个新的文件 `/etc/rsyslog.d/99-haproxy.conf:
1sudo vi /etc/rsyslog.d/99-haproxy.conf
按i
切换到INSERT
模式,然后将下列行粘贴到文件中:
1[label /etc/rsyslog.d/99-haproxy.conf]
2$AddUnixListenSocket /var/lib/haproxy/dev/log
3
4# Send HAProxy messages to a dedicated logfile
5:programname, startswith, "haproxy" {
6 /var/log/haproxy.log
7 stop
8}
$AddUnixListenSocket
指令告诉Rsyslog在指定的位置创建一个Unix域接口,在这种情况下是/var/lib/haproxy/dev/log
。
一旦你完成了编辑 /etc/rsyslog.d/99-haproxy.conf
,保存并关闭文件,按一下 ESC
,键入 :wq
,然后按一下 ENTER
。
您现在已经配置了 Rsyslog 来从 /var/lib/haproxy/dev/log 中的 Unix 域插件中读取日志条目,然后将其写入
/var/log/haproxy.log 中的日志文件中。
但是,在重新启动 Rsyslog 之前,您需要确定 SELinux 是否在 CentOS 8 系统上实施访问控制。
若要查看 SELinux 的当前策略,请执行以下操作:
1getenforce
您将收到 **以下输出之一:
在此模式下,SELinux 在您的系统上执行访问控制。您需要完成以下选项(# step-4-%E2%80%94(选项)-configuring-selinux)部分。 * Permissive
- 在这种情况下,SELinux 会记录到其日志文件的所有访问尝试,但不会在您的系统上执行访问控制。
如果getenforce
命令返回了允许
或禁用
,则可以使用以下命令重新启动 Rsyslog:
1sudo systemctl restart rsyslog
重新启动 Rsyslog 后,您将能够查看您在 /var/log/haproxy.log’ 文件中配置的日志,以便在
/etc/rsyslog.d/99-haproxy.conf 中查看日志。
否则,如果您的系统在执行
模式下运行 SELinux,那么本教程的下一节解释了如何添加一个模块,以允许 Rsyslog 和 HAProxy 通过共享的 Unix 域插槽相互通信。
步骤 4 — (可选) 配置 SELinux
如果你的 CentOS 8 系统配置了 SELinux 在强制
模式下,那么你需要允许 Rsyslog 访问 HAProxy 的chroot
目录。
如果你不熟悉SELinux,这个教程系列(https://www.digitalocean.com/community/tutorial_series/an-introduction-to-selinux-on-centos-7)将帮助你学习如何管理和与SELinux互动。尽管它是为CentOS 7写的,系列中的原则和命令同样适用于CentOS 8。
要允许 Rsyslog 和 HAProxy 访问他们的共享接口,第一个任务是创建一个 Type Enforcement 策略文件。在vi
或您偏好的编辑器中打开一个名为rsyslog-haproxy.te
的新文件:
1vi rsyslog-haproxy.te
按i
切换到INSERT
模式,然后将下列行粘贴到文件中:
1[label rsyslog-haproxy.te]
2module rsyslog-haproxy 1.0;
3
4require {
5 type syslogd_t;
6 type haproxy_var_lib_t;
7 class dir { add_name remove_name search write };
8 class sock_file { create setattr unlink };
9}
10
11#============= syslogd_t ==============
12allow syslogd_t haproxy_var_lib_t:dir { add_name remove_name search write };
13allow syslogd_t haproxy_var_lib_t:sock_file { create setattr unlink };
第一行定义了模块名称和版本。要求
部分告诉SELinux模块加载器将策略加载为模块所需的类型和类别。
当你完成编辑文件时,保存并关闭它,按ESC
,键入:wq
,然后按ENTER
。
接下来,运行以下命令来安装checkpolicy
包,其中包含你将使用的checkmodule
实用程序将 Type Enforcement 文件转换为 SELinux 模块。
1sudo dnf install checkpolicy
现在你已经安装了checkmodule
工具,下一步是编译模块,然后将其加载到SELinux。
1checkmodule -M -m rsyslog-haproxy.te -o rsyslog-haproxy.mod
接下来,运行semodule_package
,生成一个完整的策略包,SELinux可以加载到Linux内核中:
1semodule_package -o rsyslog-haproxy.pp -m rsyslog-haproxy.mod
最后一步是使用semodule
命令将您生成的包加载到Linux内核中:
1sudo semodule -i rsyslog-haproxy.pp
添加模块可能需要几秒钟。一旦命令完成,您可以通过运行semodule
命令来确认模块已加载到内核中:
1sudo semodule -l |grep rsyslog-haproxy
您应该获得如下类型的输出:
1[secondary_label Output]
2rsyslog-haproxy
一旦模块被加载,您可以使用以下命令重新启动 Rsyslog:
1sudo systemctl restart rsyslog
您现在已经定义、编译并加载了 SELinux 策略,该策略将允许 HAProxy 和 Rsyslog 通过共享接口进行通信。
在下一步中,您将通过向 HAProxy 提出 HTTP 请求并检查其新日志文件来测试一切是否有效。
步骤5:测试HAProxy记录
现在您已经配置了 HAProxy、Rsyslog 和可选的 SELinux,您可以测试到登录到 /var/log/haproxy.log
是否有效。
默认情况下,haproxy
包将配备一个配置文件,在端口5000上创建一个HTTP倾听器接口.配置指向一个不存在的后端服务器,因此任何对端口的请求都会导致HTTP 503错误。
要检查您的 /var/log/haproxy.log
文件中的 503 错误,首先使用 `curl' 生成 HTTP 请求,如下:
1curl -si http://127.0.0.1:5000
您应该获得如下类型的输出:
1[secondary_label Output]
2HTTP/1.0 503 Service Unavailable
3Cache-Control: no-cache
4Connection: close
5Content-Type: text/html
6
7<html><body><h1>503 Service Unavailable</h1>
8No server is available to handle this request.
9</body></html>
现在,使用grep
命令检查任何 HTTP 503 响应的 `/var/log/haproxy.log:
1sudo grep -E 'NOSRV.+503' /var/log/haproxy.log
<$>[注] 注 : 命令的 NOSRV.+503
部分是常规表达式. 本教程(https://andsky.com/tech/tutorials/using-grep-regular-expressions-to-search-for-text-patterns-in-linux)深入了解有关使用 grep
和常规表达式的内容。
您应该收到一行(或多个行)如下:
1[secondary_label Output]
2Sep 9 21:32:22 centos-s-1vcpu-1gb-nyc3-01 haproxy[4451]: 127.0.0.1:56024 [9/Sep/2020:21:32:22.098] main app/<NOSRV> 0/-1/-1/-1/0 503 212 - - SC-- 1/1/0/0/0 0/0 "GET / HTTP/1.1"
此行符合您提出的弯曲
请求,这意味着 Rsyslog 和 HAProxy 已配置为正确使用共享接口。
结论
在这个快速启动教程中,您配置了 HAProxy 登录到 Unix 域接口. 您还设置了 Rsyslog 来创建和从接口读取,以便两个程序可以相互通信而不打开系统上的任何 TCP/IP 端口。