用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 版本都是一样的结果。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.