nginx 正确支持 websocket 升级需显式透传 upgrade 和 connection 两个逐跳头:proxy_set_header upgrade $http_upgrade; proxy_set_header connection $connection_upgrade; 并配合 proxy_http_version 1.1、禁用缓存与缓冲、调大超时等配套设置。

要让 Nginx 正确支持 WebSocket 或 HTTP/2 等需要协议升级(Upgrade)的场景,关键不是“开启某个开关”,而是显式透传两个特殊请求头:Upgrade 和 Connection。因为它们属于逐跳(hop-by-hop)头部,默认不会被反向代理转发。
为什么必须手动配置 Upgrade 和 Connection 头
客户端发起 WebSocket 连接时,会发送类似这样的请求头:
Upgrade: websocketConnection: upgrade
但 Nginx 默认不转发这两个字段——它只当普通请求头处理,而实际协议切换依赖后端服务器(如 vncserver、Tomcat、Node.js)收到这两个头才能触发 101 Switching Protocols 响应。所以必须用 proxy_set_header 显式传递。
安装并运行 Aperture(Lightning Labs 的 L402 闪电反向代理),用于创建 L402 付费墙、配置付费 API 端点、为其他代理托管付费内容或测试 L402 认证流程。
核心配置项写法
在 Nginx 的 location 块中添加以下两行:
- proxy_set_header Upgrade $http_upgrade; —— 将客户端原始的 Upgrade 头值(如 "websocket")原样传给后端
-
proxy_set_header Connection $connection_upgrade; —— 注意这里不是
$http_connection,而是 Nginx 内置变量$connection_upgrade,它会根据$http_upgrade是否存在自动设为 "upgrade" 或保持原有值(如 "keep-alive")
配套必要设置
仅设 header 不够,还需确保:
- proxy_http_version 1.1; —— 必须启用 HTTP/1.1,因为 Upgrade 机制定义在 1.1 中
- proxy_cache_bypass $http_upgrade; —— 避免缓存 Upgrade 请求(否则后续连接可能被错误返回缓存内容)
- proxy_set_header Host $host; —— 保持原始 Host,尤其对多租户或 SNI 场景重要
验证是否生效
配置后重启 Nginx,用浏览器开发者工具检查 WebSocket 连接的请求头:
- 发起连接时,请求中应含
Upgrade: websocket和Connection: upgrade - 响应状态码应为
101 Switching Protocols,且响应头含相同两个字段 - 若返回 400 或 502,大概率是后端未正确识别 Upgrade 头,需检查后端服务是否启用 WebSocket 支持










