如何解决常见的Apache错误

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

介绍

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

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

  • systemctl - 用于通过 systemd 服务管理器控制 Linux 服务并与之交互。
  • journalctl - 用于查询和查看由systemd生成的日志。
  • apachectl - 故障排除时,该命令用于检查 Apache 的配置。

这些命令、如何使用它们,以及您可以在其中找到有关错误的其他信息的 Apache 日志位置,将在以下各节中进一步详细描述。

注意:在 Debian 和 Ubuntu 系统上,Apache 的服务和进程名称是 apache2,而在 CentOS、Fedora 和其他 RedHat 派生的系统上,Apache 的服务和进程名称是 httpd。 除了服务和正在运行的进程名称不同之外,启动、停止和检查 Apache 的状态,以及带有 journalctl 的日志在任何使用 systemd 管理的 Linux 系统上应该是一样的Apache 服务。 请务必为您的 Linux 发行版使用正确的名称。


systemctl Apache 命令

要使用 systemd 服务管理器解决常见的 Apache 错误,第一步是检查系统上 Apache 进程的状态。 以下 systemctl 命令将查询 systemd 以了解 Apache 进程的状态。

在 Ubuntu 和 Debian 系统上运行:

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

-l 标志将确保输出不被截断或省略。 --no-pager 标志将确保输出将直接发送到您的终端,而无需您进行任何交互来查看它。 您应该收到如下输出:

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

要检查 CentOS 和 Fedora 系统上的 Apache 进程,请运行:

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

您应该收到如下输出:

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

无论哪种情况,请记下输出中的 Active 行。 如果您的 Apache 服务器没有显示前面示例中突出显示的 active (running) 但您希望它应该显示,则可能有错误。 通常,如果出现问题,您的输出中会出现如下一行(注意突出显示的 failed 部分):

Example Error OutputActive: 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 显示来自 systemd 的日志,这些日志描述了 Apache 服务本身,从启动到关闭,以及在此过程中可能遇到的任何进程错误。

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

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

--since today 标志将限制命令的输出以仅记录从当天 00:00:00 开始的条目。 使用此选项将有助于限制检查错误时需要检查的日志条目的数量。 您应该收到如下输出:

OutputJul 14 20:12:14 ubuntu2004 systemd[1]: Starting The Apache HTTP Server...
Jul 14 20:12:14 ubuntu2004 systemd[1]: Started The Apache HTTP Server.

如果您使用的是基于 CentOS 或 Fedora 的系统,请使用以下版本的命令:

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

您应该收到如下输出:

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

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

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

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

apachectl 故障排除

大多数 Linux 发行版都包含带有 Apache 的 apachectl 实用程序。 apachectl 是帮助检测和诊断 Apache 配置问题的宝贵工具。

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

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

sudo apachectl configtest

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

OutputSyntax OK

根据您的 Linux 发行版,输出中可能混有其他行,但重要的行是显示 Syntax OK 的行。

如果您的 Apache 配置中存在错误,例如引用未启用的模块的指令甚至是一个拼写错误,apachectl 将检测到它并尝试通知您该问题。

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

Example Error OutputAH00526: Syntax error on line 232 of /etc/apache2/apache2.conf:
Invalid command 'SSLEngine', perhaps misspelled or defined by a module not included in the server configuration
Action 'configtest' failed.
The Apache error log may have more information.

在此示例中,ssl 模块未启用,因此 SSLEngine 指令在测试配置时会生成错误。 最后一行还表示The Apache error log may have more information,这是下一个寻找更详细调试信息的地方。

Apache 日志文件

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

要在对 Fedora、CentOS 或 RedHat 服务器上的 Apache 进行故障排除时检查日志文件中的错误,请检查 /var/log/httpd/error_log 文件。

如果您正在对 Debian 或 Ubuntu 派生系统进行故障排除,请使用 tailless 等工具检查 /var/log/apache2/error.log 是否存在错误。 例如,要使用 tail 查看错误日志的最后两行,请运行以下命令:

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

用您要检查的行数代替命令中的数字 2。 在 CentOS 或 Fedora 系统上,要检查的日志文件是 /var/log/httpd/error_log

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

Error Log Examples[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
[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 模块连接到后端服务器(在本例中为 127.0.0.1 端口 9090),但未能成功。

第二个错误源自第一个错误:AH01114 是 proxy_http 模块错误,也表明 Apache 无法连接到配置的后端服务器以发出 HTTP 请求。

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

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

结论

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

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

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