如何解决常见的HAProxy错误

来自菜鸟教程
跳转至:导航、​搜索

介绍

您可以使用三个主要命令和一个通用日志位置开始对 HAProxy 错误进行故障排除。 通常,当您对 HAProxy 进行故障排除时,您将按照此处指示的顺序使用这些命令,然后检查日志文件中的特定诊断数据。

您通常用于在大多数 Linux 发行版中对 HAProxy 进行故障排除的命令和日志是:

  • systemctl - 用于通过 systemd 服务管理器控制 Linux 服务并与之交互。
  • journalctl - 用于查询和查看由systemd生成的日志。
  • haproxy - 故障排除时,此命令用于检查 HAProxy 的配置。
  • /var/log/haproxy.log - 此文件包含来自 HAProxy 本身的日志条目,详细说明服务器正在处理的 TCP 和 HTTP 流量。

这些命令、如何使用它们以及 HAProxy 的日志(您可以在其中找到有关错误的其他信息)在以下部分中进行了更详细的描述。

systemctl HAProxy 命令

要使用 systemd 服务管理器解决常见的 HAProxy 错误,第一步是检查系统上 HAProxy 进程的状态。 以下 systemctl 命令将查询 systemd 以了解 HAProxy 在大多数 Linux 发行版上的进程状态。

sudo systemctl status haproxy.service -l --no-pager

-l 标志将确保输出不被截断或省略。 --no-pager 标志将确保输出将直接发送到您的终端,而无需您进行任何交互来查看它。 如果省略 --no-pager 标志,您将能够使用箭头键或上下翻页键滚动输出。 要退出寻呼机,请使用 q 键。 您应该收到如下输出:

Output● haproxy.service - HAProxy Load Balancer
   Loaded: loaded (/lib/systemd/system/haproxy.service; enabled; vendor preset: enabled)
   Active: active (running) since Thu 2020-08-20 19:30:11 UTC; 5s ago
     Docs: man:haproxy(1)
           file:/usr/share/doc/haproxy/configuration.txt.gz
  Process: 487 ExecStartPre=/usr/sbin/haproxy -f $CONFIG -c -q $EXTRAOPTS (code=exited, status=0/SUCCESS)
 Main PID: 488 (haproxy)
    Tasks: 2 (limit: 2344)
. . .
Aug 19 21:31:46 d6cdd0c71489 systemd[1]: Started HAProxy Load Balancer.

根据您使用的 Linux 发行版,您的输出可能会略有不同,但无论如何,请记下输出中的 Active 行。 如果您的 HAProxy 服务器未在示例输出中突出显示 active (running) 但您希望它应该显示,则可能存在错误。 通常,如果出现问题,您的输出中会出现如下一行(注意突出显示的 failed 部分):

Example Error Output   Active: failed (Result: exit-code) since Thu 2020-08-20 19:32:26 UTC; 6s ago

如果您的 HAProxy 进程或配置有问题,您可以使用 journalctl 命令进一步排除故障。

journalctl HAProxy 命令

要检查 HAProxy 的 systemd 日志,您可以使用 journalctl 命令。 HAProxy 的 systemd 日志通常会指示启动或管理 HAProxy 进程是否存在问题。

这些日志与 HAProxy 的请求和错误日志是分开的。 journalctl 显示来自 systemd 的日志,这些日志描述了 HAProxy 服务本身,从启动到关闭,以及在此过程中可能遇到的任何进程错误。

sudo journalctl -u haproxy.service --since today --no-pager

--since today 标志将限制命令的输出以仅记录从当天 00:00:00 开始的条目。 使用此选项将有助于限制检查错误时需要检查的日志条目的数量。 您应该收到如下输出(根据您的 Linux 发行版,StartingStarted 行之间可能有几行额外的行):

OutputAug 20 19:37:08 d6cdd0c71489 systemd[1]: Starting HAProxy Load Balancer...
. . .
Aug 20 19:37:08 d6cdd0c71489 systemd[1]: Started HAProxy Load Balancer.

如果出现错误,您将在输出中看到类似于以下内容的行,Linux 发行版之间的主要区别是突出显示的 yourhostname 部分:

Example Error OutputAug 20 19:32:25 yourhostname systemd[1]: Failed to start HAProxy Load Balancer.

如果您的 HAProxy 服务器在 journalctl 日志中出现与上一个示例类似的错误,那么解决可能问题的下一步是使用 haproxy 命令行工具调查 HAProxy 的配置。

haproxy 故障排除

要解决 HAProxy 配置问题,请使用 haproxy -c 命令。 该工具将解析您的 HAProxy 文件并在尝试启动服务器之前检测任何错误或缺少的设置。

在基于 Ubuntu、Debian、CentOS 和 Fedora 的发行版上运行这样的命令。 如果您使用不同的文件名或位置,请务必更改配置文件的路径:

sudo haproxy -c -f /etc/haproxy/haproxy.cfg

有效的 HAProxy 配置将产生如下输出:

OutputConfiguration file is valid

如果您的 HAProxy 配置中有错误,例如拼写错误或错误放置的指令,haproxy -c 将检测到它并尝试通知您该问题。

例如,尝试在错误位置使用 haproxy.cfg 中的 bind 指令将导致如下消息:

Example Error Output[ALERT] 232/194354 (199) : parsing [/etc/haproxy/haproxy.cfg:13] : unknown keyword 'bind' in 'global' section
[ALERT] 232/194354 (199) : Error(s) found in configuration file : /etc/haproxy/haproxy.cfg
[ALERT] 232/194354 (199) : Fatal errors found in configuration.

在此示例中,bind 指令被错误地放置在 global 配置部分中,因此 HAProxy 会生成 unknown keyword 错误。 该消息还包括行号 13,以便您可以编辑文件并修复或删除错误行,而无需搜索文件。

学习如何使用 haproxy -c 来检测和修复错误在解决现有错误时或在使用可能包含错误的已编辑配置重新加载 HAProxy 之前很有用。

HAProxy 日志文件

HAProxy 日志文件是非常有用的故障排除资源。 通常,您在浏览器或其他 HTTP 客户端中收到的任何错误都会在 HAProxy 的日志中具有相应的条目。 有时 HAProxy 还会将与配置相关的错误和其他调试信息输出到其日志文件中。

在基于 Ubuntu 和 Debian 的 Linux 发行版上,haproxy 软件包包含在 /var/log/haproxy.log 中配置日志输出的脚本。

在 CentOS、Fedora 和其他 RedHat 派生的 Linux 发行版上,haproxy 默认不输出到日志文件。 要将 HAProxy 输出日志记录到 /var/log/haproxy.log,请遵循此快速入门教程,如何在 CentOS 8 上使用 Rsyslog 配置 HAProxy 日志记录。

当您使用其日志文件对 HAProxy 进行故障排除时,请使用 tailless 等工具检查 /var/log/haproxy.log 是否存在错误。 例如,要使用 tail 查看日志的最后两行,请运行以下命令:

sudo tail -n 2 /var/log/haproxy.log

无论您使用哪个 Linux 发行版运行 HAProxy 服务器,示例错误都将类似于以下几行:

Log ExamplesAug 20 19:36:21 d6cdd0c71489 haproxy[19202]: [ALERT] 258/134605 (19202) : Proxy 'app', server 'app1' [/etc/haproxy/haproxy.cfg:88] verify is enabled by default but no CA file specified. If you're running on a LAN where you're certain to trust the server's certificate, please set an explicit 'verify none' statement on the 'server' line, or use 'ssl-server-verify none' in the global section to disable server-side verifications by default.
Aug 20 19:36:22 d6cdd0c71489 haproxy[4451]: 203.0.113.1:54428 [20/Aug/2020:19:36:22.288] main app/<NOSRV> 0/-1/-1/-1/1 503 212 - - SC-- 1/1/0/0/0 0/0 "GET / HTTP/1.1"

这些示例行仅用于说明目的。 如果您使用 HAProxy 服务器诊断错误,则日志中的行很可能具有与这些不同的内容。 有些行将包括成功响应和其他非关键诊断条目。

无论您的 Linux 发行版如何,HAProxy 日志中的行格式都将包括返回给客户端的任何 HTTP 状态代码,以及请求 IP 和后端服务器的状态。

了解可能导致 HAProxy 服务器出现问题的原因后,您可以继续研究和解决问题。 HTTP 状态代码和文本描述特别有用,因为它们为您提供了明确和具体的术语,您可以使用这些术语来缩小问题的可能原因范围。

结论

对 HAProxy 错误进行故障排除的范围包括诊断服务本身的错误、定位模块的错误配置选项,或者详细检查自定义的访问控制规则。 这篇关于诊断 HAProxy 问题的介绍解释了如何使用许多实用程序来帮助缩小可能的错误原因。 通常,您将以相同的顺序使用这些实用程序,尽管您总是可以跳过一些,或者如果您大致了解问题可能是什么,则可以直接从检查日志开始。

但是,作为故障排除的一般顺序,有条不紊地按照描述的顺序使用这些工具会有所帮助。 使用 systemctl 开始故障排除以检查 HAProxy 服务器的状态。 如果您需要更多信息,请使用 journalctl 命令检查 HAProxy 的 systemd 日志。 如果检查 journalctl 后问题仍然不明显,下一步是使用 haproxy -c -f /etc/haproxy/haproxy.cfg 测试 HAProxy 的配置。 最后,为了深入故障排除,检查 HAProxy 的日志文件通常会指示特定错误,并带有有用的诊断消息和错误代码。

本系列的其余教程将更详细地检查您在使用 HAProxy 时可能遇到的一些常见错误。