Python WSGI应用在Gunicorn中Keep-Alive Header未正常生效
解决Gunicorn响应头始终返回Connection: Close的问题
可能的原因及解决步骤:
1. 检查请求的HTTP版本与请求头
Gunicorn会根据请求的协议版本和请求头自动决定是否启用长连接:
- 如果请求使用HTTP/1.0,默认会返回
Connection: Close,除非请求头显式包含Connection: keep-alive。 - 如果是HTTP/1.1及以上版本,默认支持长连接,但需要确保请求头里的
Connection字段为keep-alive(大部分现代客户端默认会发送)。
可以用curl测试请求细节:
curl -v http://localhost:8000
查看输出中请求头的Connection字段,以及响应头的对应内容。
2. 不要手动设置Connection响应头
Gunicorn会根据自身配置和请求情况自动管理Connection头,手动设置的Connection: keep-alive可能被Gunicorn覆盖。删除代码中手动添加的('Connection', 'keep-alive'),让Gunicorn自动处理。
修改后的代码:
def app(environ, start_response): """Simplest possible application object""" data = b'Hello, World!\n' status = '200 OK' response_headers = [ ('Content-type', 'text/plain'), ('Content-Length', str(len(data))) ] start_response(status, response_headers) return iter([data])
3. 确保Gunicorn的keep-alive配置生效
启动时指定--keep-alive参数设置长连接超时时间(单位:秒),比如:
gunicorn main:app --keep-alive 10
该参数控制长连接在空闲多久后关闭,确保值大于0。
4. 检查Gunicorn版本
旧版本的Gunicorn可能存在长连接处理的bug,建议升级到最新稳定版:
pip install --upgrade gunicorn
5. 确认worker类型(如果使用异步worker)
如果使用gevent或eventlet等异步worker,需要确保正确安装并指定:
# 安装gevent pip install gevent # 启动时指定worker类型 gunicorn main:app --worker-class gevent --keep-alive 10
异步worker对长连接的支持更友好,但sync worker也能正常处理长连接。
内容的提问来源于stack exchange,提问作者Miloš Popović - Syose
相关产品推荐
相关产品推荐

