服务器返回空响应 - 无法通过端口转发连接到vagrant虚拟机

28

我正在一个Tilestache的设置中运行werkzeug,并在Vagrant虚拟机中运行Ubuntu 'precise'。

在我的Vagrantfile文件中,我有以下配置:

config.vm.network :forwarded_port, guest: 8080, host: 8080

当我在虚拟机中启动服务器时,我看到:

 * Running on http://127.0.0.1:8080/

如果我从虚拟机内使用curl请求该地址,我会得到预期结果。但当我从宿主机上使用curl请求时,我会得到以下错误:

curl: (52) Empty reply from server

谷歌浏览器显示“未接收到数据”错误。

故障排除信息:

  • 服务器能够响应主机的ping请求
  • 端口扫描器验证了该端口是开放的
  • 在虚拟机中运行netstat -ntlp | grep 8080显示服务器正在监听8080端口
  • 我的本地hosts文件没有任何奇怪的冲突
  • 我还将22端口转发到2222端口,可以无障碍地进行ssh连接
  • 我已经在主机上禁用防火墙,并且我不认为客户机上有防火墙(iptables和ufw至少已经关闭)
  • 如果有冲突,我已经设置auto_correct: true(但实际上没有),

我知道我可以设置一个私有网络,但我想了解为什么这不起作用以及如何进行故障排除。是否还有其他的想法?

3个回答

72
在虚拟机中运行服务器时,请在0.0.0.0上启动服务器,而不是在127.0.0.1上启动。127.0.0.1仅对本地计算机可访问,这意味着在虚拟机中除了本地计算机以外的任何内容都无法访问它! 0.0.0.0可以从本地网络上的任何地方访问,对于虚拟机而言,这包括主机计算机。这个答案来自Connection Reset when port forwarding with Vagrant。(该问题显然是从https://dev59.com/gG025IYBdhLWcg3weF6S#5999945获得答案)。有关更多帮助,请参见:https://serverfault.com/questions/78048/whats-the-difference-between-ip-address-0-0-0-0-and-127-0-0-1

Google-bait:

如果这是问题,您可能会收到以下错误:

  • Chrome:“未接收到数据”
  • Firefox:“连接被重置-加载页面时与服务器的连接被重置。”
  • Safari:“Safari无法打开页面[URL],因为服务器意外地断开了连接”
  • curl:“服务器回复为空”

使用Truong Nguyen提出的方法似乎对我无效。出现了相同的错误,“未接收到数据”,但是使用转发端口和本地主机,即“localhost:8080”可以正常工作。 - Nathan Hornby

23
在虚拟机的 /etc/hosts 文件中,将以下行更改:
127.0.0.1 localhost -> 0.0.0.0 localhost
然后重新启动服务器

10
这个很好用。注意这个设置是在vagrant虚拟机上设置的,而不是在主机系统上设置的。这一点相当明显,但如果你从随意的谷歌搜索中寻找快速解决方案,则可能会比较模糊。 - cchamberlain
哎呀!请不要这样做。这不是正确的答案,即使它是虚拟机。 - Dalibor Filus
1
这是糟糕的建议。 - Jeff McCune
1
@JeffMcCune 你介意详细说明一下吗? - jarrodwhitley
在执行了 vagrant reload 后,它对我有效了。 谢谢 - Vacit A.

2
这也可能是虚拟机防火墙的问题。如果您在虚拟机上可以使用curl命令访问该地址,请检查您的firewalld设置或将其关闭:
对于CENTOS系统:
sudo service firewalld stop

那么您应该更新您的firewalld设置并重新启动它 ;)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接