【问题标题】:Unable to keep node.js server live with forever / pm2 / nohup无法让 node.js 服务器永远使用 / pm2 / nohup
【发布时间】:2019-01-21 11:09:16
【问题描述】:

我有一个 node.js 应用程序部署并运行在具有托管服务提供商的虚拟专用服务器上。

我已经安装了永久模块。当我通过ssh登录时,遍历到节点应用程序文件夹并运行

forever start app.js

应用程序启动并打印

warn:    --minUptime not set. Defaulting to: 1000ms
warn:    --spinSleepTime not set. Your script will exit if it does not stay up for at least 1000ms
info:    Forever processing file: app.js

但是,一旦我注销 ssh 或关闭终端并刷新我的 Web 应用程序页面,它就会给我 503 服务不可用错误。

首先我认为这可能是因为关于 minUptime 和 spinSleepTime 的两个警告导致服务器停止所以我这样做了

forever start --minUptime 1000 --spinSleepTime 1000 app.js

服务器运行,但从 ssh/终端退出时再次出现 503 错误。

我什至尝试过跑步

nohup node app.js &

但同样,服务器运行并在退出 ssh 时给出 503。

我安装了 pm2 并运行了

pm2 start app.js

但是完全一样的事情。

我的 package.json 看起来像这样:

{
  "name": "test-app",
  "version": "1.0.0",
  "description": "My Application",
  "main": "app.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "repository": {
    "type": "git",
    "url": "git+https://username@bitbucket.org/reponame/mytest-app.git"
  },
  "author": "First Last",
  "license": "ISC",
  "homepage": "https://bitbucket.org/reponame/mytest-app#readme",
  "dependencies": {
    "async": "^2.6.1",
    "bcrypt-nodejs": "0.0.3",
    "body-parser": "^1.18.3",
    "connect-multiparty": "^2.1.1",
    "cookie-parser": "^1.4.3",
    "express": "^4.16.3",
    "express-handlebars": "^3.0.0",
    "express-session": "^1.15.6",
    "multer": "^1.3.0",
    "mysql": "^2.15.0",
    "passport": "^0.4.0",
    "passport-local": "^1.0.0",
    "path": "^0.12.7",
    "shortid": "^2.2.8",
    "uuid": "^3.2.1",
    "winston": "^2.4.2"
  }
}

有人知道发生了什么吗?为什么当我退出终端时应用程序会停止?我是否需要在我的 package.json 中添加任何其他内容,例如启动脚本?

【问题讨论】:

  • 您是否尝试将脚本中的任何错误记录到日志文件中?我可以在您的依赖项上看到winston,所以我假设您正在这样做。你在永远的日志上看到了什么? forever logs 将返回一个日志列表,然后您可以执行forever logs 0 之类的操作来查看该日志。您是否尝试过打开与同一台服务器的第二个会话并从那里监控日志?您是否尝试过在不同的 VPS 上运行相同的脚本?
  • 一定要全局安装pm2。
  • 当我永远运行日志或日志 0 时,它说找不到永远进程:0。是的,我已经全局安装了 pm2

标签: node.js pm2 forever nohup


【解决方案1】:

假设这是在 Linux 上运行 - 创建一个如下所示的 shell 脚本 - 如果它正在运行,它将重新启动应用程序。 您可以更新脚本以仅启动应用程序。完成任何更改后,我使用此脚本重新启动我的应用程序。替换运行您的应用程序的端口号。 下面的脚本用于端口 3005,并通过 app.js 启动节点应用程序 更新您希望查看错误和输出日志的合适位置。

您也可以尝试派生一个运行应用程序而不是此脚本的进程,这样当您注销时该进程继续运行 - 这将不需要永久模块。

#!/bin/bash
PID1=`netstat -antp 2>/dev/null|grep ':::3005'|awk '{print $7}'`
PID=`echo $PID1| cut -f1 -d "/"`
echo "$PID"
if [[ "$PID" ]];
  then
  echo "Stopping App running on process ID $PID"
  forever stop "$PID"
  echo "App stopped"
else
  echo "App not running"
fi
echo 'starting'
forever -m5 -o "../../output.log" -e 
"../../error.log" start app.js
echo 'started'
exit

【讨论】:

    猜你喜欢
    • 2013-05-18
    • 2014-12-02
    • 2014-02-28
    • 1970-01-01
    • 2014-11-29
    • 1970-01-01
    • 1970-01-01
    • 2014-01-09
    • 1970-01-01
    相关资源
    最近更新 更多