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

如何在单个URL下运行两个Node.js Socket.io项目?

单URL下运行两个Socket.io项目的实现方案

服务端配置调整

给两个Socket.io服务指定唯一路径,以便Apache区分转发:

服务端1(对应客户端socket1)

const app = express();
const httpServer = createServer(app);
const io = new Server(httpServer, {
  transports: ["polling", "websocket"],
  cors: { origin: ["https://clienturl.com/"] },
  path: "/ws" // 自定义路径,匹配客户端连接配置
});

// 监听端口3001
httpServer.listen(3001, () => {
  console.log("服务端1运行于端口3001");
});

服务端2(对应客户端socket2)

const app = express();
const httpServer = createServer(app);
const io = new Server(httpServer, {
  transports: ["polling", "websocket"],
  cors: { origin: ["https://clienturl.com/"] },
  path: "/ws2" // 另一个自定义路径
});

// 监听端口3002
httpServer.listen(3002, () => {
  console.log("服务端2运行于端口3002");
});

客户端代码修正

调整Socket连接路径匹配服务端配置,同时修正事件监听(客户端应监听connect而非服务端的connection事件):

import { useState, useEffect } from 'react';
import { io, Socket } from 'socket.io-client';

const YourComponent = () => {
  const [socket1, setSocket1] = useState<Socket | null>(null);
  const [socket2, setSocket2] = useState<Socket | null>(null);

  useEffect(() => {
    // 连接服务端1,对应路径/ws
    const socketOne = io("https://your-domain.com", { 
      path: "/ws", 
      transports: ["websocket"] 
    });
    setSocket1(socketOne);

    // 连接服务端2,对应路径/ws2
    const socketTwo = io("https://your-domain.com", { 
      path: "/ws2", 
      transports: ["websocket"] 
    });
    setSocket2(socketTwo);

    return () => {
      socketOne.disconnect();
      socketTwo.disconnect();
    };
  }, []);

  useEffect(() => {
    if (socket1) {
      socket1.on("connect", () => console.log("connected socket1"));
    }
  }, [socket1]);

  useEffect(() => {
    if (socket2) {
      socket2.on("connect", () => {
        console.log("Socket 2 connected");
      });
    }
  }, [socket2]);

  return <div>Your Component</div>;
};

export default YourComponent;

Apache反向代理配置

在你的Apache虚拟主机配置文件中添加以下规则,实现路径转发:

<VirtualHost *:443>
    ServerName your-domain.com
    SSLEngine on
    SSLCertificateFile /path/to/your/certificate.pem
    SSLCertificateKeyFile /path/to/your/private-key.pem

    # 转发/ws到服务端1的3001端口
    ProxyPass /ws http://localhost:3001/ws
    ProxyPassReverse /ws http://localhost:3001/ws

    # 转发/ws2到服务端2的3002端口
    ProxyPass /ws2 http://localhost:3002/ws2
    ProxyPassReverse /ws2 http://localhost:3002/ws2

    # WebSocket支持规则
    RewriteEngine On
    RewriteCond %{HTTP:Upgrade} =websocket [NC]
    RewriteRule /ws/(.*) ws://localhost:3001/ws/$1 [P,L]
    RewriteRule /ws2/(.*) ws://localhost:3002/ws2/$1 [P,L]
</VirtualHost>

配置完成后重启Apache:

sudo systemctl restart httpd

注意事项

  • 确保Lightsail实例的防火墙允许Apache的443端口(已配置HTTPS的情况),3001/3002端口仅需本地访问,无需开放公网。
  • 验证CORS配置中的origin是否与客户端实际域名一致,避免跨域问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 19:45:31