Nginx配置WSS反向代理需同时启用HTTPS并透传WebSocket升级头:监听443 SSL端口、配置有效证书与TLS协议,设置proxy_http_version 1.1及Upgrade/Connection等关键头,并调高读写超时以保长连接。

要在 Nginx 中配置安全的 WSS(WebSocket Secure)反向代理,核心是两部分:启用 HTTPS(SSL/TLS)并正确透传 WebSocket 升级请求。缺一不可,否则浏览器会拒绝连接或握手失败。
必须启用 HTTPS 服务
WSS 要求底层是加密通道,所以 Nginx 必须监听 443 端口并加载有效 SSL 证书:
- listen 443 ssl:明确启用 SSL 模式,不能只写 listen 443
-
ssl_certificate 和 ssl_certificate_key:指向你的
.pem(或.crt)和私钥文件,路径需真实可读 - 建议禁用老旧协议:用
ssl_protocols TLSv1.2 TLSv1.3;替代包含 SSLv2/v3 的配置,更安全 - 证书域名必须与前端访问的域名完全一致,否则浏览器会报
NET::ERR_CERT_COMMON_NAME_INVALID
WebSocket 协议升级关键头必须透传
客户端发起 WSS 连接时,会先发一个 HTTP 请求,带 Upgrade: websocket 头,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",不是变量;大小写敏感,不能写成"Upgrade"或漏掉引号 - 务必加上 proxy_set_header Host $host,确保后端能正确识别请求来源域名
推荐添加的健壮性配置
避免连接意外中断或超时重置:
- proxy_read_timeout 86400:设为 24 小时(秒),防止空闲连接被 Nginx 主动关闭
- proxy_send_timeout 86400:同理,保障大消息或慢客户端发送不超时
- 加 proxy_set_header X-Real-IP $remote_addr 和 X-Forwarded-For,方便后端记录真实客户端 IP
- location 路径建议明确区分,例如
/wss/或/realtime/,避免与静态资源冲突
完整配置示例(可直接参考)
假设后端 WebSocket 服务运行在 http://127.0.0.1:8282,域名为 app.example.com,证书放在 /etc/nginx/ssl/:
listen 443 ssl;
server_name app.example.com;
ssl_certificate /etc/nginx/ssl/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
location /wss/ {
proxy_pass http://127.0.0.1:8282/;
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;
}
}
配置完后执行 nginx -t 检查语法,再 nginx -s reload 生效。前端连接地址应为 wss://app.example.com/wss/。











