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

Python请求Uvicorn WSGI超时但服务端已处理问题求助

排查Python请求Uvicorn服务超时问题

问题现象

  • 浏览器或终端直接用curl请求Uvicorn服务(10.0.1.72:8000),2秒内即可获取响应
  • Python中使用requests.get()或os.popen("curl <url>")调用时,会一直加载直到超时,但服务端已确认及时处理了请求
  • 报错信息:
    requests.exceptions.ReadTimeout: HTTPConnectionPool(host='10.0.1.72', port=8000): Read timed out. (read timeout=20)
    

排查思路

1. 禁用Python请求的代理

Python可能继承了系统代理配置,和终端/浏览器的代理不一致,导致请求链路异常。直接在请求中禁用代理:

url = f"http://{selected_server[0]}:8000/create/site/{site}/{user}"
x = requests.get(url, proxies={"http": None, "https": None})

也可以检查Python环境的代理变量:

import os
print(os.environ.get('HTTP_PROXY'), os.environ.get('HTTPS_PROXY'))

2. 模拟浏览器的请求头

终端/curl会自动携带部分请求头(如User-Agent),而requests默认头部极简,可能触发服务端的校验逻辑。复制浏览器的请求头到Python中:

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36",
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8",
    "Connection": "close"  # 强制关闭连接,避免Keep-Alive等待
}
x = requests.get(url, headers=headers)

3. 检查Uvicorn服务端日志

启动Uvicorn时开启debug日志,查看请求的完整生命周期,确认服务端是否发送了响应:

uvicorn main:app --host 0.0.0.0 --port 8000 --log-level debug

重点看日志中是否有send_response相关记录,以及连接是否正常关闭。

4. 用原生Socket测试网络连接

绕过requests库,直接用Socket模块测试,定位是库的问题还是底层网络问题:

import socket

host = "10.0.1.72"
port = 8000
path = f"/create/site/{site}/{user}"

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host, port))
# 发送HTTP请求,强制关闭连接
request = f"GET {path} HTTP/1.1\r\nHost: {host}:{port}\r\nConnection: close\r\n\r\n"
s.send(request.encode())

# 接收响应
data = b""
while True:
    chunk = s.recv(1024)
    if not chunk:
        break
    data += chunk
print(data.decode())
s.close()

如果这个请求能正常收到响应,说明是requests库的配置问题;如果同样超时,说明Python进程的网络栈存在异常。

5. 排查系统安全策略与资源限制

  • 检查SELinux是否限制了Python进程的网络操作:
    setenforce 0  # 临时关闭SELinux测试
    
    测试后恢复setenforce 1,确认是否是SELinux导致。
  • 检查Python进程的文件句柄限制:
    import resource
    print("当前文件句柄限制:", resource.getrlimit(resource.RLIMIT_NOFILE))
    
    如果句柄数过低,可能导致无法读取响应数据。

内容的提问来源于stack exchange,提问作者Amako Yoko

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 11:58:33