NodeJS WebSocket无法连接问题排查求助
问题核心分析
101是HTTP协议切换到WebSocket的标准成功响应,Postman报错这个,本质是服务器的握手逻辑、Apache代理配置和Postman的连接方式三者不匹配,优先排查以下环节:
排查&修复步骤
1. 先确认NodeJS服务本身是否正常
绕开Apache,直接用Postman连NodeJS的服务端口(比如你用的8880):
- Postman新建WebSocket请求,地址填
ws://你的服务器IP:8880(非SSL)或wss://你的服务器IP:8880(SSL) - 如果直接连仍报101错误,说明是
radar.js的WebSocket逻辑有问题;如果能正常连接,问题百分百出在Apache的虚拟主机配置上。
2. 检查radar.js的WebSocket实现
确保代码正确处理HTTP升级请求,以下是标准的基础示例,对照你的代码修正:
const http = require('http'); const WebSocket = require('ws'); // 创建HTTP服务器,WebSocket挂载其上 const server = http.createServer((req, res) => { res.writeHead(200); res.end('HTTP Server Running'); }); const wss = new WebSocket.Server({ server }); wss.on('connection', (ws) => { console.log('客户端已连接'); ws.on('message', (msg) => { console.log(`收到消息: ${msg}`); ws.send(`响应: ${msg}`); }); ws.on('close', () => console.log('客户端断开连接')); }); server.listen(8880, () => console.log('服务运行在8880端口'));
如果你的代码没有正确绑定HTTP服务器、或者升级逻辑缺失,会导致握手异常。
3. 修正Apache虚拟主机配置(关键)
WebSocket需要专门的代理配置,不能用普通HTTP反向代理,以下是两种场景的正确配置:
非SSL(HTTP)场景
<VirtualHost *:80> ServerName yourdomain.com DocumentRoot /你的前端文件路径 # 将WebSocket请求代理到NodeJS服务 ProxyPass /ws ws://localhost:8880/ ProxyPassReverse /ws ws://localhost:8880/ ProxyRequests Off ProxyPreserveHost On </VirtualHost>
此时Postman连接地址应为ws://yourdomain.com/ws,而非直接连8880端口。
SSL(HTTPS)场景
<VirtualHost *:443> ServerName yourdomain.com DocumentRoot /你的前端文件路径 SSLEngine On SSLCertificateFile /你的证书路径/cert.pem SSLCertificateKeyFile /你的证书路径/key.pem # WebSocket代理需用wss协议 ProxyPass /ws wss://localhost:8880/ ProxyPassReverse /ws wss://localhost:8880/ ProxyRequests Off ProxyPreserveHost On </VirtualHost>
此时Postman连接地址应为wss://yourdomain.com/ws。
必须启用Apache模块:
a2enmod proxy proxy_wstunnel systemctl restart apache2
4. 纠正Postman连接的常见错误
- 必须用
ws://或wss://协议头,不能用http:///https:// - 用Apache代理的话,要访问代理后的路径(比如
/ws),不是NodeJS的原始端口 - 检查服务器防火墙是否开放了8880、80/443端口
5. 前端index.html的连接地址修正
确保前端和代理路径一致:
<script> // 非SSL环境用ws,SSL用wss const ws = new WebSocket('ws://yourdomain.com/ws'); ws.onopen = () => console.log('WebSocket连接成功'); ws.onmessage = (event) => { // 这里写更新网站信息的逻辑 console.log('收到更新:', event.data); }; </script>
验证流程
- 重启Apache和NodeJS服务
- 先测NodeJS原生端口,确认服务正常
- 再测Apache代理后的WebSocket地址
- 查看Apache的
error.log和NodeJS控制台输出,定位异常日志
内容的提问来源于stack exchange,提问作者user17529905
相关产品推荐
相关产品推荐

