Nodejs PM2 自动重启问题请教

发布于 1周前 作者 nodeper 来自 nodejs/Nestjs

Nodejs PM2 自动重启问题请教

cluster模式启动 node 进程,配置文件如下

{
  "apps" : [{    
               "name"        	   : "web",
                "script"      	   : "./GServer/WebServer/app.js",
                "merge_logs"  	   : true,    
                "log_date_format"  : "YYYY-MM-DD HH:mm Z",
		"error_file"       : "/home/ubuntu/.pm2/logs/web-err.log",
		"out_file"         : "/home/ubuntu/.pm2/logs/web.log",
		"max_restarts"     : 15,
		"max_memory_restart": "1000M", 	
		"exec_mode"        : "cluster",
		"autorestart"      : true
  }]
}

当执行pm2 restart web或 watch 导致进程 restart 之后,pm2 list命令查看类别的时候,web进程的statusonline,同时 restart 次数也+1 了,但是这时候程序无法访问,包括在本机上直接curl 127.0.0.1:1337也无法访问( 1337 为我 node 监听的 port ).

下面是日志:

刚启动 node 进程的时候:

pm2 list命令:

┌──────────┬────┬─────────┬───────┬────────┬─────────┬────────┬─────┬───────────┬──────────┐
│ App name │ id │ mode    │ pid   │ status │ restart │ uptime │ cpu │ mem       │ watching │
├──────────┼────┼─────────┼───────┼────────┼─────────┼────────┼─────┼───────────┼──────────┤
│ web  │ 0  │ cluster │ 30986 │ online │ 0       │ 1s    │ 0%  │ 81.7 MB   │ disabled │
└──────────┴────┴─────────┴───────┴────────┴─────────┴────────┴─────┴───────────┴──────────┘

web.log文件:

2017-03-20 20:26 +09:00: [2017-03-20 20:26:01.921] [INFO] logger -  [ DotaServer <-> appDota.js ] : version = 0.3.8.2017320 , port = 1337
2017-03-20 20:26 +09:00: [2017-03-20 20:26:01.924] [INFO] console - [info]-- [ DotaServer <-> appDota.js ] : version = 0.3.8.2017320 , port = 1337

web-error.log文件:无内容

pm2.log文件:

2017-03-20 20:25:58: [Watch] Start watching 0
2017-03-20 20:25:58: Starting execution sequence in -cluster mode- for app name:web id:0

接下来为了方便观察,我把所有日志都清空,然后执行pm2 restart web,让进程重启一次。

pm2 list命令:

┌──────────┬────┬─────────┬───────┬────────┬─────────┬────────┬─────┬───────────┬──────────┐
│ App name │ id │ mode    │ pid   │ status │ restart │ uptime │ cpu │ mem       │ watching │
├──────────┼────┼─────────┼───────┼────────┼─────────┼────────┼─────┼───────────┼──────────┤
│ web  │ 0  │ cluster │ 30986 │ online │ 1       │ 1m    │ 0%  │ 81.7 MB   │ disabled │
└──────────┴────┴─────────┴───────┴────────┴─────────┴────────┴─────┴───────────┴──────────┘

虽然状态是online,但实际上 node 程序却不能访问

web.log文件:

2017-03-20 20:31 +09:00: [2017-03-20 20:31:40.636] [INFO] logger -  [ DotaServer <-> appDota.js ] : version = 0.3.8.2017320 , port = 1337
2017-03-20 20:31 +09:00: [2017-03-20 20:31:40.638] [INFO] console - [info]-- [ DotaServer <-> appDota.js ] : version = 0.3.8.2017320 , port = 1337

web-error.log文件:无内容

pm2.log文件:

2017-03-20 20:31:39: Stopping app:gs id:0
2017-03-20 20:31:39: App name:gs id:0 disconnected
2017-03-20 20:31:39: App [gs] with id [0] and pid [30986], exited with code [130] via signal [SIGINT]
2017-03-20 20:31:39: pid=26821 msg=process killed
2017-03-20 20:31:39: Starting execution sequence in -cluster mode- for app name:gs id:0
2017-03-20 20:31:39: App name:gs id:0 online

另外我如果用fork模式启动则完全没这个问题, restart 之后程序都能正常访问。主要是fork模式错误日志会计入 web.log 文件而不是 web-error.log 文件,这样非常不方便调试,所以我想用cluster模式。 另外我试过了 pm2 的 1.x 版本和 2.4.x 版本都是一样的结果。


4 回复

pm2 用了好久也没发现这个问题
你可以添加多个 测试用例 看看是 pm2 问题还是你对应 app 有问题


在 app.js 里 server.on “listening” 打印个 log ,看看是否确实启动了



解决了,发现是 node 版本太低了,应该是低版本没支持吧,换了高版本没问题了

针对你提到的Node.js PM2自动重启问题,以下是一些解决方案和步骤:

一、安装PM2

首先,确保全局安装了PM2。如果未安装,可以使用以下命令进行安装:

npm install pm2 -g

二、启动Node.js应用并配置自动重启

  1. 使用PM2启动你的Node.js应用,例如:
pm2 start your_app.js
  1. 配置PM2在应用程序崩溃或停止响应时自动重启。你可以通过以下命令来设置:
pm2 startup
pm2 save

这将生成一个适用于你的系统的启动脚本,并保存当前运行的进程列表。

三、高级配置

如果需要更高级的配置,可以创建一个配置文件(如ecosystem.config.js或JSON格式的配置文件),并在其中指定各种参数,如内存限制、进程数量、日志路径等。例如:

{
  "apps": [
    {
      "name": "your_app_name",
      "script": "your_app.js",
      "max_memory_restart": "200M",
      "instances": "max",
      "exec_mode": "cluster",
      "env": {
        "NODE_ENV": "production"
      },
      "env_production": {
        "NODE_ENV": "production"
      },
      "log_date_format": "YYYY-MM-DD HH:mm:ss"
    }
  ]
}

然后使用pm2 start ecosystem.config.js来启动应用。

四、验证配置

最后,使用pm2 show your_app_name来验证PM2的自动重启配置是否正确设置。

回到顶部