如何排除常见的 HAProxy 错误

介绍

有三个主要命令,以及一个常见的日志位置,可以用来启动HAProxy错误的故障排除。一般来说,当您正在故障排除HAProxy时,您将按照这里指定的顺序使用这些命令,然后检查日志文件以获取特定诊断数据。

您通常在大多数 Linux 发行版中使用的命令和日志是:

  • systemctl - 用于控制和通过 systemd 服务管理器与 Linux 服务进行交互。
  • journalctl - 用于查询和查看由 systemd 生成的日志。
  • haproxy - 在故障排除时,此命令用于检查 HAProxy 的配置。

这些命令、如何使用它们以及您可以找到有关错误的额外信息的 HAProxy 日志在以下部分中详细描述。

「systemctl」命令為 HAProxy

要使用systemd服务管理器来解决常见的HAProxy错误,第一步是检查系统上的HAProxy流程的状态。

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

-l旗将确保输出不会被剪断或化。 -no-pager旗将确保输出将直接到达您的终端,而不需要您进行任何互动来查看它。 如果您错过了-no-pager旗,您将能够通过使用箭头键或页面上下键滚动输出。

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

您的输出可能略有不同,取决于您正在使用的Linux发行版,但无论如何,请在输出中记住活跃行. 如果您的HAProxy服务器没有显示活跃(运行),如示例输出所突出,但您预计应该这样做,可能会出现错误。

1[secondary_label Example Error Output]
2   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’显示了描述HAProxy服务本身的‘systemd’日志,从启动到关闭,以及在途中可能遇到的任何流程错误。

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

从今天开始的旗帜将限制命令的输出,仅限于当天的 00:00:00 开始的日志条目。使用此选项将有助于限制在检查错误时需要检查的日志条目数量。

1[secondary_label Output]
2Aug 20 19:37:08 d6cdd0c71489 systemd[1]: Starting HAProxy Load Balancer...
3. . .
4Aug 20 19:37:08 d6cdd0c71489 systemd[1]: Started HAProxy Load Balancer.

如果出现错误,输出中会有一个类似于以下的行,Linux发行版之间的主要区别是突出的您的主机名部分:

1[secondary_label Example Error Output]
2Aug 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 的发行版上运行此类命令.如果您使用不同的文件名称或位置,请确保更改对配置文件的路径:

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

运行的 HAProxy 配置将产生如下类型的输出:

1[secondary_label Output]
2Configuration file is valid

如果您的 HAProxy 配置出现错误,例如键入或错误的指令,‘haproxy -c’会检测到它并尝试通知您有关问题。

例如,尝试在错误的位置使用haproxy.cfg中的绑定指令会导致如下信息:

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

在本示例中,绑定指令被错误地放置在全球配置部分内,因此HAProxy会生成未知关键字错误。

学习如何使用haproxy -c来检测和修复错误是有用的,当您正在修复一个现有错误,或在您重新加载HAProxy与编辑的配置可能包含错误之前。

HAProxy 日志文件

HAProxy 日志文件是解决问题非常有用的资源. 一般来说,您在浏览器或其他 HTTP 客户端中收到的任何错误都会在 HAProxy 日志中有相应的条目。

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

在 CentOS、Fedora 和其他 RedHat 衍生 Linux 发行版中,haproxy 默认情况下不会输出到日志文件. 要将 HAProxy 输出日志登录到 `/var/log/haproxy.log,请遵循本快速启动教程, 如何在 CentOS 8 上配置 HAProxy 登录与 Rsyslog

当您使用其日志文件对HAProxy进行故障排除时,请使用工具如尾巴少数检查/var/log/haproxy.log错误,例如,若要使用尾巴查看日志的最后两行,请执行以下命令:

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

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

1[secondary_label Log Examples]
2Aug 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.
3Aug 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 时可能遇到的一些常见错误。

Published At
Categories with 技术
Tagged with
comments powered by Disqus