You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 15:10:24