如何在 Rocky Linux 8 上使用 Rsyslog 配置 HAProxy 日志记录 [Quickstart] (快速入门

介绍

HAProxy,即高可用性代理服务器,是基于TCP和HTTP的广泛使用的代理服务器,在Linux,Solaris和FreeBSD上运行,通过在多个服务器之间分发请求来加载平衡应用程序,并确保应用程序对用户高度可用。

默认情况下,在许多 Rocky Linux 8 安装中,HAProxy 并未配置为将其日志输出写入到一个文件中. 此快速启动教程将解释如何通过使用 Unix 域插槽来配置 HAProxy 登录与 Rsyslog 可靠性、速度和安全性。

前提条件

要完成本教程,您将需要一个运行Rocky Linux 8的服务器。本服务器应该具有非根用户的管理权限。 要设置此功能,请遵循Rocky Linux 8的初始服务器设置指南(https://andsky.com/tech/tutorials/initial-server-setup-with-rocky-linux-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 日志

在 Rocky Linux 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是否在您的Rocky Linux 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

如果你的Rocky Linux 8系统与SELinux在执法模式下配置,那么你需要允许Rsyslog访问HAProxy的chroot目录。

如果你不熟悉SELinux,这个教程系列(https://www.digitalocean.com/community/tutorial_series/an-introduction-to-selinux-on-centos-7)将帮助你学习如何管理和与SELinux互动。尽管它是为CentOS 7写的,系列中的原则和命令同样适用于Rocky Linux 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 rocky-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 端口。

Published At
Categories with 技术
comments powered by Disqus