Node.JS + socket.io + IIS = ECONNRESET

5
我正在8081端口上运行一个SSL套接字。虽然在Apache2.4上完美运行,但在IIS上一段时间后,socket.io会崩溃并显示ECONNRESET错误,这在Apache中从未发生过。我的socket.io版本是1.3.7。IIS是v10(Windows Server 2016)。
我已经按建议添加了一些错误处理,但无法解决问题。以下是经过清理的代码。
var options = {
  key: fs.readFileSync('example.key'),
  cert: fs.readFileSync('example.cert'),
  ca: fs.readFileSync('example.inter')
};

var app = require('https').createServer(options),
io = require('socket.io').listen(app);  
io.set('origins', '*:8081');
app.on('error', function(error){
    console.log('error', error);
});
app.listen(8081);

io.sockets.on('connection', function(__socket) {

     __socket.on('error', function(){
          __socket.destroy();
     });

     __socket.on('disconnect', function(){
          __socket.destroy();
     });
}

我读到,你可以通过添加密码来修复这个问题。

ciphers: 'DES-CBC3-SHA'

但我不知道它与我的代码有多少关联,甚至不知道应该把它放在哪里! 这是错误的详细信息。
{ Error: socket hang up
at createHangUpError (_http_client.js:253:15)
at Socket.socketCloseListener (_http_client.js:285:23)
at emitOne (events.js:101:20)
at Socket.emit (events.js:188:7)
at TCP._handle.close [as _onclose] (net.js:497:12) code: 'ECONNRESET' }

编辑:已更新至最新版本(2.0.3),但仍存在问题。

编辑2:使用io.emit时似乎会发生ECONNERESET,这很奇怪,因为它感觉像是在未先验证套接字是否仍然连接的情况下尝试进行发射...


只是为了明确,您的 IIS 是否作为反向代理在您的 Node 应用程序前面运行?如果是这样,您是否有特殊原因使用 SSL 加密 IIS 和 Node 之间的通信? - Mathieu de Lorimier
不,IIS在443端口运行。Node/Socketio在8081端口运行SSL。 - Eric
那么IIS和Node之间的联系是什么呢?IIS只是提供连接到socket.io应用程序的页面吗? - Mathieu de Lorimier
请确认一下,您的 Windows 服务器上是否已安装 iisnode? - RickyM
不,IIS NODE 没有安装。 - Eric
显示剩余4条评论
2个回答

4

我认为在托管node.js应用程序时,IIS WebSockets实现存在问题,正如我在Tomasz Janczuk的文章中看到的那样 - 使用iisnode在IIS中托管socket.io WebSocket应用程序

有一个关于使用web.config文件配置IIS的部分,Janczuk提到,在IIS中提供的WebSocket和node.js WebSocket实现之间存在冲突。

我还查看了在IIS 8中引入的WebSocket设置,并且在IIS 10中没有进行任何修改。

我建议尝试按照Janczuk文章中提到的方法,使用IIS的web.config禁用IIS WebSocket设置。

<WebSocket enabled="false"/>

谢谢,我会尝试并汇报。 - Eric
所以这不会起作用,因为我甚至没有在IIS中启用websocket角色/功能。 - Eric
这不是一个有效的答案,这是自动验证。提供的所有答案都无效。 - Eric
即使您直接访问节点应用程序,仍然会通过IIS,这可能会导致问题。 IIS节点有助于管理IIS可能引起的中断。 我认为在大多数情况下都是如此。 - RickyM
1
正如我所提到的:Node和IIS运行在不同的端口上。IIS和Node彼此之间没有交流。IIS甚至都没有安装Websocket。 - Eric
显示剩余2条评论

2

试试这个

var options = {
  key: fs.readFileSync('example.key'),
  cert: fs.readFileSync('example.cert'),
  ca: fs.readFileSync('example.inter'),
  ciphers: 'DES-CBC3-SHA'
};

请参考这里


通常每天至少会发生一次,所以我明天会回复。我想我甚至没有尝试将密码放入选项中,真是太傻了... - Eric

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接