今天在调试同事开发的一个 http 服务,在 pc A 上启动以后,发现在另一台 pc B 上无法通过 http://ipA:5000/ 的方式请求,具体报错信息是提示访问被拒绝
一般来说,我们会先在 pc A 上测试下,所以我切回 A,并通过 http://127.0.0.1:5000/ 访问,一切正常,那么说明服务启动是没问题的
接下来,自然的想到是不是防火墙没关,于是检查了一下,发现关了一部分,那么就把剩下的全都关闭,并切回 B 重试,No,仍然提示访问被拒绝
此时,思路还是集中在防火墙上,怀疑是不是没关彻底,于是切回 A 上,通过 http://ipA:5000/ 的方式,奇怪了诶,现象跟在 B 上一样,竟然提示访问被拒绝了
所以现在的问题就是,通过 127.0.0.1 可以访问,但是通过本机 IP 就不可以
顺着问题 google 了一下,怀疑可能是 hosts 文件有特殊设置过,于是检查了一下,并没有异常
这时,有一个观点引起了我的注意:
HTTP 服务是支持设置监听 IP 的
所以排查的方向变为,是否代码中强制监听的是 127.0.0.1?
读了下代码,HTTP 服务是通过 Python Flask 模块开发的,其中一段启动代码用了默认设置
app.run()
这段代码,会默认监听 127.0.0.1:5000。那么问题的原因基本就找到了
这里有一个思维定势,就是以为 127.0.0.1 和本机 IP 是一样的,其实,它们不一样
于是我改了下代码
app.run(host='0.0.0.0', port='5000')
重新启动服务,这时命令行的提示都跟着变了(显示了本机 IP):
* Running on http://192.168.70.226:5000/ (Press CTRL+C to quit)
在 B 上重新测试,请求成功