Apache 配置报错 AH00558: 无法可靠确定服务器完全限定域名怎么办?

文章导读
当 Apache 未配置全局 ServerName 指令时,会生成一个 Apache AH00558: Could not reliably determine the server's fully qualified domain name 消息。该消息主要用于信息提示,AH00558 错误不会阻止 Apache 正常运行。
📋 目录
  1. 引言
  2. 关键要点
  3. 使用 systemctl 进行故障排除
  4. 使用 journalctl 进行故障排除
  5. 使用 apachectl 进行故障排除
  6. 设置全局 ServerName 指令
  7. FAQ
  8. 结论
A A

引言

当 Apache 未配置全局 ServerName 指令时,会生成一个 Apache AH00558: Could not reliably determine the server's fully qualified domain name 消息。该消息主要用于信息提示,AH00558 错误不会阻止 Apache 正常运行。

在本教程中,您将学习如何使用本系列开头《如何排查常见 Apache 错误》教程中描述的方法来检测 AH00558 消息。您还将学习如何设置 ServerName 指令来解决该消息。

如果您已经确定您的 Apache 服务器受到 AH00558 消息影响,并且想跳过排查步骤,本教程末尾的“设置全局 ServerName 指令”步骤将解释如何解决该消息。

关键要点

  • AH00558 是一个信息性启动消息:即使出现该消息,Apache 仍会继续运行并处理请求。
  • 根本原因是缺少全局 ServerName 指令:在主 Apache 配置文件中添加一行如 ServerName 127.0.0.1 即可抑制该消息。
  • systemctljournalctlapachectl configtest 是大多数 Linux 发行版上检测和确认 AH00558 消息的足够工具。
  • 相同的全局 ServerName 127.0.0.1 模式适用于 Ubuntu、Debian、Rocky Linux、Fedora 和 Red Hat;仅配置文件路径不同。

使用 systemctl 进行故障排除

在排查 AH00558: Could not reliably determine the server's fully qualified domain name 消息时,第一步是使用 systemctl 检查 Apache 的状态。systemctl 的输出在许多情况下会包含您解决该消息所需的所有信息。

在 Ubuntu 和基于 Debian 的 Linux 发行版上,运行以下命令检查 Apache 的状态:

Ubuntu 和 Debian 系统
  1. sudo systemctl status apache2.service -l --no-pager

在 Rocky Linux、Fedora 和基于 Red Hat 的系统上,使用此命令检查 Apache 的状态:

Rocky 和 Red Hat 系统
  1. sudo systemctl status httpd.service -l --no-pager

-l 标志将确保 systemctl 输出整行内容,而不是用省略号 () 替换长行。--no-pager 标志将把整个日志输出到屏幕上,而不会调用像 less 这样的工具(该工具一次只显示一屏内容)。

您应该收到类似于以下的输出:

输出
● 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 Wed 2020-07-29 14:30:03 UTC; 33min ago Process: 34 ExecStart=/usr/sbin/apachectl start (code=exited, status=0/SUCCESS) Main PID: 46 (apache2) Tasks: 55 (limit: 2344) CGroup: /system.slice/apache2.service ├─46 /usr/sbin/apache2 -k start ├─47 /usr/sbin/apache2 -k start └─48 /usr/sbin/apache2 -k start Jul 29 14:30:03 68e2cf19f3f1 systemd[1]: Starting The Apache HTTP Server... Jul 29 14:30:03 68e2cf19f3f1 apachectl[34]: AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message Jul 29 14:30:03 68e2cf19f3f1 systemd[1]: Started The Apache HTTP Server.

包含 AH00558 消息的突出显示行是最重要的。它本质上告诉您,Apache 在其配置文件中找不到有效的 ServerName 指令,因此它将使用它检测到的第一个 IP 地址。在这个例子中,这是服务器的公共 IP 地址:172.17.0.2。如果您正在排查 AH00558 消息,检测到的 IP 地址可能不同,或者它可能是一个人类可读的 DNS 名称。

如果您的 systemctl 输出包含任何 IP 地址或主机名的自动检测值,请跳到本教程的最后一部分,设置全局 ServerName 指令 来解决问题。在该部分中,您将使用 localhost 的 IP 地址 127.0.0.1 为 Apache 配置一个安全的默认 ServerName 值。

如果您的 systemctl 输出没有显示您可以用于 ServerName 指令的值,本教程的下一部分将解释如何使用 journalctl 检查 systemd 日志以定位 AH00558 消息。

使用 journalctl 进行故障排除

要检查 Apache 的 systemd 日志,你将使用 journalctl 命令。调用 journalctl 时,有两个特定的标志可以帮助你在大量日志条目中定位特定消息。

你将添加到 journalctl 调用中的第一个标志是 --since today 标志。它将命令的输出限制为仅从当天 00:00:00 开始的日志条目。使用此选项有助于在检查错误时限制需要查看的日志条目量。

你将使用的第二个标志是与 systemctl 一起使用的相同的 --no-pager 选项,它将一次性将整个日志输出到你的屏幕上。

在 Ubuntu 和基于 Debian 的系统上,运行以下命令:

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

在 Rocky Linux、Fedora 和基于 Red Hat 的系统上,使用此命令检查日志:

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

如果你的 Apache 服务器生成了 AH00558 消息,请在 journalctl 命令输出中查找类似以下的行:

Output
-- Logs begin at Wed 2020-07-29 14:30:02 UTC, end at Wed 2020-07-29 14:45:03 UTC. -- . . . Jul 29 14:30:03 68e2cf19f3f1 systemd[1]: Starting The Apache HTTP Server... Jul 29 14:30:03 68e2cf19f3f1 apachectl[34]: AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message Jul 29 14:30:03 68e2cf19f3f1 systemd[1]: Started The Apache HTTP Server.

输出的第二行就是 AH00558 消息。该行包含服务器的公共 IP 地址,这是 Apache 在运行时自动检测并设置为默认值的地址。以此消息作为 AH00558 错误的确认,你可以继续到设置全局 ServerName 指令来解决问题。

否则,下一节将解释如何使用 apachectl 命令诊断 AH00558 错误消息。

使用 apachectl 进行故障排除

AH00558: Could not reliably determine the server's fully qualified domain name 错误可以使用 Apache 的 apachectl 实用程序检测。通过 apachectl,你可以在重新加载或重启 Apache 之前捕获此类消息,从而避免必须搜索 systemctljournalctl 日志来定位错误。

要检查你的 Apache 配置是否包含 AH00558 消息,请运行以下命令:

  1. sudo apachectl configtest

如果你的服务器受到 AH00558 错误消息影响,你应该收到类似以下的输出:

Output
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message Syntax OK

与本教程前几节中使用 systemctljournalctl 定位 AH00558 消息类似,前例中突出显示的包含 AH00558 消息的那一行是最重要的。再注意,此示例中的 IP 地址 172.17.0.2 在你的服务器上可能不同。

本教程的下一节将解释如何设置 ServerName 指令来解决 AH00558 错误消息。

设置全局 ServerName 指令

要解决 AH00558: Could not reliably determine the server's fully qualified domain name 错误消息,您需要在 Apache 配置中添加 ServerName 指令。Apache 使用 ServerName 指令通过 VirtualHost 指令将传入的 HTTP 请求映射到 IP 地址或 DNS 主机名,从而使用单个服务器处理多个站点的请求。

错误消息指出,还应设置一个全局 ServerName 指令。这样做可以确保 Apache 能够优雅地处理那些无法映射到 VirtualHost 的传入请求,而不会产生额外的错误。

为了与各种 Apache 配置具有最大兼容性,请将全局 ServerName 指令的值设置为 127.0.0.1。如果需要,您可以使用与服务器配置对应的其他 IP 地址或 DNS 名称,但对于大多数部署,使用回环地址 127.0.0.1 是最安全的,因为它提供了一个稳定的默认值,而不会改变 VirtualHost 定义如何路由外部流量。

在 Ubuntu 和基于 Debian 的系统上,使用 nano 或您首选的文本编辑器以 root 权限打开 /etc/apache2/apache2.conf 文件:

  1. sudo nano /etc/apache2/apache2.conf

在文件末尾添加一行包含 ServerName 127.0.0.1 的内容:

/etc/apache2/apache2.conf
. . .
# Include the virtual host configurations:
IncludeOptional sites-enabled/*.conf

# vim: syntax=apache ts=4 sw=4 sts=4 sr noet
ServerName 127.0.0.1

在 Rocky Linux、Fedora 和基于 Red Hat 的系统上,使用 nano 或您首选的文本编辑器以 root 权限打开 /etc/httpd/conf/httpd.conf 文件:

  1. sudo nano /etc/httpd/conf/httpd.conf

在文件末尾添加 ServerName 127.0.0.1 行:

/etc/httpd/conf/httpd.conf
. . .
# Supplemental configuration
#
# Load config files in the "/etc/httpd/conf.d" directory, if any.
IncludeOptional conf.d/*.conf
ServerName 127.0.0.1

完成后保存并关闭文件。如果您使用了 nano,请按 CTRL + XY,然后按 ENTER

在向配置添加 ServerName 指令后,运行 apachectl 来测试配置是否有效。

  1. sudo apachectl configtest

成功的 apachectl configtest 执行应产生如下输出:

Output
Syntax OK

现在,您可以使用适用于您的 Linux 发行版的相应 systemctl reload 命令重新加载 Apache 配置。

在 Ubuntu 和基于 Debian 的系统上,运行以下命令:

  1. sudo systemctl reload apache2.service

在 Rocky Linux、Fedora 和基于 Red Hat 的系统上,使用此命令重新加载 Apache 配置:

  1. sudo systemctl reload httpd.service

重新加载 Apache 后,AH00558 错误消息将不再出现在您的日志中。您可以通过运行本教程中演示的任意三个 systemctljournalctlapachectl 命令来确认消息已被静音。

FAQ

AH00558 是严重错误还是只是警告?

AH00558 实际上是一个警告,表明 Apache 无法找到全局 ServerName 指令,并选择了回退值。Apache 仍然会启动并响应 HTTP 请求,但该消息表明您的配置不完整。

如果忽略 AH00558 消息会怎样?

如果您忽略 AH00558 消息,Apache 将继续使用自动检测的 IP 地址或主机名作为默认 ServerName。这通常可以工作,但如果您的网络配置发生变化,可能会导致日志输出混乱和不可预测的行为。

127.0.0.1 用作全局 ServerName 为 Apache 提供了一个稳定、本地专用的地址,几乎在每个系统上都存在。此值避免了将配置绑定到特定的公共 IP 地址或 DNS 记录,并且作为未匹配请求的安全默认值效果良好。

此修复方案在 Ubuntu/Debian 和 Rocky Linux、Fedora 以及 Red Hat 系统上都有效吗?

是的,添加全局 ServerName 127.0.0.1 条目可以解决 Ubuntu、Debian、Rocky Linux、Fedora 和 Red Hat 上的 AH00558 问题。唯一的区别是您编辑的配置文件,例如基于 Debian 的系统上是 /etc/apache2/apache2.conf,基于 Red Hat 的系统上是 /etc/httpd/conf/httpd.conf

我可以使用自己的域名代替 127.0.0.1 作为 ServerName 吗?

您可以将全局 ServerName 设置为正确解析到您服务器的 DNS 主机名或其他 IP 地址。如果选择域名,请确保其解析一致,否则优先使用 127.0.0.1 以避免 DNS 或外部寻址变化时出现问题。

系统重启后 AH00558 消息会重新出现吗?

一旦您添加了全局 ServerName 指令并重新加载 Apache,该更改将存储在配置文件中,并在重启后持久存在。除非删除该指令或替换配置文件,否则 AH00558 消息不会返回。

结论

在本教程中,您了解了 AH00558: Could not reliably determine the server's fully qualified domain name 错误消息。虽然这些消息不会阻止 Apache 运行,但可以通过设置全局 ServerName 指令来解决。

您学习了如何使用 systemctljournalctlapachectl 命令搜索 AH00558 错误消息。最后,您学习了如何在各种 Linux 发行版上编辑 Apache 配置以静默这些消息。

如果您想了解更多关于 Apache 如何使用 ServerName 指令的信息,Apache 关于基于名称的虚拟主机的文档对此指令有更详细的解释。