保持节点应用程序在azure app service

时间:2016-10-16 18:40:45

标签: node.js azure azure-web-sites iisnode

我已经在azure的app服务上部署了一个节点js web应用程序。问题是我的申请偶尔会因为不明原因而被杀。我已经使用kudu对所有日志罚款进行了详尽的搜索。

如果我重新启动应用服务,应用程序就会开始工作。

有没有办法可以在崩溃后重新启动我的节点应用程序。无论如何都要永远奔跑。例如,如果在IIS中部署的asp.net代码中发生任何错误,IIS永远不会崩溃,它会继续提供其他传入请求。

在天蓝色应用服务中使用永远/ pm2之类的东西。

2 个答案:

答案 0 :(得分:9)

Azure App Services中的node.js由IISNode提供支持,它负责处理您描述的所有内容,包括监视您的进程是否失败并重新启动它。

考虑以下POC:

var http = require('http');    
http.createServer(function (req, res) {
    if (req.url == '/bad') {
        throw 'bad';
    }
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end('bye');
}).listen(process.env.PORT || 1337);

如果我在Web应用程序中托管它并发出以下请求序列:

  1. GET /
  2. GET / bad
  3. GET /
  4. 然后第一个将产生HTTP 200,第二个将抛出服务器并产生HTTP 500,第三个将产生HTTP 200而不必我做任何事情。 IISNode将只检测崩溃并重新启动该进程。

    因此,您不需要PM2或类似的解决方案,因为它内置于App Services中。但是,如果您真的想要,他们现在在Linux上有App Services Preview ,它由PM2提供支持并允许您配置PM2。有关此问题的更多信息here。但是你又一次开箱即用。

    另一件需要考虑的事情是Always On setting,默认情况下处于启用状态:

      

    默认情况下,如果Web应用程序闲置一段时间,则会将其卸载。这使系统可以节省资源。在“基本”或“标准”模式下,您可以启用“始终开启”以始终加载应用程序。如果您的应用运行连续的Web作业,则应启用Always On,否则Web作业可能无法可靠运行。

    这是您的问题的另一个可能的根本原因,解决方案是为您的Web应用程序禁用Always On(请参阅上面的链接)。

答案 1 :(得分:0)

我真的要感谢 itaysk 对此问题的支持。

问题不是我怀疑的。实际上节点服务器正在重新启动失败。

有一个不同的问题。为什么我的网站没有响应是出于不同的原因。以下是发生的事情 -

我们使用rethinkdbdash连接到rethinkdb数据库,我们使用的是连接池。存在编码/设计问题。我们有大约15个更改源与socket.io一起实现。并且每个登录的用户都会对更改源进行初始化。这会增加池中活动连接的数量。并且rethinkdbdash在池中具有默认限制1000连接,并且由于存在大量实时连接,因此池中的所有可用连接都已耗尽,从而导致无法连接。因此,请求正在等待打开的连接,并且它没有获得任何可用,因此等待阻止任何新请求被提供。