1. PM2 是什么?
PM2 = Process Manager 2
ADVANCED, PRODUCTION PROCESS MANAGER FOR NODE.JS
PM2 is a daemon process manager that will help you manage and keep your application online 24/7
上面是官网给出的 title,简单来说:它是在后台运行的 Node.js
进程管理器,提供一套针对生产环境运行时的工具集,可以保障你的程序 7 * 24 小时在线。
官网:https://pm2.keymetrics.io
文档:https://pm2.keymetrics.io/docs/usage/quick-start
总结其主要特性如下:
- 日志管理:应用程序日志保存在服务器的硬盘中
~/.pm2/logs/
- 负载均衡:使用
Node cluster
集群模块,可以通过创建共享同一服务器端口的多个子进程来扩展您的应用程序。这样做还允许您以零秒停机时间重新启动应用程序,实现热重载。
- 终端监控:可以在终端中监控您的应用程序运行状况,包括CPU使用率,使用的内存,请求/分钟等。
- 自动停止不稳定的进程(避免无限循环)
- 支持静态服务器功能
- 提供
HTTP API
2. 安装
1 2 3 4
| $ npm install pm2 -g
$ yarn global add pm2
|
可以使用工具 nvm
安装管理 Node.js
和 npm
,参见我的另一篇文章:借助 nvm 安装、管理多个 NodeJS 版本
检查是否安装成功:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| $ pm2 --version
-------------
__/\\\\\\\\\\\\\____/\\\\____________/\\\\____/\\\\\\\\\_____ _\/\\\/////////\\\_\/\\\\\\________/\\\\\\__/\\\///////\\\___ _\/\\\_______\/\\\_\/\\\//\\\____/\\\//\\\_\///______\//\\\__ _\/\\\\\\\\\\\\\/__\/\\\\///\\\/\\\/_\/\\\___________/\\\/___ _\/\\\/////////____\/\\\__\///\\\/___\/\\\________/\\\//_____ _\/\\\_____________\/\\\____\///_____\/\\\_____/\\\//________ _\/\\\_____________\/\\\_____________\/\\\___/\\\/___________ _\/\\\_____________\/\\\_____________\/\\\__/\\\\\\\\\\\\\\\_ _\///______________\///______________\///__\///////////////__
Runtime Edition
PM2 is a Production Process Manager for Node.js applications with a built-in Load Balancer.
Start and Daemonize any application: $ pm2 start app.js
Load Balance 4 instances of api.js: $ pm2 start api.js -i 4
Monitor in production: $ pm2 monitor
Make pm2 auto-boot at server restart: $ pm2 startup
To go further checkout: http://pm2.io/
-------------
[PM2] Spawning PM2 daemon with pm2_home=/Users/sunqiang/.pm2 [PM2] PM2 Successfully daemonized 4.4.0
|
3. 基本使用
3.1. 启动
1 2 3 4 5 6 7 8 9 10 11 12
| $ pm2 start app.js [PM2] Starting /Users/sunqiang/mydev/NodeProjects/demo/demo-koa2/app.js in fork_mode (1 instance) [PM2] Done. ┌─────┬────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬──────────┬──────────┐ │ id │ name │ namespace │ version │ mode │ pid │ uptime │ ↺ │ status │ cpu │ mem │ user │ watching │ ├─────┼────────┼─────────────┼─────────┼─────────┼──────────┼────────┼──────┼───────────┼──────────┼──────────┼──────────┼──────────┤ │ 0 │ app │ default │ 0.1.0 │ fork │ 28381 │ 0s │ 0 │ online │ 0% │ 11.9mb │ sunqiang │ disabled │ └─────┴────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────┴──────────┴──────────┘
$ pm2 start app.js --name demo
|
其它可用选项:
--watch
以监听模式启动,当文件发生变化时自动重启
--max-memory-restart <200MB>
设置应用重载占用的最大内存
--log <log_path>
指定日志文件
-- arg1 arg2 arg3
给启动脚本传递额外的参数
--restart-delay <delay in ms>
延时 x 毫秒自动重启
--time
日志里添加时间前缀
--no-autorestart
不自动重启
--cron <cron_pattern>
按指定的定时任务规则强制重启
--no-daemon
以非守护进程模式启动
3.2. 查看
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
|
$ pm2 list
$ pm2 logs $ pm2 logs www $ pm2 logs --lines 10 $ pm2 logs --timestamp $ pm2 logs www --lines 10 --err $ pm2 flush
$ pm2 show app_name|app_id
$ pm2 monit
$ pm2 monitor
|
3.3. 管理应用状态
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
$ pm2 restart app_id|app_name|all
$ pm2 reload app_id|app_name|all
$ pm2 stop app_id|app_name|all
$ pm2 delete app_id|app_name|all
$ pm2 kill
|
3.4. 静态服务器
1 2
| $ pm2 serve ./dist 3333
|
3.5. 集群模式(自动负载均衡)
1 2 3
|
pm2 start app.js -i max
|
3.6. 开机自启动
1 2
| $ pm2 startup $ pm2 unstartup
|
3.7. 应用列表
1 2 3 4 5 6 7 8
| $ pm2 save
$ pm2 resurrect
$ pm2 cleardump
|
4. 配置文件
生成示例配置文件
示例配置如下(根据实际项目需要添加、删除配置项)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| module.exports = { apps : [{ name : 'demo', script : 'app.js', env: { PM2_SERVE_PATH: ".", PM2_SERVE_PORT: 8080, NODE_ENV: 'development' }, env_production : { NODE_ENV: 'production' }, instances: "max", watch: true, output: './out.log', error: './error.log', merge_logs: true, log_type: "json", log_date_format: "DD-MM-YYYY", }], deploy : { production : { user : 'SSH_USERNAME', host : 'SSH_HOSTMACHINE', ref : 'origin/master', repo : 'GIT_REPOSITORY', path : 'DESTINATION_PATH', 'pre-deploy-local': '', 'post-deploy' : 'npm install && pm2 reload ecosystem.config.js --env production', 'pre-setup': '' } } }
|
以配置文件启动示例
1
| $ pm2 start ecosystem.config.js --env production
|
⚠️ 注意:配置文件支持 js 和 yaml 格式,还有一些没有列举的参数项,详见官方文档:https://pm2.keymetrics.io/docs/usage/application-declaration
5. 其他
5.1. 升级 PM2
1 2 3 4 5 6 7 8 9 10 11
| $ pm2 save
$ npm install pm2 -g
$ pm2 update
$ pm2 resurrect
|
5.2. 日志切割
安装 pm2-logrotate-ext
扩展模块
项目地址:https://github.com/Lujo5/pm2-logrotate-ext
1
| $ pm2 install pm2-logrotate-ext
|
重新启动应用后,pm2-logrotate-ext
以模块的形式被加载、启动。
可以通过以下命令对其配置进行修改:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| $ pm2 set pm2-logrotate-ext:max_size 1M
$ pm2 set pm2-logrotate-ext:retain 30
$ pm2 set pm2-logrotate-ext:compress false
$ pm2 set pm2-logrotate-ext:dateFormat YYYY-MM-DD_HH-mm-ss
$ pm2 set pm2-logrotate-ext:workerInterval 30
$ pm2 set pm2-logrotate-ext:rotateInterval 0 0 * * *
$ pm2 set pm2-logrotate-ext:rotateModule true
$ pm2 set pm2-logrotate-ext:forced true
|