Apache配置错误AH00558:无法可靠地确定服务器的完全限定域名

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

介绍

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

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

如果您已经确定您的 Apache 服务器受到 AH00558 消息的影响,并且您想跳过故障排除步骤,那么本教程末尾的 设置全局服务器名称指令 步骤说明了如何解决该消息.

使用 systemctl 进行故障排除

AH00558: Could not reliably determine the server's fully qualified domain name 消息进行故障排除的第一步是使用 systemctl 检查 Apache 的状态。 systemctl 的输出在许多情况下将包含解析消息所需的所有信息。

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

Ubuntu 和 Debian 系统

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

在 CentOS Fedora 和 RedHat 派生系统上,使用以下命令检查 Apache 的状态:

CentOS 和 Fedora 系统

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

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

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

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 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.02。 如果您正在对 AH00558 消息进行故障排除,则检测到的 IP 地址可能不同,或者它可能是人类可读的 DNS 名称。

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

如果您的 systemctl 输出未指示可用于 ServerName 指令的值,本教程的下一部分将介绍如何使用 journalctl 定位 AH00558 消息。

使用 journalctl 进行故障排除

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

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

您将使用的第二个标志与您在 systemctl 中使用的 --no-pager 选项相同,它将立即将整个日志输出到您的屏幕。

在 Ubuntu 和 Debian 派生系统上,运行以下命令:

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

在 CentOS、Fedora 和 RedHat 派生系统上,使用以下命令检查日志:

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 错误的确认,您可以继续 设置全局服务器名称指令 来解决问题。

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

使用 apachectl 进行故障排除

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

要检查 Apache 配置中是否有 AH00558 消息,请运行以下命令:

sudo apachectl configtest

如果您的服务器受到 AH00558 错误消息的影响,您应该会收到如下输出:

OutputAH00558: 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 指令将传入的 HTTP 请求映射到使用 VirtualHost 指令 的 IP 地址或 DNS 主机名,以便使用单个服务器处理多个站点的请求。

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

为了最大限度地兼容各种 Apache 配置,请将 127.0.0.1 的值用于全局 ServerName 指令。 如果需要,您可以使用与服务器配置相对应的不同 IP 地址或 DNS 名称,但使用 127.0.0.1 是最安全的。

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

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

在 CentOS、Fedora 和 RedHat 派生系统上,使用 nano 或您喜欢的文本编辑器以 root 权限打开 /etc/httpd/conf/httpd.conf 文件:

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 以测试配置是否有效。

sudo apachectl configtest

成功的 apachectl configtest 调用应该会产生如下输出:

OutputSyntax OK

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

在 Ubuntu 和 Debian 派生系统上,运行以下命令:

sudo systemctl reload apache2.service

在 CentOS、Fedora 和 RedHat 派生系统上,使用此命令重新加载 Apache 的配置:

sudo systemctl reload httpd.service

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

结论

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

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

如果您想了解更多关于 Apache 如何使用 ServerName 指令的信息,请参阅关于 Name-Based Virtual Hosts 的 Apache 文档更详细地解释了该指令。