Nginx+Certbot配置Websockets失败,无法连接WSS求助
WSS连接失败排查求助
配置文件及错误信息
Nginx 配置(conf.d/my_wss.conf)
server { server_name wss.example.com; location / { proxy_pass http://localhost:9944; proxy_http_version 1.1; 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_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } listen 443 http2 ssl; listen [::]:443 http2 ssl; ssl_certificate /etc/letsencrypt/live/wss.example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/wss.example.com/privkey.pem; }
Node.js 服务器代码(server.js)
const server = new https.createServer({ cert: fs.readFileSync('/etc/letsencrypt/live/wss.example.com/cert.pem'), keys: fs.readFileSync('/etc/letsencrypt/live/wss.example.com/privkey.pem') }); const websocketServer = new WebSocketServer({server}); websocketServer.on('connection', (ws, request) => { ws.on('close', () => { }); ws.on('message', (data, isBinary) => { }); }); server.listen(9944);
浏览器客户端代码(client.js)
websocket = new WebSocket(`wss://wss.example.com`); websocket.onclose = event => { console.log(event.code) // 106 };
错误现象
- 浏览器连接时抛出错误码106,无法建立连接。
- 服务器本地用wscat测试结果:
$ wscat -c wss://localhost:9944 error: write EPROTO 140551547832256:error:14094410:SSL routines:ssl3_read_bytes:sslv3 alert handshake failure:../deps/openssl/openssl/ssl/record/rec_layer_s3.c:1565:SSL alert number 40 $ wscat -c wss://wss.example.com error: Unexpected server response: 502
请问哪里配置出错了?
问题排查及解决
核心错误点
1. Node.js 服务器重复启用HTTPS导致协议不匹配
Nginx已经作为SSL终止层处理WSS加密连接,之后会通过HTTP协议将请求代理到Node的9944端口。但你的Node代码用了https.createServer,在9944端口监听HTTPS请求,Nginx用HTTP发请求过去,双方协议不兼容,直接引发502错误和握手失败。
2. Node.js HTTPS配置参数错误
代码中https.createServer的配置参数写的是keys,正确参数名应为**key**(单数),这个错误会导致私钥加载失败,进一步加剧SSL握手错误。
修复步骤
步骤1:修改Node.js服务器代码
将HTTPS服务器改为HTTP服务器(因Nginx已处理SSL):
// 替换https为http模块 const server = new http.createServer(); const websocketServer = new WebSocketServer({server}); websocketServer.on('connection', (ws, request) => { ws.on('close', () => { }); ws.on('message', (data, isBinary) => { }); }); server.listen(9944);
步骤2:重新加载Nginx配置
确保Nginx应用最新配置:
sudo nginx -s reload
步骤3:修正测试命令
- 测试Node服务器直接连接(无需SSL):
wscat -c ws://localhost:9944
- 测试通过Nginx的WSS连接:
wscat -c wss://wss.example.com
完成以上修改后,浏览器的WSS连接即可正常建立。
内容的提问来源于stack exchange,提问作者undefinedman
相关产品推荐
相关产品推荐

