websocket反向代理需通过nginx补足加密、访问控制与审计能力:强制wss并校验证书、精准透传upgrade/connection头、隐藏后端信息、合理设置超时与连接限制。

WebSocket 反向代理本身不自带加密和访问控制,Nginx 作为中间层必须主动补足这些能力。加固核心不是“让连接通”,而是“让连接可信、可控、可审计”。重点在协议升级防护、流量加密、后端隐藏和连接生命周期管理四个层面。
强制使用 WSS 并校验 TLS 连接
浏览器在 HTTPS 页面中禁止建立 ws:// 连接,所以生产环境必须走 wss://。这不只是加个 SSL 配置那么简单:
- 监听 443 端口并启用 ssl_protocols TLSv1.2 TLSv1.3,禁用不安全的旧版本
- 证书必须由受信 CA 签发(如 Let’s Encrypt),自签名证书仅限内网调试
- 配置 ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m,减少 TLS 握手开销
- 前端连接地址必须是 wss://your-domain.com/ws,不能写成 ws:// 或带 IP 的地址
精准传递 Upgrade 协议头,防止握手失败
WebSocket 握手依赖两个关键请求头,Nginx 必须原样透传且不干扰:
- proxy_set_header Upgrade $http_upgrade:动态取客户端原始 Upgrade 值(如 websocket)
- proxy_set_header Connection "upgrade":固定写死为 upgrade,不能写成 $http_connection
- 务必配合 proxy_http_version 1.1,HTTP/1.0 不支持长连接升级
- 避免其他 proxy_set_header 指令覆盖或误删这两个头(例如某些安全模块会自动清理 Connection)
隐藏后端细节,阻断信息泄露路径
攻击者常通过响应头反推后端技术栈或网络拓扑,WebSocket 流量同样需要净化:
- 在 server 或 location 块中添加:proxy_hide_header Server; proxy_hide_header X-Powered-By;
- 禁用 Nginx 自身版本暴露:server_tokens off;(放在 http 块顶层)
- 不要把后端服务的完整路径或调试信息返回给客户端(比如 Spring Boot 的 Whitelabel Error Page)
- 若后端是 Node.js + Socket.IO,确保未开启
transports: ['polling']回退,否则可能暴露 HTTP 轮询接口
限制连接行为,防范资源耗尽攻击
长连接容易被滥用来占满连接池或触发内存泄漏,需从超时、缓冲、并发三方面设防:
- proxy_read_timeout 86400 和 proxy_send_timeout 86400:按业务设定合理上限(如聊天类设 24h,监控类可更短)
- proxy_buffering off:禁用缓冲,避免大消息堆积导致延迟或 OOM
- 使用 upstream keepalive 32 控制与后端的复用连接数,避免每个客户端都建新连接
- 搭配 limit_conn(基于 $binary_remote_addr)或第三方模块如 nginx-module-vts 做连接数限制











