保持节点应用程序在Azure应用程序服务上运行

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

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

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

在azure app服务中使用ever / pm2之类的东西 .

回答(2)

3 years ago

Azure应用服务中的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应用程序中托管它并发出以下请求序列:

  • GET /

  • GET /坏

  • GET /

然后第一个将产生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(请参阅上面的链接) .

3 years ago

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

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

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

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