在Vagrant中无法访问5000端口

7 投票
6 回答
13437 浏览
提问于 2025-04-18 03:49

我正在尝试在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 个回答

1

我在使用Vagrant的时候遇到了一些问题,通过在Vagrantfile里添加这一行代码解决了它:

  config.vm.network "forwarded_port", guest: 5000, host: 5000, host_ip: "127.0.0.1"
1

你在你的vagrant环境里安装了curl吗?如果没有,先安装它,然后试试这个命令:curl http://127.0.0.1:5000/hello。如果你能收到回应,并且在控制台上看到Hello world!,那么flask那边一切正常。回到虚拟机的设置——根据你之前说的,我猜你在用NAT地址。在这种情况下,你需要把主机地址设置为127.0.0.1,端口设置为5000,把客机地址留空,再把端口设置为5000,这样就可以了(这叫做端口转发)。我注意到在这种情况下,vagrant用虚拟主机会效果更好。你可以看看这里

2

这可能是因为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 :5000netstat -nap | grep :5000 来查看哪个程序正在占用这个端口,以便进一步排查问题。

16

如果你是在桌面上的Chrome浏览器里访问,那么从技术上讲,你是在用另一台电脑访问(所以你需要在app.run()里加上host='0.0.0.0'这个参数,这样才能告诉客人操作系统接受来自所有公共(外部)IP的连接)。

这是我用过的方法(在Chrome里访问127.0.0.1:5000/hellolocalhost: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')
12

你可能需要让Flask在一个外部可见的网址上运行:可以查看这份文档

撰写回答