【问题标题】:nodejs running two apps on one portnodejs 在一个端口上运行两个应用程序
【发布时间】:2013-10-01 03:01:41
【问题描述】:

为了减少因应用程序长时间重启而导致的停机时间,我想到了类似的方法:

  1. 端口 80 上的主应用程序 #1。
  2. 也在端口 80 上故障转移应用程序 #2,但仅在应用程序 #1 不工作时回复请求。
  3. 让 App #2 为活跃用户提供“维护”消息。

在同一个端口上运行两个进程以Error: EADDRINUSE 结束 - 所以简单的方法行不通。我偶然发现了server.on('error') 事件,并决定让 App #2 等到 App #1 可能停止,以便端口可用:

function tryPitchIn(){
     var server = http.createServer(app);

     server.on('listening', function(){
        console.log('Application #1 crashed/ended');
        console.log('Pitching in...');
     });

     server.on('error', function(){
        console.log('noting to do');
        setTimeout(tryPitchIn, 250);
     });

     server.listen(80);
}

tryPitchIn();

虽然上面的工作很好,但我不得不在初始化 App #1 时结束 App #2,这在不同的操作系统上并不容易。

是否可以给节点进程(由npm start 启动)一个静态 ID 以从另一个进程终止它 - 最好是跨操作系统?还是对场景的其他想法?

【问题讨论】:

  • 我不想重新启动它,我只想为当前活跃的用户提供一个“我们正在维护我们的服务”页面! (我需要在应用更新时重新启动服务器,这可能需要几秒钟来构建公共库等)
  • 在 Nginx 之类的东西后面反向代理您的应用程序是一种有效(且常见)的策略。

标签: javascript node.js process failover


【解决方案1】:

您可以在另一个端口上为您的 App #1 提供服务,并编写一个微应用来代理对它的请求,并在对 App #1 的请求失败时返回其他内容。你可以像here一样使用node-http-proxy,或者像this一样推出你自己的解决方案,然后添加一个“on error”子句。

【讨论】:

    【解决方案2】:

    我喜欢 Amadan 的回答。最重要的是,我不得不提一下,除了登录.on('error')(以及unchaughtException)之外,不建议做很多事情。系统可能处于不稳定状态(例如,模块的内部状态可能不一致),您不希望这样长时间运行。

    要么按照 Amadan 所说的去做,要么使用 node.js 域,或者使用负载均衡器后面的多个进程(这基本上是 Amadan 所说的)。

    【讨论】:

      猜你喜欢
      • 2015-11-07
      • 1970-01-01
      • 2023-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-26
      • 1970-01-01
      相关资源
      最近更新 更多