Socket.IO集群部署时HTTP运行正常、HTTPS无法生效问题咨询
问题根因
Worker进程重复创建HTTPS服务实例是核心错误。@socket.io/sticky的工作逻辑为:主进程负责监听端口、完成TLS握手、执行 sticky 会话转发,Worker进程仅需挂载Socket.IO实例即可,无需再独立创建HTTPS服务、也不需要监听端口。
修复后代码
const cluster = require("cluster"); const https = require("https"); var fs = require("fs"); const { Server } = require("socket.io"); const numCPUs = require("os").cpus().length; const { setupMaster, setupWorker } = require("@socket.io/sticky"); const { createAdapter, setupPrimary } = require("@socket.io/cluster-adapter"); const sslOptions = { key: fs.readFileSync("security/cert.key"), cert: fs.readFileSync("security/cert.pem") }; const options = { cors: true, origins: "*" }; if (cluster.isMaster) { console.log(`Master ${process.pid} is running`); const httpServer = https.createServer(sslOptions); // setup sticky sessions setupMaster(httpServer, { loadBalancingMethod: "least-connection" }); setupPrimary(); cluster.setupPrimary({ serialization: "advanced" }); httpServer.listen(8000); for (let i = 0; i < numCPUs; i++) { cluster.fork(); } cluster.on("exit", (worker) => { console.log(`Worker ${worker.process.pid} died`); cluster.fork(); }); } else { console.log(`Worker ${process.pid} started`); // 移除Worker进程里的HTTPS服务创建逻辑 const io = new Server(options); // use the cluster adapter io.adapter(createAdapter()); // setup connection with the primary process setupWorker(io); io.on("connection", (socket) => { console.log("connected" + process.pid); io.emit("data", "connected to worker: " + cluster.worker.id); }); }
额外校验项
- 确认证书文件
security/cert.key、security/cert.pem的读取权限正常,主进程启动用户可正常读取这两个文件 - 客户端连接时使用和证书匹配的域名,不要直接用IP访问,避免证书校验失败导致连接断开
- 如果前端有反向代理层,需确保代理开启了WebSocket支持、sticky会话配置,同时正确透传HTTPS相关请求头
内容的提问来源于stack exchange,提问作者Lalit yogi
相关产品推荐
相关产品推荐

