不能配置 proxy_set_header Connection "" 来保障长连接——这会清空Connection头导致WebSocket握手失败;正确做法是用map指令动态设Connection为upgrade或close,并配proxy_http_version 1.1、proxy_buffering off及超时调大等。

不能配置 proxy_set_header Connection "" 来保障长连接——这反而会破坏 WebSocket 握手,导致连接被后端直接拒绝或降级为普通 HTTP。
Connection 头必须显式设为 "upgrade"
WebSocket 升级依赖客户端发送的 Connection: Upgrade(注意大小写),而 Nginx 默认会清理掉 Upgrade 字段,只保留 keep-alive 等值。若你写成:
proxy_set_header Connection "";
Nginx 会把 Connection 头清空,后端收不到 Upgrade 指令,无法触发 101 切换协议,握手失败。
正确做法:固定值 + 动态兜底
必须让 Nginx 主动将 Connection 请求头设为 "upgrade",同时兼顾普通请求不误触发隧道化:
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
- 推荐用
map指令动态判断:
map $http_upgrade $connection_upgrade {<br> default upgrade;<br> '' close;<br> } - 在 location 中使用:
proxy_http_version 1.1;<br> proxy_set_header Upgrade $http_upgrade;<br> proxy_set_header Connection $connection_upgrade;
- 这样:有
Upgrade: websocket头时传Connection: upgrade;无此头时传Connection: close,避免普通请求被后端误判为 WebSocket
仅设 Connection 不够,还需配套关键项
即使 Connection 配对正确,以下任一缺失仍会导致连接几秒内被静默中断:
-
必须启用 HTTP/1.1:
proxy_http_version 1.1;(HTTP/1.0 不支持 Upgrade) -
关闭响应缓冲:
proxy_buffering off;(否则帧被缓存,造成延迟或粘包) -
调大超时时间:
proxy_read_timeout 86400;和proxy_send_timeout 86400;(默认 60 秒,远不够长连接) -
禁用缓存指令:不要出现
proxy_cache、proxy_cache_valid等(WebSocket 消息不可缓存)
验证是否生效的三个信号
重启 Nginx 后,用浏览器开发者工具检查 WebSocket 请求:
- 请求头中存在
Upgrade: websocket和Connection: upgrade - 响应状态码是
101 Switching Protocols(不是 200、502 或直接失败) - Nginx error.log 中无
upstream prematurely closed connection类报错

















