Nginx配置WSS(WebSocket Secure)的关键是在HTTPS基础上增加反向代理与WebSocket协议升级头,同时确保SSL证书有效,无需额外复杂操作。
Nginx配置WSS详细步骤:从证书到反向代理
配置WSS意味着将WebSocket通信从明文升级到TLS加密,几乎所有生产环境都要求WSS,尤其在HTTPS站点下,浏览器会直接阻止非安全WebSocket连接。
前置条件:域名与SSL证书
WSS依赖TLS,所以必须有一个域名和对应的SSL证书,证书可以免费获取,比如Let’s Encrypt,也支持自动续签,如果你使用简米云、酷番云或华为云,它们也提供免费的一年期证书,直接在控制台申请即可,下载Nginx版(.crt和.key文件)。
行业共识认为,免费证书在加密强度上与付费证书一致,对于绝大多数WebSocket场景足够安全,付费证书主要提供商业保险和更长的有效期,但除非你遇到合规审计,否则免费方案完全够用。
配置HTTPS站点
Nginx配置WSS的第一步是确保站点已经跑在HTTPS上,在nginx配置文件中添加一个监听443的server块,并加载证书。
server {
listen 443 ssl;
server_name yourdomain.com;
ssl_certificate /etc/nginx/ssl/yourdomain.crt;
ssl_certificate_key /etc/nginx/ssl/yourdomain.key;
# 你的业务逻辑,比如反向代理
location / {
proxy_pass http://localhost:3000;
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;
}
}
这里已经包含了WebSocket必须的Upgrade和Connection头,因为即使普通HTTP请求也可能包含这些头,但WebSocket必须有,如果你把WebSocket服务放在独立路径,建议单独配置location。
单独配置WebSocket代理
如果WebSocket监听在特定路径,ws,独立配置更清晰:
location /ws/ {
proxy_pass http://localhost: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_read_timeout设置长连接超时,默认60秒会导致频繁断开,生产环境建议设大,比如24小时(86400秒),如果WebSocket服务需要实时推送,这个值必须调整。
验证WSS连接
配置完成后,重载Nginx:nginx -s reload,在客户端使用wss://yourdomain.com/ws连接,如果成功,说明配置生效,如果失败,查看Nginx错误日志/var/log/nginx/error.log,常见问题包括证书路径错误、proxy_pass指向的后端不通、端口被占用等。
生产环境Nginx配置WSS常见问题与优化
实际部署中,许多开发者踩过坑,下面列出高频问题。
证书问题导致握手失败
WSS连接失败,第一反应检查证书,证书是否过期?域名是否匹配?如果使用自签名证书,浏览器直接拒绝,必须使用受信任的CA证书,免费证书如Let’s Encrypt可以满足,如果使用nginx wss证书配置后依然报错,检查证书链是否完整,有些证书需要合并中间证书。
负载均衡下WSS的粘性会话
当有多台WebSocket服务器时,Nginx upstream分发请求,但WebSocket是长连接,同一用户需要始终连接到同一台后端,可以使用
ip_hash或sticky模块实现会话保持。
upstream ws_backend {
ip_hash;
server 192.168.1.10:8080;
server 192.168.1.11:8080;
}
但注意,ip_hash在客户端IP变化时可能失效,更可靠的是使用sticky cookie,对于大多数中小项目,单机部署或简单轮询也能跑,只是会在连接迁移时产生重连。
端口与防火墙设置
WSS默认走443端口,不需要额外开放,但如果你的WebSocket后端监听非标准端口,比如8080,Nginx通过proxy_pass转发,防火墙需要允许Nginx与后端通信,云服务器还要在安全组开放相应端口,如果使用nginx配置wss免费证书,证书本身不需要额外端口,但别忘了检查443端口是否被占用,比如同时跑了其他HTTPS服务。
连接超时与性能调优
WebSocket长连接占用资源,高并发下需要调整worker_connections和keepalive,proxy_read_timeout和proxy_send_timeout根据业务设置,实时推送要求大值,偶尔轮询可以设小一些,如果出现大量连接断开,先检查超时时间,再检查后端WebSocket服务是否主动关闭。
Nginx配置WSS与普通WS的对比:安全性差距
很多入门者纠结用ws还是wss,直接对比:
| 特性 | WS | WSS |
|---|---|---|
| 加密 | 无 | TLS加密 |
| 默认端口 | 80 | 443 |
| 浏览器要求 | HTTPS页面禁止使用 | 允许 |
| 证书要求 | 无 | 需要SSL证书 |
| 性能 | 较快,无加密开销 | 略慢,但差异可忽略 |
| 安全性 | 明文传输,容易被监听 | 加密,防止篡改 |
nginx配置wss和ws区别核心在于加密,在公网环境下,WSS是唯一安全选择,即使内网,如果涉及敏感数据,也建议用WSS,因为内网同样存在监听风险。
用户最关心的Nginx配置WSS问题
问题1:nginx配置wss必须要有域名吗?
是的,WSS依赖TLS证书,而公共CA基本不签发纯IP的证书,所以用域名是最简单的方式,即使你只有IP地址,也可以考虑用内网DNS或自签名证书,但自签名证书会被浏览器阻止,不适合生产环境。nginx配置wss步骤中第一件事就是准备域名和证书。
问题2:nginx配置wss免费证书够用吗?
免费证书(如Let’s Encrypt)在加密强度上完全足够,生产环境推荐使用,只要配置自动续签,就能避免证书过期导致的连接中断,付费证书主要提供商业保险和更长的有效期,但多数WebSocket场景不需要,如果你选择nginx配置wss免费证书,建议使用acme.sh或certbot设置定时任务,确保证书自动更新。
问题3:nginx配置wss后客户端连不上,怎么排查?
按顺序检查:1) 证书是否匹配域名且未过期;2) nginx是否监听443端口,且防火墙放行;3) proxy_pass地址是否正确,后端服务是否启动;4) 客户端是否使用wss://协议而不是ws://;5) 查看nginx错误日志,通常能直接定位错误,如果使用nginx wss证书配置后报错“SSL握手失败”,优先检查证书路径和权限。
Nginx配置WSS就是将WebSocket代理放在HTTPS站点下,加上正确的协议升级头,并确保证书有效,只要按步骤配置,就能让你的实时通信既安全又稳定。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/536296.html



