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

设置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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 05:03:09