Apache错误“无法可靠地确定服务器的完全限定域名”

当我使用命令重新启动我的Apache服务器时
sudo /etc/init.d/apache2 restart

我遇到了以下错误:
Restarting web server apache2
apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1 for ServerName
... waiting apache2:
Could not reliably determine the server's fully qualified domain name, using 127.0.1.1 for ServerName

服务器是否使用127.0.1.1而不是127.0.0.1?这个错误是由什么引起的?
14个回答

13.04及更早版本

这只是一个友好的警告,不是真正的问题(也就是说,某些功能无法正常工作)。

如果你去到:

/etc/apache2/apache2.conf

插入:

和插入:

ServerName localhost   

然后在终端中输入以下命令来重新启动Apache:
sudo systemctl reload apache2

通知将会消失。

如果你在 /etc/hostname 文件中有一个名字,你也可以使用那个名字代替 localhost


如果它在你的/etc/hosts文件中,它会使用127.0.1.1。
127.0.0.1 localhost
127.0.1.1 myhostname

首选方法

解决Apache问题

如果您遇到此错误:

apache2: Could not determine the server's fully qualified domain name, 
using 127.0.0.1 for ServerName

然后在命令行中使用文本编辑器,例如"sudo nano",或者在桌面上使用"gksudo gedit"来创建一个新文件。
sudo nano /etc/apache2/conf.d/fqdn

或者

gksu "gedit /etc/apache2/conf.d/fqdn"

然后添加
ServerName localhost

将内容添加到文件并保存。这一切可以通过以下单个命令完成:
 echo "ServerName localhost" | sudo tee /etc/apache2/conf.d/fqdn

但在Ubuntu 14.04上:
 echo "ServerName localhost" | sudo tee /etc/apache2/conf-available/fqdn.conf
 sudo a2enconf fqdn

不要忘记加上“.conf”(没有的话将无法工作)。

3这也在Ubuntu LAMP设置文档中提到了,用于解决Apache问题。他们建议在/etc/apache2/conf.d/目录下创建一个名为fqdn的文件,并在其中添加ServerName localhost - icc97
非常好的答案 - 但我也建议将其放在conf.d目录中 :) - cwd
3在我安装了14.04中的lamp-server^之后,/etc/apache2/conf.d/不存在。 - redanimalwar
@redanimalwar 如果您使用的是13.10或更新版本,请参考下面@Starx的回答 - Dan
3对于最后一步(在14.04中创建符号链接),我建议使用sudo a2enconf fqdn,尽管从技术上讲应该是一样的。 - nuala
@Rinzwind,你解释了如何修复这个问题,但为什么会发生这种情况呢? - JohnMerlino
@JohnMerlino 为什么?因为这是设置 Apache 的一部分! - Rinzwind
为什么不在/etc/hosts中配置服务器FQDN? - HorusKol
@HorusKol 因为这不再是首选的方法。我本来会在后面补充,但areeda已经涵盖了那个方法(而且我会抄袭她的答案)。 - Rinzwind
@Rinzwind 为什么这不是首选的方法?将此设置在服务器配置级别而不是Apache服务配置中会不会更好呢? - HorusKol
@Rinzwind 我做了一些工作来消除那个警告,但是在重新启动apache后,我在终端日志中看到了“失败”的字样。我重启了系统,但什么也没改变,再次重启apache的服务service apache2 restart后,我又看到了“失败”的字样! - Netmoon
我在尝试这个方法后遇到了一个“无法绑定到0.0.0.0:80”的错误,但是在我执行了sudo killall apache2命令之后,再执行sudo service restart apache2命令,问题就解决了。谢谢! - don bright
在Ubuntu 14.04上,第一部分(添加有关apache2.conf的信息)对我起了作用。 - Dennis Braga
Ubuntu 10.04 + Apache 2.2没有fqdn文件。如何解决这个问题? - petertc
升级您的系统,因为10.04已不再是受支持的Ubuntu版本。但是...我认为答案的第一部分应该适用于Apache 2.2(?)。 - Rinzwind
"而且如果您的/etc/hosts文件中有127.0.1.1,则使用它"; 这只适用于Ubuntu吗?还是其他操作系统也会这样做? - Pacerier
在Ubuntu 14.04上,我编辑了现有文件/etc/apache2/apache2.conf,添加了ServerName localhost,然后执行了sudo service apache2 restart,结果成功了 - 不再有警告。在进行这个操作之前,编辑/etc/apache2/httpd.conf没有任何效果(我通过在添加到apache2.conf后的行中删除该文件并重新启动服务器来确认)。 - therobyouknow
我确认了在Ubuntu 14.04上也适用于Ubuntu 16.04.1 LTS,其他的都不适用。警告消失了。 - JGlass

13.10或更新版本
自Apache 2.4起 - 默认可用于13.10版本 - 您不能再使用在conf.d目录中添加配置文件的方法。
Apache不再使用conf.d目录。所有的配置文件都存储在/etc/apache2/conf-available目录中,而且所有的配置文件现在应该具有.conf扩展名。
为了解决Apache 2.4中的这个问题,我们需要在conf-available目录中创建一个配置文件。例如,servername.conf。
sudo vi /etc/apache2/conf-available/servername.conf

在这里我们只需要添加一行代码

ServerName localhost

你可以将前两个命令合并成一个,使用以下方式:
echo "ServerName localhost" | sudo tee /etc/apache2/conf-available/servername.conf

如果你想使用一个域名或者其他根据需求的名称,那没问题,只需要将localhost替换为你需要的内容。接下来,你需要启用这个配置。为此,你需要运行以下命令:
sudo a2enconf servername

a2enconf 是一个在 Apache 2.4 中启用配置文件的命令。还请注意,上述命令中的 servername 是来自配置文件名 servername.conf。如果您的配置文件是 ngenericserver.conf,那么您需要输入 sudo a2enconf ngenericserver

完成后重新加载服务器,上述消息将不再出现。

sudo service apache2 reload

或者

sudo apache2ctl graceful

现在,您将看到此后不会再显示该消息,并且问题将得到解决。

4有人知道如何让Apache说出它遇到问题的哪个配置文件吗?我不明白为什么开发人员从来没有考虑在错误信息中加入这个 - 这几乎不需要多少代码! - John Y
如果我有这个服务器的Internet fqdm,这是放置它的地方吗?也就是说,我应该用myhost.org替换localhost吗? - CPBL
1@CPBL 这将是所有网站的默认服务器名称。如果您只有一个网站,那么这就是您需要做的全部。如果您在服务器上有多个网站,则还需要在各自的虚拟主机配置中为每个网站添加servername指令。 - Dan
1适用于14.04 LTS。 - Parto
1你引用的链接好像失效了,请修复一下。 - Fredrick Gauss
这对我有帮助,谢谢! - Danniel Little
当从源代码构建时,像a2enconf这样的a2*脚本在哪里? - Brian Wiley
我在这里找到了一些信息,如果你是从源代码构建的话,你需要编辑 PREFIX/conf/httpd.conf 文件,其中 PREFIX 是你安装它的位置,并且还需要编辑 servername 变量。 - Brian Wiley

Apache2也可以从正确配置的系统主机名中获取FQDN,而不是硬编码到apache配置文件中。如果主机名更改,硬编码将导致混淆。实际上,在httpd.conf或任何apache配置文件中都不需要任何ServerName指令。
在/etc/hosts中添加以下内容:
# IPv4 and IPv6 localhost aliases
127.0.0.1 hostname.domainname.com  hostname  localhost
::1       hostname.domainname.com  hostname  localhost

其中hostname.domainname.com是您机器的完全限定域名。

除了在/etc/hostname/或使用hostnamectl正确配置主机名之外,这也将有助于您机器上的其他服务正常运行(例如登录提示,显示This is hostname.domainname.com而不是This is hostname.unknown_domain)。


6+1 对于“正确配置的系统主机名”。我想要正确配置服务器。这也修复了日志中的错误[warn] RSA 服务器证书的通用名称 (CN) <fqdn> 与服务器名称不匹配! - transistor1
你认为这个能在Apache 2.2.22上运行吗?我还是得到了“无法可靠地确定服务器的完全限定域名,使用127.0.1.1作为ServerName”的错误信息。 - David Winiecki
hostname localhost 应该是指 myubuntuservername localhost 吗?还是指字符串字面值 hostname localhost?你在回答中没有明确说明。 - Jonathan
3这应该是被接受的答案。看起来你可能需要将FQDN与静态IP地址关联起来,而不是127.0.0.1 - Skippy le Grand Gourou
1这对我来说是最好的答案,在Ubuntu 18.04上。 不过我希望文档能够一致,尽管"完全限定域名"在这里或任何地方都不是相同的术语。如果我的完全限定域名是google.com,而我的服务器名是google,那么我在/etc/hosts文件中的条目应该是127.0.0.1 google.com google。我可以替换localhost行,并在此行末尾添加local host,如果我愿意的话。 我使用了这个链接:https://www.digitalocean.com/community/tutorials/how-to-install-the-apache-web-server-on-ubuntu-18-04 - TheArchitecta

  • 打开终端
  • 打开/etc/apache2/httpd.conf文件:

    sudo editor /etc/apache2/httpd.conf # [1]
    
  • 默认情况下,该文件应该是空白的。只需添加以下一行:

    ServerName localhost
    
  • 保存文件并退出

  • 重新启动服务器

    sudo service apache2 restart
    

[1] 打开默认编辑器,输入命令 sudo update-alternatives --config editor 查看。

执行最后一个命令后出现以下错误:** 重新启动Web服务器apache2 /usr/sbin/apache2ctl: 87: ulimit: 无法设置限制(操作不允许)/usr/sbin/apache2ctl: 87: ulimit: 无法设置限制(操作不允许) (13)权限被拒绝:make_sock: 无法绑定到地址0.0.0.0:80 没有可用的监听套接字,正在关闭 无法打开日志文件 启动操作失败。 Apache错误日志可能有更多信息。 [失败] ** @green7 - Deepu
尝试使用'sudo service apache2 restart'。 - waterloo2005

在新版本的apache2中,您只需按照以下命令操作:
sudo nano /etc/apache2/apache2.conf

在文件末尾添加以下新行:
ServerName localhost

然后重新启动apache2:
sudo service apache2 restart

完成了。

我发现在/etc/conf.d中创建一个新文件比修改apache2.confhttpd.conf要好一点。
这是我的个人偏好,可以将我的配置更改与发行包分开。因此更新变得不那么复杂。
我创建了文件/etc/apache2/conf.d/AAserverName,它只包含以下内容:
ServerName myhost.mycomain.tld

其他建议肯定也有效。

在Ubuntu 16.04中:
sudo -i

echo 'ServerName localhost' > /etc/apache2/conf-available/server-name.conf
a2enconf server-name

在Ubuntu 16.04上:
使用以下命令将ServerName localhost添加到文件httpd.conf中。
sudo vi  /etc/apache2/httpd.conf

然后在这个文件的末尾包含这行代码:Include httpd.conf
sudo vi /etc/apache2/apache2.conf

再次检查语法错误
sudo apache2ctl configtest

你现在应该收到了
Syntax OK

您现在可以通过重新加载配置来优雅地重新启动服务器。
sudo service apache2 reload

或者终止该进程并重新开始。
sudo service apache2 restart

添加ServerName localhost
 sudo leafpad /etc/apache2/apache2.conf

 sudo leafpad /etc/apache2/httpd.conf

这不是一个错误,只是一个友情提醒。

在配置文件的虚拟主机部分之外指定ServerName localhost是实现此目的的方法。
其他一些答案建议您修改/etc/apache2/httpd.conf。当通过apt升级apache时,该文件会被覆盖。对于不希望被覆盖的Apache配置,您应该创建一个新文件。以下是"Debian方式"进行此配置更改的方法:
# create the configuration file in the "available" section
echo "ServerName localhost" | sudo tee /etc/apache2/conf-available/servername.conf
# enable it by creating a symlink to it from the "enabled" section
sudo a2enconf servername
# restart the server
sudo service apache2 restart

这基本上与Stark的答案相同,但以易于复制和粘贴的脚本形式呈现。我最初是在一个被标记为重复的问题中发布了这个:https://askubuntu.com/a/432408