You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

同主机Python脚本无法访问本地FastAPI+Gunicorn服务求助

同主机访问FastAPI+Gunicorn后端服务失败排查与解决

部署概况

  • 后端服务:基于FastAPI + Gunicorn(Python库)搭建,启动命令:
    gunicorn main:app -b MINE_IP:8000 -c gunicorn_config.py --worker-class uvicorn.workers.UvicornWorker
    
    注:原命令中unicorn.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,请求后端服务报错,提示无法连接
  • 已关闭防火墙并重启系统,问题未解决

测试错误详情

  1. 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'))
    
  2. 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'))
    
  3. HTTPS通过公网IP+端口访问:
    requests.exceptions.ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))
    
  4. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 19:48:37