设置nodeProcessCountPerApplication非1时WebSockets无法正常工作
IISNode多进程环境下Feathers Socket.io WebSocket连接失败的解决方法
问题根源
当nodeProcessCountPerApplication设为2或0时,IIS会启动多个Node.js进程,但Socket.io默认使用内存存储(MemoryStore),这种存储无法跨进程共享WebSocket连接状态。客户端请求被负载均衡到不同进程后,新进程没有之前的连接上下文,导致WebSocket握手失败或连接中断。单进程时所有连接状态都在同一个内存空间,所以能正常工作。
解决方案
1. 切换到跨进程的Socket.io存储后端
使用Redis作为Socket.io的适配器,实现多进程间的连接状态共享:
- 安装依赖包:
npm install socket.io-redis redis - 修改
app.js中的Socket.io配置:const socketio = require('@feathersjs/socketio'); const { createAdapter } = require('socket.io-redis'); const { createClient } = require('redis'); const app = express(feathers()); app.configure(socketio((io) => { // 初始化Redis客户端(根据你的Redis配置调整URL) const pubClient = createClient({ url: 'redis://localhost:6379' }); const subClient = pubClient.duplicate(); // 为Socket.io配置Redis适配器 io.adapter(createAdapter({ pubClient, subClient })); }));
2. 确保IIS的WebSocket配置正确
- 确认Windows Server已安装WebSocket协议:打开服务器管理器 → 添加角色和功能 → 展开Web服务器 → 应用程序开发 → 勾选WebSocket协议并完成安装。
- 在
web.config中启用WebSocket支持并配置进程数:<configuration> <system.webServer> <!-- 启用WebSocket --> <webSocket enabled="true" /> <!-- 设置多进程数量 --> <iisnode nodeProcessCountPerApplication="2" /> <!-- 其他iisnode和Express相关配置 --> </system.webServer> </configuration>
3. 验证依赖服务可用性
- 确保Redis服务在Windows Server上正常运行,可通过命令行执行
redis-cli ping,返回PONG则表示连接正常。 - 检查Node.js进程是否有权限访问Redis服务,避免防火墙或权限限制导致连接失败。
内容的提问来源于stack exchange,提问作者Markus
相关产品推荐
相关产品推荐

