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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.01 22:34:50