关键在于确保稳定:必须透传upgrade和connection头、将proxy_read_timeout等设为3600以上、宿主机调大conntrack超时、容器加ulimit限制,并推荐host网络模式及wss加密代理。

在 Docker 环境下配置 WebSocket 反向代理,关键不是“能不能通”,而是“能不能稳”。很多团队部署后出现连接 30–60 秒无流量就断开、客户端反复重连、健康检查失败等问题,根源不在代码,而在反向代理层对长连接的默认策略不兼容 WebSocket 的生命周期。
必须传递 Upgrade 和 Connection 头
Nginx(或其他反向代理)必须显式透传 WebSocket 握手所需的协议升级头,否则握手失败,连接降级为普通 HTTP。
- proxy_http_version 1.1:WebSocket 基于 HTTP/1.1 的 Upgrade 机制,不能用默认的 1.0
- proxy_set_header Upgrade $http_upgrade:把客户端发来的 Upgrade: websocket 值原样转发
- proxy_set_header Connection "upgrade":固定写死为 upgrade 字符串(注意引号),不是 $http_connection
超时设置必须延长且匹配
WebSocket 是长连接,Nginx 默认的 60 秒超时会主动关闭空闲连接,导致 1006 错误。需同步调整三处:
- proxy_read_timeout:设为 3600 或更高(单位秒),控制 upstream 响应等待时间
- proxy_send_timeout:同样建议设为 3600,避免服务端 ping 超时被中断
- keepalive_timeout:设为 75~300,配合上游 keepalive 连接池使用(非必需但推荐)
Docker 网络与容器参数不可忽略
仅靠 Nginx 配置还不够——Docker 默认 bridge 网络会对长连接施加 conntrack/NAT 限制。
- 宿主机需调大 conntrack 超时:
sysctl -w net.netfilter.nf_conntrack_tcp_timeout_established=3600 - 容器启动时加 --ulimit nofile=65536:65536,防止高并发握手触发 EMFILE
- 生产环境强烈建议 --network=host 模式,彻底绕过 Docker NAT 层
SSL + WebSocket 必须走 wss://
浏览器强制要求加密上下文下的 WebSocket 使用 wss://,HTTP 代理层需正确终止 TLS 并透传 Upgrade。
- Nginx 配置中 listen 443 ssl,并加载有效证书(Let’s Encrypt 或私有 CA)
- 确保 proxy_pass http://backend(后端用 http 即可),Nginx 负责 HTTPS→HTTP 的卸载
- 前端 JavaScript 连接地址必须是
new WebSocket("wss://your-domain.com/ws")











