Nginx 代理 WSS 的核心是将 wss:// 请求解密后以 ws 协议转发至后端,需配置 HTTP/1.1、Upgrade 和 Connection 头、SSL 证书、长连接超时(如 86400 秒)等关键项。

用 Nginx 做 WSS 代理,核心是让外部 wss:// 请求经由 Nginx 解密后,以普通 ws 协议转发给后端服务。不需要改业务代码,证书由 Nginx 统一管理,这是最常用也最稳妥的生产方案。
必须配置的 WebSocket 升级头
WebSocket 连接依赖 HTTP/1.1 的 Upgrade 机制,Nginx 必须显式透传并触发协议升级:
- proxy_http_version 1.1:强制使用 HTTP/1.1,因为 Upgrade 只在该版本有效
- proxy_set_header Upgrade $http_upgrade:把客户端原始的 Upgrade 头原样传给后端
- proxy_set_header Connection "upgrade":通知后端这是一个升级请求,不是普通 HTTP
SSL 证书与监听设置
Nginx 需要监听 443 端口并加载有效的 TLS 证书,才能响应 wss:// 请求:
- 使用 listen 443 ssl 开启 HTTPS 监听
- ssl_certificate 和 ssl_certificate_key 指向你的公钥和私钥文件(如 Let’s Encrypt 的 fullchain.pem 和 privkey.pem)
- 建议启用 TLSv1.2 及以上,禁用老旧协议:ssl_protocols TLSv1.2 TLSv1.3
超时与连接稳定性
WebSocket 是长连接,Nginx 默认的 60 秒超时会直接断开视频流或实时推送:
- proxy_read_timeout 86400:设置为 24 小时,防止空闲断连
- proxy_send_timeout 86400:同上,保障双向持续通信
- 可选加 proxy_buffer_size 128k 应对高吞吐视频帧
完整可用的 server 块示例
假设后端 ws 服务运行在 http://127.0.0.1:8080,域名为 video.example.com:
server {
listen 443 ssl http2;
server_name video.example.com;
ssl_certificate /etc/letsencrypt/live/video.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/video.example.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_read_timeout 86400;
proxy_send_timeout 86400;
}
}


















