同主机Python脚本无法访问本地FastAPI+Gunicorn服务求助
同主机访问FastAPI+Gunicorn后端服务失败排查与解决
部署概况
- 后端服务:基于FastAPI + Gunicorn(Python库)搭建,启动命令:
注:原命令中gunicorn main:app -b MINE_IP:8000 -c gunicorn_config.py --worker-class uvicorn.workers.UvicornWorkerunicorn.worker.UvicornWorker为拼写错误,正确路径为uvicorn.workers.UvicornWorker - 依赖应用代码:
import requests j = requests.get(url="https://www.google.com/") print(j.status_code) o = requests.get(url="https://you_domen.domen:8000/") print(o.status_code)
问题现象
- 本地笔记本运行脚本:两个请求均返回200
- 后端所在服务器(同主机)运行脚本:请求Google正常返回200,请求后端服务报错,提示无法连接
- 已关闭防火墙并重启系统,问题未解决
测试错误详情
- HTTPS通过域名+端口访问:
requests.exceptions.ConnectionError: HTTPSConnectionPool(host='you_domen.domen', port=8000): Max retries exceeded with url: / (Caused by NewConnectionError('<urllib3.connection.HTTPSConnection object at 0x7f72750366e0>: Failed to establish a new connection: [Errno 111] Connection refused')) - HTTP通过域名+端口访问:
requests.exceptions.ConnectionError: HTTPConnectionPool(host='you_domen.domen', port=8000): Max retries exceeded with url: / (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7f0d00bc66e0>: Failed to establish a new connection: [Errno 111] Connection refused')) - HTTPS通过公网IP+端口访问:
requests.exceptions.ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response')) - HTTP通过公网IP+端口访问:
requests.exceptions.SSLError: HTTPSConnectionPool(host='you_ip', port=8000): Max retries exceeded with url: / (Caused by SSLError(CertificateError("hostname 'you_ip' doesn't match 'you_domen.domen'")))
环境信息
- Ubuntu 22.04(已更新所有系统包)
- Python 3.10.6
- Gunicorn 21.2.0(同时通过apt安装但未配置,无干扰)
解决步骤
1. 修正Gunicorn绑定地址
启动命令中-b MINE_IP:8000若绑定的是公网IP,Gunicorn只会监听该公网IP的请求,同主机的本地请求会被拒绝。修改为绑定所有网卡(含本地回环):
gunicorn main:app -b 0.0.0.0:8000 -c gunicorn_config.py --worker-class uvicorn.workers.UvicornWorker
或同时绑定公网IP与回环IP:
gunicorn main:app -b MINE_IP:8000 -b 127.0.0.1:8000 -c gunicorn_config.py --worker-class uvicorn.workers.UvicornWorker
2. 验证本地基础连通性
在服务器上先通过回环地址测试服务是否正常:
curl http://127.0.0.1:8000/
若能正常返回,说明服务本身无问题,核心原因是绑定地址限制。
3. 解决域名解析的Hairpin NAT问题
服务器上访问域名you_domen.domen时,若域名解析到公网IP,可能因服务器网络策略(NAT配置)不允许本地访问自身公网IP(即Hairpin NAT问题)。可修改/etc/hosts强制本地解析到回环地址:
127.0.0.1 you_domen.domen
4. 处理HTTPS与证书匹配问题
- Gunicorn默认不提供HTTPS支持,若未搭配反向代理(如Nginx)配置SSL证书,直接用
https://访问会报错,测试阶段可改用http://访问。 - 错误4中的证书主机名不匹配,是因为证书颁发给
you_domen.domen,用公网IP访问时验证失败。解决方式:- 始终用域名访问而非IP
- 给证书添加IP类型的SAN(Subject Alternative Name)
- 测试时临时关闭证书验证(生产环境禁用):
o = requests.get(url="https://you_ip:8000/", verify=False)
内容的提问来源于stack exchange,提问作者Miskler
相关产品推荐
相关产品推荐

