要让 nginx 代理的 websocket 连接真正安全,需同步落实加密、协议透传、访问控制和连接稳定性四层:启用 wss 并由 nginx 终结 tls,严格透传 upgrade 头,禁用缓冲与缓存,结合限流、ip 控制及后端鉴权。

要让 Nginx 代理的 WebSocket 连接真正安全,核心不是只加个 HTTPS,而是把加密、协议透传、访问控制和连接稳定性四层一起做实。
用 WSS 强制走 TLS 加密通道
WebSocket 本身不加密,必须通过 WSS(即 wss://)承载在 TLS 之上。Nginx 必须终结 SSL/TLS:
- 配置有效的 SSL 证书(推荐 Let’s Encrypt 的 fullchain.pem + privkey.pem)
-
listen 443 ssl,禁用老旧协议:ssl_protocols TLSv1.2 TLSv1.3 - 关闭不安全套件:
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256 - 加上
ssl_prefer_server_ciphers on和ssl_session_cache shared:SSL:10m提升复用效率
严格透传升级头,防止握手被截断
WSS 握手失败多数源于 Upgrade 流程被破坏,Nginx 必须原样转发关键逐跳头:
-
proxy_http_version 1.1—— HTTP/1.0 不支持 Upgrade,缺了就直接 400 -
proxy_set_header Upgrade $http_upgrade—— 用变量兼容 WebSocket/MQTT/STOMP 等多种 upgrade 场景 -
proxy_set_header Connection "upgrade"—— 必须是固定字符串 "upgrade",不能写$http_connection(它常含 keep-alive,会覆盖升级意图)
关掉缓存与缓冲,避免帧流错乱
WebSocket 是裸 TCP 帧流,任何中间缓存或缓冲都会导致粘包、延迟甚至连接静默中断:
-
proxy_buffering off—— 禁用响应体缓冲,防止 TEXT/BINARY 帧被合并 - 绝对不用
proxy_cache相关指令 —— WebSocket 消息不可缓存,启用即断连 -
tcp_nodelay on—— 绕过 Nagle 算法,小帧(如光标移动、按键)立即发出
加固访问控制与运行时防护
光有加密还不够,得防未授权接入和异常流量:
- 用
limit_conn和limit_req控制单 IP 并发连接数与升级请求频次 - 配合防火墙或 Nginx 的
allow/deny限制来源 IP 段(尤其管理类 ws 接口) -
server_tokens off隐藏版本号,autoindex off防目录遍历 - 后端校验 token 或 session(Nginx 可透传
X-Forwarded-For和X-Forwarded-Proto,由业务层做鉴权)











