如何解决常见的 HAProxy 错误


该系列的一部分:
常见的 HAProxy 错误

本教程系列介绍了如何对您在使用HAProxy TCP 和 HTTP 代理服务器时可能遇到的一些最常见错误进行故障排除和修复

本系列中的每个教程都包含对常见 HAProxy 配置、网络、文件系统或权限错误的描述。该系列首先概述了可用于对 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大多数 Linux 发行版上 HAProxy 进程的状态。

  • 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 命令

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

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

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

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

Output
Aug 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 Output
Aug 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 配置将产生如下输出:

Output
Configuration file is valid

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

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

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 进行故障排除时,请/var/log/haproxy.log使用类似tail的工具检查错误less例如,要使用查看日志的最后两行tail,请运行以下命令:

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

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

Log Examples
Aug 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 服务器的状态。如果您需要更多信息,请systemd使用该journalctl命令检查HAProxy日志如果检查后问题仍然不明显journalctlhaproxy -c -f /etc/haproxy/haproxy.cfg则下一步使用测试HAProxy的配置最后,对于深入的故障排除,检查 HAProxy 的日志文件通常会指出一个特定的错误,以及有用的诊断消息和错误代码。

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

觉得文章有用?

点个广告表达一下你的爱意吧 !😁