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

如何解决绑定域名后Socket.io连接出现的服务端错误

Socket.io服务端连接错误排查方案

已知前置条件

  • 绑定域名后首次出现问题
  • 服务器存在两个Apache虚拟主机站点
  • 当前服务使用HTTPS协议

可直接复现的代码错误修复

  1. 证书读取路径错误
    代码中fs.readFileSync('path')为占位值,绑定域名后必须替换为该域名对应的SSL证书、私钥的绝对物理路径,同时确保Node进程对证书文件有可读权限,否则服务启动时会直接抛出文件读取错误。

  2. 静态文件返回路径错误
    res.sendFile('./index.html')使用相对路径会触发路径解析错误,必须替换为绝对路径:

res.sendFile(path.resolve(__dirname, './index.html'))
  1. 缺少跨域配置
    前端从Apache默认的443端口访问9998端口的Socket.io服务属于跨域请求,未配置跨域规则会直接被拦截,初始化Socket.io时添加以下配置:
const io = require('socket.io')(http, {
  cors: {
    origin: "https://你的实际绑定域名", // 测试阶段可临时写*,生产必须指定域名
    credentials: true
  }
});
  1. MySQL连接无错误处理
    当前代码仅初始化MySQL连接,未添加连接错误监听与断连重连逻辑,数据库连接失败时会直接抛出服务端错误,添加以下逻辑:
// 连接监听
db.connect(err => {
  if (err) {
    console.error('数据库连接失败:', err);
    return;
  }
  console.log('数据库连接成功');
});
// 断连处理
db.on('error', err => {
  console.log('数据库异常:', err);
  if (err.code === 'PROTOCOL_CONNECTION_LOST') {
    // 此处添加重连逻辑即可
  }
});

部署层面错误修复

  1. Apache反向代理配置缺失
    无需对外暴露9998端口,直接在对应域名的Apache虚拟主机配置中添加Socket.io反向代理规则,同时避免跨域问题:
# 先启用 required 模块
# a2enmod proxy proxy_http proxy_wstunnel rewrite
RewriteEngine On
RewriteCond %{REQUEST_URI}  ^/socket.io            [NC]
RewriteCond %{QUERY_STRING} transport=websocket    [NC]
RewriteRule /(.*)           ws://127.0.0.1:9998/$1 [P,L]

ProxyPass /socket.io http://127.0.0.1:9998/socket.io
ProxyPassReverse /socket.io http://127.0.0.1:9998/socket.io

修改后重启Apache生效。

  1. 端口规则校验
    如果不使用反向代理,需要确认服务器防火墙、安全组已开放9998端口的HTTPS入站规则。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 20:06:04