如何配置Flask服务器,避免响应客户端时携带FIN位以保持连接
Flask 保持TCP连接开启的解决方案
当然可以通过调整服务器配置实现,问题核心是当前服务器返回响应后主动触发了TCP连接关闭(发送FIN位),这通常和HTTP连接模式的配置有关。下面是具体解决方法:
1. 问题根源
Flask默认使用Werkzeug开发服务器,HTTP/1.1虽默认支持持久连接(Keep-Alive),但如果服务器或请求头指定了Connection: close,就会在响应后关闭TCP连接,对应数据包中的FIN位。
2. 配置Werkzeug开发服务器
方式一:全局添加Keep-Alive响应头
通过响应钩子统一设置持久连接相关HTTP头,强制服务器保持连接:
from flask import Flask app = Flask(__name__) # 全局给所有响应添加Keep-Alive头 @app.after_request def set_keep_alive_headers(response): response.headers["Connection"] = "keep-alive" # 配置连接超时和最大复用请求数,可按需调整 response.headers["Keep-Alive"] = "timeout=60, max=100" return response @app.route("/") def index(): return "Hello, World!" if __name__ == "__main__": # 开启多线程支持并发连接,同时设置keepalive超时 app.run(threaded=True, keepalive=60)
方式二:直接配置Werkzeug底层参数
如果用Werkzeug的run_simple启动服务器,可显式配置keep-alive:
from werkzeug.serving import run_simple from flask import Flask app = Flask(__name__) @app.route("/") def index(): return "Hello, World!" if __name__ == "__main__": # 配置keepalive超时,threaded=True支持并发连接 run_simple("0.0.0.0", 5000, app, threaded=True, keepalive=60)
3. 生产环境服务器配置
如果用Gunicorn、uWSGI等生产级服务器,需对应调整参数:
- Gunicorn:启动时添加
--keep-alive 60参数 - uWSGI:配置文件中设置
http-keepalive=60
4. 验证效果
用Wireshark抓包或curl -v命令查看响应头,确认Connection: keep-alive存在,且TCP连接在响应后不会立即发送FIN包,后续请求可复用该连接。
内容的提问来源于stack exchange,提问作者Elliott Goldstein
相关产品推荐
相关产品推荐

