前提:最近开发用到pm2来管理node进程,因为策划要经常修改配置表,于是我就用pm2 watch 了对应的策划对应的配置文件目录,这样一来当策划修改了配置表之后进程就自动重启。很好,这就是我想要的结果。
但是现在问题来了,pm2有2种模式:fork
和cluster
1.fork
模式启动node进程:当策划修改配置表之后,能正常自动重启,而且重启之后node程序也能正常访问,唯一不足的就是如果我的程序里出现的uncaught error
的时候,pm2会把错误日志写入app-out.log文件里而不是app-error.log文件里,这样就会导致当某一天我上来看到进程重启了,我不知道是策划修改配置表导致的,还是我程序里的uncaught error
导致的;
2.cluster
模式启动node进程:当程序里出现uncaught error
的时候,pm2会把错误日志写入app-error.log文件,这样当我发现程序有重启的时候我只用看error.log里是否有日志就知道了。但是cluster
有个问题就是它把node进程restart之后虽然pm2 list命令里看到的status是online但实际node进程是无法访问的。
我试过在cluster
模式下手动执行pm2 restart app
命令之后也是同样的效果。
试过几个pm2 版本从1.x到2.4.x都是这样。
我知道pm2的cluster
模式是可以多启动几个进程以充分利用cpu,但是它restart之后进程并不能访问,那它restart的意义在哪呢?
请教各位前辈!
启动集群式pm2 start app? 然后restart app就不行了?
@leiwei1991 对,restart命令执行之后,pm2 list查看对应的app status是online,同时restart次数也+1了,但是实际上这个被restart了的进程是不能访问的
app里配置列出来看下。你只启动了一个实例?
@leiwei1991 对,我只启动了一个实例。 我就用 pm2 start app.js -i 1
这样启动的,然后执行 pm2 restart app
,再pm2 list
看app对应的status是online,restart次数=1,但是这是这个进程就是不能访问
感觉有点问题 restart的话试下 pm2 restart app -i 1 或者 pm2 restart id(pm2 ls 里面的那个)。
@leiwei1991 restart id 试过了,一样的问题。 实际开发测试过程中,我如果用cluster启动一个进程,restart不是手动的啊,是watch或者uncaught error的时候重启的,所以就算 pm2 restart app -i 1 命令可行,也不可能执行这个命令啊。
配置一个a.json文件 pm2 start a.json即可. { “apps” : [{ “script” : “api.js”, “instances” : 0, “exec_mode” : “cluster” }] }
教程:http://pm2.keymetrics.io/docs/usage/cluster-mode/ @imhered
@leiwei1991 @DuanPengfei 我的配置文件是这样的
{
"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
}]
}
通过这个配置文件启动之后,不管是程序uncaught error
导致restart或者watch restart的,pm2 list里看到的status 是online,restart次数也+1了,但是网站就是访问不了。。。
命令行指定参数与配置文件方式在本地我都尝试了,没有出现你所说的问题,PM2 版本 2.4.2,还是需要看看 PM2 的 log 而不仅仅是配置文件,这样的情况不是常规问题,基本只能依赖日志。
@DuanPengfei 我node进程监听的是1337端口,首先我正常启动,然后直接在服务器上curl 127..0.0.1:1337
没问题,能正常访问。但是当我执行pm2 restart app
命令,或者是watch导致restart之后,再curl 127.0.0.1:1337
就一直访问不了了,日志里也没有任何记录。 我应该怎么查呢?
@imhered 你说这么多都没有用,解决不了问题,把日志贴出来看看,pm2 logs ${name 或 id}
,如果这里看不出来,打开 ~/.pm2/pm2.log
看看
@DuanPengfei 这是启动web的时候对应name下的log(gs.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
这是pm2.log里的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
(web是我start.json里的name)
gs.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
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 [26821], 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
exited with code [130] via signal [SIGINT]
是不是得从这句入手?
@imhered 看日志只看出了 App [gs] with id [0] and pid [26821], exited with code [130] via signal [SIGINT]
退出 code 是 130,Exit code 130: The job ran out of CPU or swap time. If swap time is the culprit, check for memory leaks.
,具体为什么会出现这个原因得你自己好好查看一下了,还有就是配置文件中貌似少写了 watch: true
,我尝试时填上了这个参数,可能跟你的配置有些区别了。
@DuanPengfei 非常感谢你的回答。 文中我用来测试,所以就没启用watch。 你的这个code对应的错误是在哪看的? pm2官网上吗?
@imhered 这个是 Linux exit code,网上搜到的,感觉也不一定准确,很多资料中给出的解释略有不同,你可以多搜索了解一下。Exit Codes With Special Meanings
@DuanPengfei The job ran out of CPU
看这句 我大概知道原因了。 我一个服务器上还跑了别的几个项目,总共加起来的进程数量已经超过了CPU数量。我尝试把别的进程关掉试试。
@DuanPengfei 刚才在一台2CPU,4内存的服务器上试了下,就只开了一个node进程。还是同样的表现,日志和上面的也一模一样。 =.= 不知道怎么查了
@imhered 如果按照我的思路会先启动一个 Express.js 或者 Koa.js 之类的 demo,然后观察结果,如果没问题就说明是自己代码导致的,再慢慢查代码,如果同样有问题就应该是 PM2 的问题了,尝试删除 PM2 再安装最新版本,还是不能解决问题,就带上自己的机器参数去提 issue 吧 😂
@DuanPengfei 好的,谢谢。也许是代码问题,先弄个最简答的demo试试。 因为我试了 4,5台机器 都是一样的效果😂
不要在windows下用cluster模式,在linux下一切是正常的