非常简洁的一个使用记录,没有去做深究.先挖个坑.
介绍
pm2
和forever
一样,都可以作为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> |
提示
- 没有相互依赖关系的程序要单独自己一个配置,因为reload的时候,会造成所有程序重新加载.
比如,上面的static
和api
是有关联的,他们应该放在一个配置文件中.op
是一个独立的业务,那就应该自己建立一个独立的配置文件.实际中,也是每个独立应用都有自己的配置文件 - pm2 中的配置,只能修改,不能删除,可能使用的extend的方式
比如: 一开始我设置了DEBUG=remind
然后删除这个配置,再reload
,debug
依然为remind
,所以只好修改为debug=-
这样就不会污染log了
- 注意一下
环境变量
和参数
的使用方式
只启动某个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,可以对日志文件进行归档.
安装
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简单介绍