如何解决常见的 Apache 错误


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

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

本系列中的每个教程都包含对常见 Apache 配置、网络、文件系统或权限错误的描述。本系列首先概述了可用于对 Apache 进行故障排除的命令和日志文件。后续教程详细检查特定错误。

介绍

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

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

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

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

注意:在 Debian 和 Ubuntu 系统上,Apache 服务和进程名称是apache2,而在 CentOS、Fedora 和其他 RedHat 派生系统上,Apache 的服务和进程名称是httpd. 除了服务和正在运行的进程名称之间的差异外,启动、停止和检查 Apache 的状态以及日志journalctlsystemd用于管理 Apache 服务的任何 Linux 系统上都应该相同请确保为您的 Linux 发行版使用正确的名称。

systemctl Apache 命令

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

在 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 Output
Active: failed (Result: exit-code) since Tue 2020-07-14 20:01:29 UTC; 1s ago

如果您的 Apache 进程或配置存在问题,您可以使用该journalctl命令进一步排除故障

journalctl Apache 命令

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

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

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

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

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

Output
Jul 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

您应该收到如下输出:

Output
Jul 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 Output
Jul 14 20:13:37 yourhostname systemd[1]: Failed to start The Apache HTTP Server.

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

故障排除 apachectl

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

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

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

  • sudo apachectl configtest

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

Output
Syntax OK

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

如果您的 Apache 配置中存在错误,例如引用未启用模块的指令或什至是一个错字,apachectl则会检测到它并尝试通知您有关问题的信息。

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

Example Error Output
AH00526: 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 派生系统进行故障排除,请/var/log/apache2/error.log使用tail或 之类的工具检查错误less例如,要使用 查看错误日志的最后两行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模块连接到后端服务器(在本例中为端口 9090 上的 127.0.0.1),但未能成功。

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

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

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

结论

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

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

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

觉得文章有用?

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