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
相关产品推荐
相关产品推荐

