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

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>

验证流程

  1. 重启Apache和NodeJS服务
  2. 先测NodeJS原生端口,确认服务正常
  3. 再测Apache代理后的WebSocket地址
  4. 查看Apache的error.log和NodeJS控制台输出,定位异常日志

内容的提问来源于stack exchange,提问作者user17529905

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 21:33:11