nginx代理wss的关键是协议升级+tls终止:必须配置proxy_http_version 1.1、proxy_set_header upgrade $http_upgrade、proxy_set_header connection "upgrade",并在server块中启用ssl证书与tlsv1.2+,后端使用ws://;同时关闭proxy_buffering和proxy_cache,设置长超时以保障长连接稳定。

要让 Nginx 正确代理 WebSocket over TLS(即 WSS),关键不是“开启某个开关”,而是确保协议升级机制完整、TLS 终止位置明确、连接生命周期可控。
必须透传升级头并启用 HTTP/1.1
WebSocket 握手本质是 HTTP 协议升级,Nginx 默认会过滤 Upgrade 和 Connection 头,导致后端收不到信号,返回 200 而非 101 状态码,连接失败。
- proxy_http_version 1.1:强制使用 HTTP/1.1,这是 Upgrade 机制的前提
- proxy_set_header Upgrade $http_upgrade:原样转发客户端的 Upgrade 头(如 websocket)
- proxy_set_header Connection "upgrade":值必须是带英文双引号的字面量 upgrade,不能写成 $http_connection 或漏引号
SSL 终止由 Nginx 完成(推荐方式)
最常见且稳定的方案是:浏览器访问 wss://example.com/ws → Nginx 终止 TLS → 后端用 ws:// 地址接收明文 WebSocket 流量。这种方式无需后端处理证书,配置清晰、调试方便。
- server 块需监听 443 端口并配置 ssl_certificate 和 ssl_certificate_key
- ssl_protocols 至少设为 TLSv1.2,禁用不安全旧协议
- proxy_pass 指向后端 ws:// 地址(如 http://backend:8080/ws)
超时与缓冲必须针对性关闭
WebSocket 是长连接、低延迟、流式双向通信,Nginx 默认策略会主动断连或缓存数据,造成中断或延迟。
- proxy_read_timeout 86400:防止空闲时被断开(建议 ≥ 后端心跳间隔的 2 倍)
- proxy_send_timeout 86400:保障大消息或慢响应不被中断
- proxy_buffering off:必须在 location 块内关闭,避免帧堆积乱序
- proxy_cache off:禁用缓存,WebSocket 消息不可缓存
路径匹配与负载均衡注意事项
配置生效的前提是请求真正进入对应 location,且后端健康可用。
- location 使用精确匹配(如 location = /ws)或前缀匹配(location /ws/),避免 rewrite 干扰路径或头信息
- 若用 upstream,建议加 keepalive 32,并配 max_fails/fail_timeout 做基础健康检查
- 高并发场景下推荐 ip_hash 或 sticky cookie,保证同一客户端始终落在同一后端节点(因 WebSocket 连接状态不共享)











