如何排除 Apache 常见错误

介绍

有三个主要命令,以及一组常见的日志位置,您可以用来开始修复Apache错误。一般来说,当您修复Apache时,您将按照这里所示的顺序使用这些命令,然后检查日志文件以获取特定诊断数据。

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

  • systemctl - 用于控制和通过 systemd 服务管理器与 Linux 服务进行交互。
  • journalctl - 用于查询和查看由 systemd 生成的日志。

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

在 Debian 和 Ubuntu 系统中,Apache 服务和流程名称为apache2,而在 CentOS、Fedora 和其他 RedHat 衍生系统中,Apache 的服务和流程名称为httpd。除了服务和运行流程名称之间的差异,启动、停止和检查 Apache 的状态,以及具有journalctl的日志,在任何使用systemd来管理 Apache 服务的 Linux 系统上都应该是相同的。

「systemctl」命令為Apache

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

在 Ubuntu 和 Debian 系统上运行:

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

-l旗将确保输出不会被剪断或化. -no-pager旗将确保输出将直接到达您的终端,而不需要您进行任何互动来查看它。

 1[secondary_label Output]
 2 apache2.service - The Apache HTTP Server
 3   Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled)
 4  Drop-In: /lib/systemd/system/apache2.service.d
 5           └─apache2-systemd.conf
 6   Active: active (running) since Mon 2020-07-13 14:43:35 UTC; 1 day 4h ago
 7  Process: 929 ExecStart=/usr/sbin/apachectl start (code=exited, status=0/SUCCESS)
 8 Main PID: 1346 (apache2)
 9    Tasks: 55 (limit: 4702)
10   CGroup: /system.slice/apache2.service
11           ├─1346 /usr/sbin/apache2 -k start
12. . .

要检查 CentOS 和 Fedora 系统上运行的 Apache 流程:

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

你应该得到这样的输出:

 1[secondary_label Output]
 2 httpd.service - The Apache HTTP Server
 3   Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
 4   Active: active (running) since Tue 2020-07-14 19:46:52 UTC; 3s ago
 5     Docs: man:httpd.service(8)
 6 Main PID: 21217 (httpd)
 7   Status: "Started, listening on: port 80"
 8    Tasks: 213 (limit: 2881)
 9   Memory: 16.6M
10   CGroup: /system.slice/httpd.service
11           ├─21217 /usr/sbin/httpd -DFOREGROUND
12. . .
13Jul 14 19:46:52 localhost.localdomain httpd[21217]: Server configured, listening on: port 80

如果你的Apache服务器没有显示活跃(运行),如上面的示例所示,但你预计应该这样做,可能会出现错误。

1[secondary_label Example Error Output]
2Active: failed (Result: exit-code) since Tue 2020-07-14 20:01:29 UTC; 1s ago

如果您的 Apache 流程或配置存在问题,您可以使用journalctl命令进一步解决问题。

「journalctl」命令為Apache

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

这些日志与Apache的请求日志和错误日志分开。‘journalctl’显示了描述Apache服务本身的‘systemd’日志,从启动到关闭,以及在途中可能遇到的任何流程错误。

在 Ubuntu 和 Debian 系统上,使用以下命令检查日志:

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

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

1[secondary_label Output]
2Jul 14 20:12:14 ubuntu2004 systemd[1]: Starting The Apache HTTP Server...
3Jul 14 20:12:14 ubuntu2004 systemd[1]: Started The Apache HTTP Server.

如果您正在使用基于 CentOS 或 Fedora 的系统,请使用此版本的命令:

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

您应该获得如下类型的输出:

1[secondary_label Output]
2Jul 14 20:13:09 centos8 systemd[1]: Starting The Apache HTTP Server...
3. . .
4Jul 14 20:13:10 centos8 httpd[21591]: Server configured, listening on: port 80

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

1[secondary_label Example Error Output]
2Jul 14 20:13:37 yourhostname systemd[1]: Failed to start The Apache HTTP Server.

如果你的Apache服务器在journalctl日志中有错误,就像上一个例子那样,那么解决潜在问题的下一步是使用apachectl命令行工具来调查Apache的配置。

使用apachectl解决问题

大多数Linux发行版包括与Apache的apachectl实用程序。

要使用apachectl来解决问题,请使用apachectl configtest命令测试您的Apache配置,该工具将在尝试启动服务器之前审查您的Apache文件并检测任何错误或缺失的设置。

在基于 Ubuntu、Debian、CentOS 和 Fedora 的发行版上运行这样的命令:

1sudo apachectl configtest

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

1[secondary_label Output]
2Syntax OK

根据您的 Linux 发行版,可能会有其他行混合到输出中,但重要的一行是Syntax OK

如果您的 Apache 配置出现错误,例如引用未启用模块的指令,甚至是单个键盘,apachectl 会检测到它并尝试通知您问题。

例如,尝试使用未启用的 Apache 模块的指令会导致apachectl configtest消息如下:

1[secondary_label Example Error Output]
2AH00526: Syntax error on line 232 of /etc/apache2/apache2.conf:
3Invalid command 'SSLEngine', perhaps misspelled or defined by a module not included in the server configuration
4Action 'configtest' failed.
5The Apache error log may have more information.

在本示例中,ssl模块未启用,因此在测试配置时,SSLEngine指令会产生错误。

Apache日志文件

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

若要检查在 Fedora、CentOS 或 RedHat 服务器上解决 Apache 问题时出现的日志文件,请检查 /var/log/httpd/error_log 文件。

如果您正在修复 Debian 或 Ubuntu 衍生系统,请检查 /var/log/apache2/error.log’ 是否存在错误,使用工具如 tail’ 或 `less’。

1sudo tail -n 2 /var/log/apache2/error.log

在 CentOS 或 Fedora 系统中,要检查的日志文件是 /var/log/httpd/error_log

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

1[secondary_label Error Log Examples]
2[Wed Jul 15 01:34:12.093005 2020] [proxy:error] [pid 13949:tid 140150453516032] (13)Permission denied: AH00957: HTTP: attempt to connect to 127.0.0.1:9090 (127.0.0.1) failed
3[Wed Jul 15 01:34:12.093078 2020] [proxy_http:error] [pid 13949:tid 140150453516032] [client 127.0.0.1:42480] AH01114: HTTP: failed to make connection to backend: 127.0.0.1

此输出中的两个行是不同的错误消息,它们都指引导致错误的模块(第一个行中的‘proxy’、第二行中的‘proxy_http’),并包含一个特定于模块的错误代码。第一个,‘AH00957’,表明Apache服务器试图使用‘proxy’模块连接到后端服务器(在这种情况下是9090端的127.0.1),但未能做到这一点。

第二个错误源于第一个错误:AH01114是一个proxy_http模块错误,这也表明Apache无法连接到配置的后端服务器来执行HTTP请求。

这些示例行只是用于示范目的. 如果您正在与您的Apache服务器诊断错误,很可能您的日志中的错误行将具有与这些不同的内容. 无论您的Linux发行版,您的日志中的任何错误行格式将包括相关的Apache模块和错误代码,以及错误的文本描述。

一旦您了解了可能导致 Apache 服务器问题的原因,您可以继续研究并解决问题。错误代码和文本描述特别有用,因为它们为您提供了明确和具体的术语,您可以使用它们来缩小问题可能的原因范围。

结论

解决 Apache 错误可以从诊断服务本身的错误,到找到模块的错误配置选项,或详细检查自定义访问控制规则。本介绍对 Apache 诊断问题解释了如何使用一系列实用程序来帮助缩小错误的可能原因。

然而,作为解决问题的一般顺序,它有助于采用方法,并按照所描述的顺序使用这些工具。使用systemctl开始故障排除以检查Apache服务器的状态。如果您需要更多信息,请使用journalctl命令检查Apache的systemd日志。如果在检查journalctl后,问题仍然不明显,则使用apachectl configtest测试Apache的配置是下一步。

本系列的其他教程将详细研究您在使用 Apache 时可能遇到的一些常见错误。

Published At
Categories with 技术
comments powered by Disqus