nginx不维护websocket连接状态,需清理的是配置残留而非运行时连接;应删除废弃的location、upstream及冗余header规则,并验证其不再生效。

Nginx 本身不维护 WebSocket 连接状态,也不主动“清理”连接或规则——它没有连接池、会话表或心跳管理能力。所谓“废弃的实时通信规则”,实际是配置残留、路径错配或未及时失效的代理逻辑,而非运行时堆积的连接对象。真正需要清理的,是人为误配、测试遗留或业务下线后未同步更新的 location、upstream 或 header 转发规则。
检查并清理无效的 location 规则
WebSocket 请求必须精确落入对应 location 块,否则会被 fallback 到其他 handler(如返回 404、200 或 502)。长期不用却仍存在的 /ws-test/、/socket-dev/ 等路径规则,可能干扰新服务或引发日志噪音:
- 查看所有含
proxy_pass且路径匹配/ws/、/socket/、/api/ws等关键词的 location 块 - 删除已下线服务对应的整个 location 块,包括内部的
proxy_set_header、proxy_read_timeout等子配置 - 避免用
rewrite动态改写 WebSocket 路径,这会导致$http_upgrade变量丢失,握手失败
停用闲置的 upstream 和 keepalive 连接池
若曾为 WebSocket 后端配置了 upstream ws_backend { server 127.0.0.1:8080; keepalive 32; },但该后端已下线:
- 删除整个 upstream 块,或注释掉并加
# DEPRECATED: 2026-09-15, service retired标注 -
keepalive 32会维持空闲 TCP 连接到后端,若后端不可达,Nginx 错误日志中会出现upstream connection timed out持续刷屏
移除冗余或冲突的 header 处理逻辑
重复或矛盾的 proxy_set_header 容易覆盖关键值,例如:
- 同一 location 中出现两次
proxy_set_header Connection ...,后者生效,前者白配 - 全局 http 块里写了
proxy_set_header Upgrade "";,会清空$http_upgrade,导致所有 WebSocket 握手降级为 HTTP - 已弃用的
map $http_upgrade $connection_upgrade { ... }若未同步删除,可能被其他 location 引用,引入不可预期行为
验证清理效果,防止“假清理”
清理不是删完就结束,要确认请求不再命中旧规则:
- 用
curl -i -H "Upgrade: websocket" -H "Connection: Upgrade" http://domain/old-ws-path/测试是否返回 404 或 502(而非 101) - 查看 Nginx access 日志,确认
/old-ws-path/的访问量归零,且无新增upstream prematurely closed connection报错 - 使用
nginx -t检查语法,再nginx -s reload生效,避免 reload 失败导致配置回滚
不复杂但容易忽略。











