Nginx代理WSS需同时终结TLS并透传WebSocket升级请求:配置有效证书、TLSv1.2+、会话复用;设置proxy_http_version 1.1及Upgrade/Connection头;关闭缓冲,调大read/send超时;补充IP限制、频率控制与后端鉴权。

要在 Nginx 中正确代理 WSS(WebSocket Secure)流量,核心是让 Nginx 同时承担 TLS 终结和 WebSocket 协议升级转发两个角色。不是加个 HTTPS 就完事,关键在协议透传、连接保活和安全边界控制。
启用 SSL/TLS 并终结在 Nginx
Nginx 必须直接处理 TLS 握手,客户端访问的是 wss://your-domain.com/wss/,所有加密解密由 Nginx 完成,后端保持普通 ws(HTTP)即可,减轻业务服务负担。
- 使用有效的证书:推荐 Let’s Encrypt 的
fullchain.pem和privkey.pem,路径需写全 - 禁用老旧协议:至少保留
TLSv1.2或TLSv1.3,移除 SSLv2/v3、TLSv1.0/1.1(除非兼容旧设备) - 开启会话复用:
ssl_session_cache shared:SSL:10m和ssl_session_timeout 4h可显著降低 TLS 握手开销
透传 Upgrade 协议头并强制 HTTP/1.1
WebSocket 连接始于一个 HTTP Upgrade 请求,Nginx 必须原样传递关键头部,否则后端无法识别并完成协议切换。
-
proxy_http_version 1.1:WebSocket 依赖 HTTP/1.1 的持久连接能力,不能用默认的 1.0 -
proxy_set_header Upgrade $http_upgrade:把客户端带的Upgrade: websocket头传下去 -
proxy_set_header Connection "upgrade":注意值必须是字面量"upgrade"(带英文双引号),不是变量 - 额外建议加上
proxy_set_header Host $host和X-Forwarded-For,便于后端日志与鉴权
关闭缓冲与调整超时保障长连接稳定
WebSocket 是持续双向流,Nginx 默认的 HTTP 缓冲和短超时会中断连接或造成延迟,必须针对性调优。
-
proxy_buffering off:禁用响应缓冲,确保消息实时到达客户端 -
proxy_read_timeout 86400(24 小时):防止空闲连接被 Nginx 主动断开;也可按业务设为 3600–21600(1–6 小时) -
proxy_send_timeout 86400:匹配读超时,避免单向阻塞导致连接僵死 - 可选:
proxy_busy_buffers_size 32k和proxy_buffer_size 16k,适配较大帧(如二进制消息)
补充安全与健壮性措施
仅通 WSS 不代表真正安全。真实生产环境还需叠加访问控制层和连接治理。
- 限制来源:用
allow/deny或 GeoIP 模块控制允许接入的 IP 段 - 防滥用:配合
limit_req对/wss/路径做连接频率限制(例如每秒最多 5 次 upgrade 请求) - 后端校验:Nginx 不替代业务鉴权,务必在 WebSocket 握手阶段(如 query 参数或 cookie)由后端验证 token 或 session
- 健康检查:若用 upstream,加入
health_check interval=3 fails=2 passes=2避免故障节点转发
配置完成后记得 nginx -t 检查语法,再 nginx -s reload 生效。浏览器开发者工具的 Network 标签页中能看到状态码为 101 Switching Protocols,且协议显示 wss,就说明 WSS 代理已就绪。


















