为什么/etc/hosts文件不起作用?

我一直遇到这个问题已经有一段时间了,尝试了我所知道的一切,所以我觉得现在是时候寻求帮助了。
无论我对/etc/hosts进行任何编辑,都没有起作用。
例如:
julian@ifrit:~$ cat /etc/hosts
127.0.0.1   localhost
127.0.1.1   ifrit
192.168.1.100   dev.julianfernand.es

在上面的例子中,当我访问dev.julianfernand.es(该网站不存在)时,应该从192.168.1.100加载。
如果我使用Google Chrome或Firefox访问,可以正常工作。但是当我使用Google Chrome或Firefox访问dev.julianfernand.es时,却不能正常工作。
现在,经过几次重启后,它可以正常工作。但是作为一家托管WordPress的公司的员工,我经常遇到需要编辑文件才能在我们的服务器上查看客户的网站的情况。
我不能一直重启电脑,这样完全没有生产力。重启网络服务没用,清除缓存也没用(甚至是Chrome内部的DNS缓存)。
有人有什么想法吗?这个问题发生在elementaryOS(基于Ubuntu 12.04)和Ubuntu 13.10(daily build)上。还没有尝试其他版本。
PS:如果需要的话,我在这台机器上运行了一个带有PHP-FPM和MySQL的NGINX服务器。
提前感谢 :)

很难知道问题所在。当通过主机名(dev.julianfernand.es)访问该站点失败时,您是否可以通过IP地址(192.168.1.100)访问它? - Panther
@bodhi.zazen 是的,我可以。但是由于我们公司不使用共享主机的默认“通过访问IP来访问网站”的想法,这种方法不起作用。 - Julian Fernandes
我并不建议您通过IP来访问网站作为长期解决方案。尽管如此,这些信息有助于调试,因为它可以排除防火墙、路由以及服务器端问题之外的其他问题。 - Panther
如果您在浏览器的地址栏中输入IP地址呢? - Sergiy Kolodyazhnyy
11个回答


请同时检查您的Nginx配置和错误日志文件。当您访问网站时,这些地方可能会有一些线索。 - Arnold
自15.04版本开始使用systemd:sudo systemd-resolve --flush-caches - Pablo Bianchi

对我来说,解决办法是编辑/etc/nsswitch.conf文件(你可以使用命令sudo vim /etc/nsswitch.conf)。我修改了以下行:
hosts:          files mdns4_minimal [NOTFOUND=return] dns

给:
hosts:          dns files mdns4_minimal [NOTFOUND=return]

现在它按预期工作了!

4如果你希望/etc/hosts优先于DNS服务器的结果,那么你可能想把files作为第一个条目。 - muru
这很奇怪,但并不是错误,我必须按照这个顺序才能使其正常工作。 - jmarceli
非常感谢!我之前有一个服务器从我的路由器上获取主机名,而不是从/etc/hosts文件中获取,一直搞不明白原因。在看到你的建议后,我检查了所有的服务器,发现它们都有相同的/etc/nsswitch.conf文件,除了那个给我麻烦的服务器。我按照你的建议更新了那台服务器的配置(几乎和你的建议一模一样),问题就解决了。非常感谢! - schworak

下列步骤适用于我: 添加

addn-hosts=/etc/hosts

/etc/NetworkManager/dnsmasq.d/hosts.conf

杀掉dnsmasq和
service NetworkManager restart

无论如何,名称服务器切换是控制主机名解析顺序的关键。 - Aurovrata

接受的答案在12.04到13.04版本中通过禁用dnsmasq来解决问题,但在13.10版本中对我不再起作用。我找到了以下适用于13.10版本的新解决方案。
编辑你的/etc/default/dnsmasq文件,将ENABLED=1改为ENABLED=0,然后重新启动。

2我在指定路径下没有任何dnsmasq文件。我使用的是Linux 15.04版本。 - Hiren
现在没有被接受的答案了。你指的是哪个答案? - toon81

来源:http://blog.calebthorne.com/2012/08/broken-etchosts-in-ubuntu-1204.html

Ubuntu 12.04桌面版的一个新“功能”是将dnsmasq作为NetworkManager的插件来进行本地DNS解析。Dnsmasq旨在加速DNS和DHCP服务,但带来了一个不幸的副作用:dnsmasq会缓存本地DNS,并忽略对/etc/hosts文件的更改。我在处理网站时经常需要更改hosts文件,所以这个“功能”非常让人恼火。

解决方法是在NetworkManager的配置文件中禁用dnsmasq。打开/etc/NetworkManager/NetworkManager.conf文件,并将以下行注释掉:

dns=dnsmasq

我的NetworkManager.conf文件包含以下内容:
[main]
plugins=ifupdown,keyfile
# dns=dnsmasq

[ifupdown]
managed=false

另请参阅https://bugs.launchpad.net/ubuntu/+source/network-manager/+bug/993298

1尝试了在13.10和elementaryOS上,还是没有任何进展。但还是谢谢你的帮助!:) - Julian Fernandes
@JulianFernandes 看起来在13.10上不起作用。我按照这个建议在12.04上成功了,但是升级到13.10后,dnsmasq又回来了,我无法摆脱它。 - Mark E. Haase
明白了,这个问题是关于https://bugs.launchpad.net/ubuntu/+source/network-manager/+bug/993298的。 - Panther

这可能有点傻,但在我的情况下,浏览器缓存是“罪魁祸首”=对于开发人员来说应该很明显 :(
另一个傻(显而易见)的事情是我错过了,浏览器(Chrome,Mozilla)直接从地址栏执行谷歌(或搜索引擎)搜索,因此,他们不会解析您提供的地址,而是在互联网上搜索那个单词!
解决方案:
一旦编辑了/etc/hosts文件,请ping所选地址!如果ping命令解析了您给出的IP,则“hosts”文件有效!
清除浏览器缓存(浏览器缓存DNS解析一段时间(TTL))
禁用您正在使用的浏览器的默认搜索引擎

1是的 - 我想这就是我们所说的“专业技巧”。哈哈 - 总是用 ping 测试 /etc/hosts - B. Shea

编辑/etc/nsswitch.conf,通过在该行前面添加#来注释掉下面的行。
hosts:          files mdns4_minimal [NOTFOUND=return] dns myhostname

并添加

hosts:          files mdns4_minimal [NOTFOUND=return] dns

基本上,配置被重新排序。现在域名查找过程将首先咨询文件,即/etc/hosts,然后再咨询DNS。默认情况下,它会在其他适当的服务或文件之前首先咨询DNS。
为了快速测试它是否工作,您可以使用
sudo python -m SimpleHTTPServer 80

创建一个简单的HTTP服务器以从目录中提供文件,然后在/etc/hosts文件中将以下行注释掉
127.0.0.1      localhost
127.0.1.1      01hw730983

并添加

127.0.0.1       content

然后打开浏览器,输入content/,如果你能看到目录结构,说明它正常工作;否则,就不正常。

简单而实用
1. 创建 `/etc/NetworkManager/dnsmasq.d/hosts.conf` 文件。 2. 在文件中添加类似于 `address=/whatever/1.2.3.4` 的行。请参考文档(查找 `--address`)。 可以使用通配符:`address/.whatever./1.2.3.4`。 3. 终止 `dnsmasq` 进程(bug)。 4. 重新启动它:`$ service network-manager restart`。

听起来你的设置和我的很相似。我有一个运行Ubuntu的服务器和开发主机。在这个服务器上,我运行Nginx、Apache、Tomcat、Rails应用程序以及其他我需要的东西。
从我的Mac上,我可以简单地添加一个hosts条目,并使用任何我需要的名称加载服务器,但是从ElementaryOS客户端上,这样做不起作用。
我尝试了上面的修复方法,但没有成功。
我所做的是运行Squid代理服务器,并将主机名添加到服务器的/etc/hosts文件中。(编辑需要重新启动squid。)
之后,在浏览器或操作系统的控制面板中进行适当的代理设置。

检查/etc/hosts文件的权限。
在我的云服务上,克隆服务器后,hosts文件的权限从644变为600,因此apache(www-data)无法读取该文件。我猜测是这个原因。我在/etc目录下运行了sudo chmod 644 hosts命令,问题得到解决。
问题最初出现的情况是:
MongoConnectionException Failed to connect to: localhost:27017: Previous connection attempts failed, server blacklisted. 

我追踪到了MongoClient中指向本地主机的服务器变量。我无法ping通localhost或主机名。


在这种情况下,我有时会尝试将“localhost”更改为“127.0.0.1”,以获得成功。 - pbr