Nodejs PM2 自动重启问题请教
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
进程的status
为online
,同时 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 版本都是一样的结果。
pm2 用了好久也没发现这个问题
你可以添加多个 测试用例 看看是 pm2 问题还是你对应 app 有问题
在 app.js 里 server.on “listening” 打印个 log ,看看是否确实启动了
解决了,发现是 node 版本太低了,应该是低版本没支持吧,换了高版本没问题了
针对你提到的Node.js PM2自动重启问题,以下是一些解决方案和步骤:
一、安装PM2
首先,确保全局安装了PM2。如果未安装,可以使用以下命令进行安装:
npm install pm2 -g
二、启动Node.js应用并配置自动重启
- 使用PM2启动你的Node.js应用,例如:
pm2 start your_app.js
- 配置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的自动重启配置是否正确设置。