nginx支持wss的核心是正确配置http/1.1协议升级机制并由其终止tls:必须设proxy_http_version 1.1、proxy_set_header upgrade $http_upgrade、proxy_set_header connection "upgrade",同时配置ssl_certificate与ssl_certificate_key实现ssl终止,后端使用ws://即可。

要在 Nginx 中让 WebSocket 代理支持 SSL 加密传输(即 WSS),核心不是“开启某个开关”,而是正确配置协议升级机制 + TLS 终止。Nginx 本身不加密 WebSocket 数据帧,而是通过标准 HTTP/1.1 Upgrade 流程完成握手,并在自身层面卸载 TLS —— 这样后端可以继续用轻量的 ws://,不用处理证书和加解密。
必须配置的三项关键头与协议版本
WebSocket 的建立依赖一次特殊的 HTTP 请求升级,Nginx 必须透传并参与这个过程:
- proxy_http_version 1.1:HTTP/1.0 不支持 Connection: upgrade,这是基础前提
- proxy_set_header Upgrade $http_upgrade:动态转发浏览器发来的 Upgrade 头(值为 websocket),不能硬写死
- proxy_set_header Connection "upgrade":固定设为 upgrade,告诉 Nginx 允许协议切换;注意这里用双引号包裹字符串,不是变量
SSL 终止必须由 Nginx 完成
浏览器访问的是 wss://,意味着 TLS 握手必须在 Nginx 层结束。你不需要、也不建议让后端再跑 HTTPS 或 wss:// —— 那会增加 CPU 开销且破坏代理逻辑:
- listen 443 ssl 指令启用 HTTPS 监听
- ssl_certificate 和 ssl_certificate_key 指向有效的 PEM 格式证书和私钥
- 推荐启用 TLSv1.2 及以上,禁用 TLSv1.0/1.1(安全合规)
- 可选 add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" 强制后续请求走 HTTPS
location 路由与超时设置
WebSocket 是长连接,Nginx 默认的 60 秒超时会主动断开,需显式延长:
- location 块应覆盖实际 WebSocket 路径(如 /chat、/ws、/api/ws)
- proxy_pass 指向后端 ws:// 地址(例如 http://127.0.0.1:8080)
- proxy_read_timeout 和 proxy_send_timeout 建议设为 86400(24 小时)或更大,避免空闲断连
- proxy_buffering off 可选,防止大消息被缓存导致延迟(尤其推送频繁场景)
常见错误排查点
配置看似完整但连接失败,往往卡在这几个细节:
- 证书路径错误或权限不足(Nginx worker 进程需有读取 .key 文件权限)
- Connection 头写成 proxy_set_header Connection $http_connection —— 错误!必须是固定值 "upgrade"
- 后端服务监听地址未绑定到 localhost 或 127.0.0.1,导致 proxy_pass 连接拒绝
- 防火墙或云厂商安全组未开放 443 端口(WSS)或后端服务端口(如 8080)
- 前端 JavaScript 使用 new WebSocket("wss://..."),但 Nginx 配置的 server_name 与域名不一致,导致 SNI 匹配失败











