【发布时间】:2015-07-22 22:53:16
【问题描述】:
我编写了两个简单的 Node.js 应用程序,每个应用程序都在一个端口(1337 和 1338)上运行一个服务器,并使用 PM2(和 Keymetrics)来保持它们的活力,但每隔几天就会全部三个 Node.js应用程序(包括 PM2)同时崩溃。我对 Node.js 还很陌生,不知道如何调查问题的根源。
详情:
两个服务器响应传入的 GET 请求。一种是响应 Bitbucket 触发器自动执行 GIT 获取/拉取,另一种将 URL 转换为 PDF 并将 PDF 发送回浏览器(使用 wkhtmltopdf)。它们在运行时都能正常工作。
我正在运行 Node.js v0.12.4。
当三个应用程序出现故障时,我的第一个迹象是来自 OpenShift 上的 Uptime (https://github.com/fzaninotto/uptime) 实例,它通过电子邮件告诉我我的一个 Node.js 服务器已关闭,并返回 "connect ECONNREFUSED"。
几分钟后,Keymetrics 给我发电子邮件说"Agent is offline: Keymetrics Agent seems to be offline"。
换句话说,我的所有 node.js 内容似乎同时下降;这两个应用程序甚至 PM2 都没有运行。我以为 Node 会为每个应用程序生成一个进程,那么它们怎么会同时崩溃呢?
我的尝试:
我已尝试挖掘 ~/.pm2/pm2.log,但无法在其中找到任何有用的信息。也许我只是不知道该寻找什么。
$ pm2 resurrect 总是能让一切恢复生机。
【问题讨论】:
-
您确定 pm2 与节点应用程序一起出现故障吗? pm2与其管理的应用无关,不能随应用关闭,如果关闭,一定是环境有问题,而不是应用。
-
感谢您的意见! Keymetrics 电子邮件告诉我 PM2 服务器监视器正在关闭,但下次其他应用程序关闭时,我将在服务器上仔细检查。如果这是真的(即所有三个 node.js 应用程序都在一起下降)那么我认为你是对的——它一定是环境。我已经重新命名了这个问题。
-
您有可以测试的本地开发环境吗?为了好玩(但实际上:正确调试),在本地运行 pm2,使用您的两个应用程序,然后杀死 pm2,而不是您的应用程序。然后查看您的应用现在是否崩溃(例如,如果您忘记在 pm2 调用周围添加安全检查,那么可以肯定缺少 pm2 实例会使您的应用崩溃)
-
崩溃时的主机状态是什么?以内存/cpu 利用率为例,我之前经历过 PM2 崩溃
-
@sayume 我认为您对这种推理方式有所了解。所有节点应用程序(PM2 加上 2 个应用程序)肯定都在停止,要么同时停止,要么彼此非常接近。那么,什么样的环境问题会导致这样的事情呢?