SiteGround生产环境WebSocket无法连接及证书配置问题咨询
SiteGround生产环境部署Socket.IO问题:证书缺失+WebSocket连接失败
问题描述
我正尝试在SiteGround生产环境部署Socket.IO服务,需要使用privkey.pem和fullchain.pem证书,但在SiteGround中找不到这两个文件。希望将服务与这些证书关联,同时当前遇到WebSocket连接失败的问题,想咨询SiteGround是否支持WebSocket连接,或者有其他解决办法?
服务端代码
import { createServer as createHttpServer } from "http"; import { createServer as createHttpsServer } from "https"; import { Server } from "socket.io"; import setupSocket from "./socket/socket.js"; import fs from "fs"; const isLocal = process.env.NODE_ENV !== "production"; let server; if (isLocal) { server = createHttpServer(); } else { const options = { key: fs.readFileSync("/etc/ssl/privkey.pem"), cert: fs.readFileSync("/etc/ssl/fullchain.pem"), }; server = createHttpsServer(options); } const io = new Server(server, { cors: { origin: isLocal ? ["http://localhost:5173", "http://127.0.0.1:8000"] : [ "mydomain.com" ], credentials: true, }, transports: ["websocket"], }); io.on("connection", (socket) => { console.log("✅ Dashboard connected:", socket.id); socket.on("disconnect", () => { console.log("❌ Dashboard disconnected:", socket.id); }); }); // app.post("/emit-user-tracking", (req, res) => { // const data = req.body; // io.emit("newTracking", data); // send to all connected clients // console.log("📡 New tracking event:", data); // res.json({ status: "ok" }); // }); httpServer.listen(6001, '0.0.0.0', () => { console.log("⚡ Socket.IO server running on port 6001"); });
客户端代码
S.socket = io("mydomain.com:6001", { withCredentials: true, auth: payload, autoConnect: true, transports: ["websocket"], });
当前错误信息
manager.js:138 WebSocket connection to 'wss://sohraba28.sg-host.com:7001/socket.io/?EIO=4&transport=websocket' failed: WebSocket is closed before the connection is established.
解决建议
1. 证书文件获取
SiteGround的SSL证书不会存放在/etc/ssl/目录,有两种获取方式:
- 通过Site Tools面板:进入
Security > SSL Manager,找到对应域名的SSL证书,点击Download,压缩包内包含私钥(一般命名为private.key)和完整证书链(certificate.crt或类似名称),下载后替换代码中的文件路径和名称。 - 通过SSH连接服务器:证书文件默认存放在用户目录下的
~/ssl/文件夹中,可直接读取该路径下的对应文件。
2. WebSocket支持与连接问题解决
SiteGround支持WebSocket,但需根据主机类型调整配置:
- 共享主机限制:共享主机不允许使用自定义端口(如代码中的6001),需通过反向代理映射请求:
在网站根目录的.htaccess文件中添加以下规则:
客户端连接时无需指定端口,改为:RewriteEngine On RewriteCond %{REQUEST_URI} ^/socket.io [NC] RewriteCond %{QUERY_STRING} transport=websocket [NC] RewriteRule /(.*) ws://localhost:6001/$1 [P,L]S.socket = io("https://mydomain.com", { withCredentials: true, auth: payload, autoConnect: true, transports: ["websocket"], }); - 云服务器(Cloud Hosting):需在SiteGround的防火墙设置中开放6001端口,确保外部能访问。
- 代码错误修正:服务端最后一行的
httpServer.listen应为server.listen,变量名不匹配会导致服务无法启动,修正后才能正常监听端口。 - CORS配置修正:生产环境的origin需包含完整协议(如
"https://mydomain.com"),避免跨域校验失败。
内容的提问来源于stack exchange,提问作者Mujahid Ali
相关产品推荐
相关产品推荐

