如何解决绑定域名后Socket.io连接出现的服务端错误
Socket.io服务端连接错误排查方案
已知前置条件
- 绑定域名后首次出现问题
- 服务器存在两个Apache虚拟主机站点
- 当前服务使用HTTPS协议
可直接复现的代码错误修复
证书读取路径错误
代码中fs.readFileSync('path')为占位值,绑定域名后必须替换为该域名对应的SSL证书、私钥的绝对物理路径,同时确保Node进程对证书文件有可读权限,否则服务启动时会直接抛出文件读取错误。静态文件返回路径错误
res.sendFile('./index.html')使用相对路径会触发路径解析错误,必须替换为绝对路径:
res.sendFile(path.resolve(__dirname, './index.html'))
- 缺少跨域配置
前端从Apache默认的443端口访问9998端口的Socket.io服务属于跨域请求,未配置跨域规则会直接被拦截,初始化Socket.io时添加以下配置:
const io = require('socket.io')(http, { cors: { origin: "https://你的实际绑定域名", // 测试阶段可临时写*,生产必须指定域名 credentials: true } });
- 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') { // 此处添加重连逻辑即可 } });
部署层面错误修复
- 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生效。
- 端口规则校验
如果不使用反向代理,需要确认服务器防火墙、安全组已开放9998端口的HTTPS入站规则。
内容的提问来源于stack exchange,提问作者likel0vsky
相关产品推荐
相关产品推荐

