PM2不适用于NodeJS(Heroku)

时间:2018-02-22 20:08:38

标签: node.js express heroku pm2

我正在使用PM2让NodeJS(Express)连续运行。在我的本地计算机上,以下内容适用于我的packages.json:

"scripts": {
    "start": "pm2 start ./bin/www"
}

之后,我使用'npm start'来运行我的应用程序。一切正常。

现在我想将我的应用程序部署到Heroku。我添加了一个带有'web:npm start'的Procfile。之后我将packages.json改为:

"scripts": {
    "preinstall": "npm install pm2 -g",
    "start": "pm2 start ./bin/www"
 }

然而,我收到此错误:

2018-02-22T19:51:23.861641+00:00 heroku[web.1]: Error R10 (Boot timeout) -> Web process failed to bind to $PORT within 60 seconds of launch
2018-02-22T19:51:23.862201+00:00 heroku[web.1]: Stopping process with SIGKILL
2018-02-22T19:51:24.007776+00:00 heroku[web.1]: Process exited with status 137
2018-02-22T19:51:24.046849+00:00 heroku[web.1]: State changed from starting to crashed

我已经找到了许多方法来解决这个问题,例如将我的Procfile更改为'worker:node app.js'并运行命令:'$ heroku scale web = 0 worker = 1'。

但我无法找出问题所在。我认为它与'pm2'模块有关,因为当我不使用它时,我的应用程序运行正常。然而,经过一段时间后,它会崩溃。希望有人可以帮助我。

“pm2 show www”显示了这一点:

│ status            │ online                                                       │
│ name              │ www                                                          │
│ restarts          │ 151                                                          │
│ uptime            │ 40s                                                          │
│ script path       │ /Users/user1/Documents/Weview/app/bin/www │
│ script args       │ N/A                                                          │
│ error log path    │ /Users/user1/.pm2/logs/www-error-1.log    │
│ out log path      │ /Users/user1/.pm2/logs/www-out-1.log      │
│ pid path          │ /Users/user1/.pm2/pids/www-1.pid          │
│ interpreter       │ node                                                         │
│ interpreter args  │ N/A                                                          │
│ script id         │ 1                                                            │
│ exec cwd          │ /Users/user1/Documents/Weview/app         │
│ exec mode         │ fork_mode                                                    │
│ node.js version   │ 8.9.1                                                        │
│ watch & reload    │ ✘                                                            │
│ unstable restarts │ 0                                                            │
│ created at        │ 2018-02-22T20:22:53.688Z                                     │
└───────────────────┴──────────────────────────────────────────────────────────────┘
 Code metrics value 
┌─────────────────┬────────┐
│ Loop delay      │ 2.86ms │
│ Active requests │ 0      │
│ Active handles  │ 4  

3 个答案:

答案 0 :(得分:0)

使用此

"scripts": {
    "start": "PORT=3000 pm2 start ./bin/www"
}

Heroku尝试使用env变量PORT

绑定节点应用程序

答案 1 :(得分:0)

tl; dr你不能使用fork

我通过使用“实例”来使用一个dyno:1和“exec_mode”:“cluster”。似乎当使用带有一个dyno的fork时,您无法重用端口,因为您只有一个端口并且在单个线程上运行您的应用程序,因此由于EADDRINUSE,分叉将失败。查看此stackoverflow问题,以全面讨论群集和分叉:Cluster and Fork mode difference in PM2

答案 2 :(得分:0)

首先,您必须安装pm2。 我读了这些docs

点击您的package.json

“脚本”:{     “ preinstall”:“ npm install pm2 -g”,     “ start”:“ pm2-runtime app.js -i max”    }