在Vagrant中无法访问5000端口
我正在尝试在Vagrant环境中自学Flask。我知道Flask默认在5000端口上运行服务器。在我的Vagrantfile中,我有:
config.vm.network :forwarded_port, guest: 80, host: 8080
config.vm.network :forwarded_port, guest: 5000, host: 5000
我有一个简单的Flask教程应用:
from flask import Flask
app = Flask(__name__)
@app.route('/hello')
def hello_world():
return 'Hello world!'
if __name__ == '__main__':
app.run(debug=True)
但是,当我在Vagrant环境中运行python hello.py
,然后在桌面上的Chrome浏览器中访问127.0.0.1:5000/hello
时,我无法连接。
我对网络的了解还不够。我缺少了什么呢?
6 个回答
我在使用Vagrant的时候遇到了一些问题,通过在Vagrantfile里添加这一行代码解决了它:
config.vm.network "forwarded_port", guest: 5000, host: 5000, host_ip: "127.0.0.1"
你在你的vagrant环境里安装了curl吗?如果没有,先安装它,然后试试这个命令:curl http://127.0.0.1:5000/hello
。如果你能收到回应,并且在控制台上看到Hello world!
,那么flask那边一切正常。回到虚拟机的设置——根据你之前说的,我猜你在用NAT地址。在这种情况下,你需要把主机地址设置为127.0.0.1,端口设置为5000,把客机地址留空,再把端口设置为5000,这样就可以了(这叫做端口转发)。我注意到在这种情况下,vagrant用虚拟主机会效果更好。你可以看看这里。
这可能是因为Vagrant(VirtualBox)中的NAT端口转发没有正常工作,可能是端口冲突导致的。
为了更好地找出问题,你可以先确认一下5000端口在两边都能正常打开。你可以使用一些工具,比如nmap、nc(netcat)或者netstat等,来检查。
例如,在主机上运行:
nmap 127.0.0.1
nc -vz 127.0.0.1 5000
curl http://127.0.0.1:5000
在虚拟机内部运行:
nmap GUEST_IP
nc -vz GUEST_IP 5000
curl http://GUEST_IP:5000
注意:GUEST_IP很可能在10.0.2.0/24这个网络范围内(这是vbox NAT引擎的默认设置)。
在你的主机和虚拟机(客机)上运行这些命令,可以告诉你端口是否开放。
确保你的Python "Hello World" 程序不仅绑定在回环设备上,这样它才能接收来自外部客户端的请求。
使用 lsof -i :5000
或 netstat -nap | grep :5000
来查看哪个程序正在占用这个端口,以便进一步排查问题。
如果你是在桌面上的Chrome浏览器里访问,那么从技术上讲,你是在用另一台电脑访问(所以你需要在app.run()
里加上host='0.0.0.0'
这个参数,这样才能告诉客人操作系统接受来自所有公共(外部)IP的连接)。
这是我用过的方法(在Chrome里访问127.0.0.1:5000/hello
和localhost:5000/hello
都有效):
from flask import Flask
app = Flask(__name__)
@app.route("/hello")
def hello():
return "Hello World!"
if __name__ == "__main__":
app.run(host='0.0.0.0')
你可能需要让Flask在一个外部可见的网址上运行:可以查看这份文档