如何在单个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
相关产品推荐
相关产品推荐

