Connection_upgrade 是 Nginx 中用于识别 WebSocket 升级请求的 HTTP 头匹配组合(Connection: upgrade + Upgrade: websocket),可通过 $http_connection 和 $http_upgrade 变量检测、条件路由、透传头字段及配合后端实现连接准入与状态管理。

Connection_upgrade 变量本身不是标准 HTTP 或编程语言内置的“可写变量”,而是一个常在 Web 服务器(如 Nginx)或反向代理配置中出现的 HTTP 请求头字段名称(即 Connection: upgrade 和 Upgrade: websocket 的组合标识),用于协商协议升级(最常见的是从 HTTP 升级到 WebSocket)。它不能被“动态赋值”来管理连接状态,但可以被检测、匹配、转发或条件响应,从而实现对连接生命周期的间接控制。
识别并拦截 Upgrade 请求
在 Nginx 中,可通过判断 $http_connection 和 $http_upgrade 变量的值,识别客户端发起的升级请求:
-
$http_connection ~* upgrade表示请求头含Connection: upgrade -
$http_upgrade = "websocket"表示明确要求升级为 WebSocket - 二者通常需同时满足,才视为合法的 WebSocket 升级请求
按条件路由或拒绝升级连接
利用这些变量做 if 判断,可实现连接准入控制:
- 只允许特定路径(如
/ws)接受升级:
location /ws {
if ($http_upgrade != "websocket") { return 403; }
proxy_pass http://backend;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
} - 结合 IP 或 token 头限制升级权限,例如:
if ($http_x_api_token = "") { return 401; }
透传升级头并维持长连接
若后端服务(如 Node.js 的 ws 库、Python 的 FastAPI + websockets)依赖原始 Upgrade 协商,则必须正确透传相关头字段:
-
proxy_set_header Upgrade $http_upgrade;—— 把客户端的 Upgrade 值原样传给后端 -
proxy_set_header Connection "upgrade";—— 强制让 Nginx 与后端之间也启用连接升级(而非默认关闭) -
proxy_read_timeout 86400;—— 避免空闲超时断连,保障长连接存活
配合后端逻辑实现状态感知
真正“动态管理连接状态”的逻辑应在后端实现,Nginx 的变量仅作入口过滤和协议桥接:
- 后端收到 Upgrade 请求后,校验用户身份、限频、分配会话 ID,并存入 Redis 等共享存储
- 后续心跳、消息、断开事件触发时,更新该连接的状态(online/idle/closed)
- Nginx 不保存连接状态,但可通过
auth_request模块在每次 Upgrade 前实时调用后端鉴权接口

















