pm2
本文内容来自
PM2是 node 进程管理工具,可以利用它来简化很多node应用管理的繁琐任务。
pm2 优势
相比于直接使用 node 运行项目,pm2 拥有如下优势:
- 后台运行(关掉cmd窗口依然运行)
- 进程守护 (停止不稳定的进程,避免无限循环)
- 内建负载均衡
- 拥有日志管理
- 错误重启、定时重启等
PM2 使用
安装
sh
npm install -g pm2
启动
sh
pm2 start app.js
参数说明
- --watch:监听应用目录的变化,一旦发生变化,自动重启。如果要精确监听、不见听的目录,最好通过配置文件。
- -i --instances:启用多少个实例,可用于负载均衡。如果-i 0或者-i max,则根据当前机器核数确定实例数目。
- --ignore-watch:排除监听的目录/文件,可以是特定的文件名,也可以是正则。比如--ignore-watch="test node_modules "
- -n --name:指定应用的名称。查看应用信息的时候可以用到。
- -o --output path:标准输出日志文件的路径。
- -e --error path:错误输出日志文件的路径。
- --interpreter interpreter:the interpreter pm2 should use for executing app (bash, python...)。比如你用的coffee script来编写应用。
- -x:用fork模式启动app.js,而不是cluster模式
TIP
fork模式:单实例多进程,常用于多语言混编,比如php、python等,不支持端口复用,需要自己做应用的端口分配和负载均衡的子进程业务代码。
- 缺点:就是单服务器实例容易由于异常会导致服务器实例崩溃。
cluster模式:多实例多进程,但是只支持node,端口可以复用,不需要额外的端口配置,0代码实现负载均衡。
- 优点:就是由于多实例机制,可以保证服务器的容错性,就算出现异常也不会使多个服务器实例同时崩溃。
例子
* pm2 start app.js --watch:实时监控的方式启动,app.js文件有变动时,pm2会自动reload(重启)
* pm2 start app.js -i max:根据有效CPU数目启动最大进程数目
* pm2 start app.js -i 3:启动3个进程
* pm2 start app.js --ignore-watch="test node_modules":排除监听的目录/文件
* pm2 start app.js --name mynode:启动一个进程并把它命名为mynode
* pm2 start app.json:启动进程, 可以在 app.json里设置选项
* pm2 start app.js -i max - -z 10:在 – 之后给 app.js 传递参数(-z 10)
pm2 相关指令
查看与监视进程
显示所有进程信息
sh
pm2 list
查看指定 id 进程的详细信息
sh
pm2 show id
pm2 info id
重载、重启
重启指定 id 进程
sh
pm2 restart id
重启全部
sh
pm2 restart all
重载指定 id 进程
sh
pm2 reload id
重载全部
sh
pm2 reload all
停止、删除进程
停止/删除指定 id 进程
sh
pm2 stop/delete id
停止/删除所有进程
sh
pm2 stop/delete all
日志
显示所有进程的日志
sh
pm2 logs
显示指定 id 进程的日志
sh
pm2 logs id
清空所有日志文件
sh
pm2 flush
重载所有日志
sh
pm2 reloadLogs
产生 init 脚本,保持进程活着
sh
pm2 startup
杀进程
杀死pm2进程
sh
pm2 kill
开机自动启动
- 通过pm2 save保存当前进程状态。
- 通过pm2 startup [platform]生成开机自启动的命令。例如:pm2 startup centeros
- 将步骤2生成的命令,粘贴到控制台进行,搞定。
pm2 配置文件启动
上面指令运行 pm2 时,若是存在较多的参数,指令就会变的非常冗长。这时就需要使用配置文件来启动。例如:
json
// app.json
{
"apps": [
{
"name": "serverName", // 名称
"script": "./index.js", // 入口文件
"env": { // 环境
"NODE_ENV": "development"
},
"env_production": {
"NODE_ENV": "production"
},
"instances": 4, // 启用多少个实例
"exec_mode": "cluster", // 应用程序启动模式,这里设置的是cluster_mode(集群),默认是fork
"max_restarts" : 3, // 设置应用程序异常退出重启的次数,默认15次(从0开始计数)
"restart_delay" : 5000, // 异常重启情况下,延时重启时间
"log_date_format" : "YYYY-MM-DD HH:mm Z",
"combine_logs" : true,
"log_file": "<yourpath>/combined.outerr.log", // 日志目录
"out_file": "<yourpath>/out.log",
"error_file": "<yourpath>/err.log",
}
]
}
然后直接运行配置文件即可:
sh
pm2 start app.json
其中 apps 是数组,也就是说明可以同时配置多个 pm2 运行。
配置参数
- name: 应用程序名称
- args: 脚本的参数域
- cwd: 应用程序所在的目录
- script: 应用程序的脚本路径
- log_date_format:
- node_args: node 的参数域
- error_file: 自定义应用程序的错误日志文件
- out_file: 自定义应用程序日志文件
- pid_file: 自定义应用程序的pid文件
- instances:
- min_uptime:最小运行时间,这里设置的是60s即如果应用程序在60s内退出,pm2会认为程序异常退出,此时触发重启max_restarts设置数量
- max_restarts:设置应用程序异常退出重启的次数,默认15次(从0开始计数)
- cron_restart:定时启动,解决重启能解决的问题
- watch:是否启用监控模式,默认是false。如果设置成true,当应用程序变动时, pm2会自动重载。这里也可以设置你要监控的文件。
- merge_logs:
- exec_interpreter:应用程序的脚本类型,这里使用的shell,默认是nodejs
- exec_mode:应用程序启动模式,这里设置的是cluster_mode(集群),默认是fork
- autorestart:启用/禁用应用程序崩溃或退出时自动重启
- vizion:启用/禁用vizion特性(版本控制)