pm2简单介绍

非常简洁的一个使用记录,没有去做深究.先挖个坑.

介绍

pm2forever一样,都可以作为nodejs的守护程序,当然不仅仅是nodejs.但相对比来说pm2的配置和图形化以及插件都做的不错.

pm2 list:


pm2的控制台,这部分花钱才能使用大部分功能.

安装

1
知识兔td>
npm install -g pm2
知识兔td>

pm2使用

1
2
3
4
5
知识兔td>
cd static
pm2 start app.js --name "static" -e ~/logs/static_err.log -o logs/static_out.log --log-date-format "YYYY-MM-DD HH:mm Z"
cd api
pm2 start app.js --name "api" --log-date-format "YYYY-MM-DD HH:mm Z" -e logs/api_err.log -o ~/logs/api_out.log
知识兔td>

配置文件的使用

上面那样写,太麻烦,可以使用配置方式 pm2 start pm2.json

1
2
3
4
5
6
7
8
9
10
11
12
13
知识兔td>
{
"apps":[{
"name":"test_api",
"cwd":"/root/code/test-api",
"args":"--port=1550",
"env":{
"NODE_ENV":"test"
},
"script":"app.js",
"error_file": "/root/code/logs/test_api_err.log",
"out_file": "/root/code/logs/test_api_out.log"
}]
}
知识兔td>

提示

  1. 没有相互依赖关系的程序要单独自己一个配置,因为reload的时候,会造成所有程序重新加载.
    比如,上面的staticapi是有关联的,他们应该放在一个配置文件中.op是一个独立的业务,那就应该自己建立一个独立的配置文件.实际中,也是每个独立应用都有自己的配置文件
  2. pm2 中的配置,只能修改,不能删除,可能使用的extend的方式

比如: 一开始我设置了DEBUG=remind 然后删除这个配置,再reload,debug依然为remind,所以只好修改为debug=- 这样就不会污染log了

  1. 注意一下环境变量参数的使用方式

只启动某个app

1
2
3
4
知识兔td>
$ pm2 start ecosystem.config.js --only api-app
$ pm2 restart ecosystem.config.js --only api-app
$ pm2 reload ecosystem.config.js --only api-app
$ pm2 delete ecosystem.config.js --only api-app
知识兔td>

使用pm2-logrotate

当正式上线后,日志文件会变得慢慢庞大.通过pm2-logrotate,可以对日志文件进行归档.

安装

1
知识兔td>
pm2 install pm2-logrotate
知识兔td>

配置

可以进行自定义配置,参数请查看github

1
2
3
知识兔td>
pm2 set pm2-logrotate:dateFormat YYYY-MM-DD_HH-mm-ss
pm2 set pm2-logrotate:max_size 1M
pm2 set pm2-logrotate:workerInterval 1800
知识兔td>

结果如下:

1
2
3
4
5
6
7
8
9
知识兔td>
[PM2] Module pm2-logrotate restarted
== pm2-logrotate ==
┌────────────────┬─────────────────────┐
│ key │ value │
├────────────────┼─────────────────────┤
│ dateFormat │ YYYY-MM-DD_HH-mm-ss │
│ max_size │ 1M │
│ workerInterval │ 1800 │
└────────────────┴─────────────────────┘
知识兔td>

重启服务

重启服务命令为pm2 restart XXX.但是这样会终端nodejs程序,导致服务终端,在程序重新启动之前就无法处理请求了.

幸好,pm2提供了信号传递.pm2 sendSignal SIGUSR2 XXX,程序对信号进行处理.比如程序先fork一个子进程提供服务,然后在将子进程重启,从而达到了热更新.当然这需要程序进行一下简单的处理. 具体查看官方文档

原文:大专栏  pm2简单介绍


计算机