pm2
基本信息
https://pm2.fenxianglu.cn/docs/start/
pm2 是基于nodejs开发的进程管理器,适用于后台常驻脚本管理,同时对node网络应用有自建负载均衡功能。官方的说法,pm2 是一个带有负载均衡功能的Node应用的进程管理器,个人认为,并不准确,因为pm2支持多种语言,只是对于除node之外的其他进程无负载均衡的能力。
安装
$ npm install -g pm2
pm2安装好后,会自动创建下面目录。
$HOME/.pm2 # will contain all PM2 related files
$HOME/.pm2/logs # will contain all applications logs
$HOME/.pm2/pids # will contain all applications pids
$HOME/.pm2/pm2.log # PM2 logs
$HOME/.pm2/pm2.pid # PM2 pid
$HOME/.pm2/rpc.sock # Socket file for remote commands
$HOME/.pm2/pub.sock # Socket file for publishable events
$HOME/.pm2/conf.js # PM2 Configuration
更新
$ pm2 save # 记得保存进程状态
$ npm install pm2 -g
$ pm2 update
常用命令
启动
参数说明
--watch:监听应用目录的变化,一旦发生变化,自动重启。如果要精确监听、不见听的目录,最好通过配置文件。
-i --instances:启用多少个实例,可用于负载均衡。如果-i 0或者-i max,则根据当前机器核数确定实例数目。
--ignore-watch:排除监听的目录/文件,可以是特定的文件名,也可以是正则。比如--ignore-watch="test node_modules "some scripts""
-n --name:应用的名称。查看应用信息的时候可以用到。
-o --output <path>:标准输出日志文件的路径。
-e --error <path>:错误输出日志文件的路径。
--interpreter <interpreter>:the interpreter pm2 should use for executing app (bash, python...)。比如你用的coffee script来编写应用。
$ pm2 start app.js --watch -i 2 # 加 --watch 自动重启
进程管理
$ pm2 start app.js -i 4 # 后台运行pm2,启动4个app.js
# 也可以把'max' 参数传递给 start
# 正确的进程数目依赖于Cpu的核心数目
$ pm2 start app.js --name my-api # 命名进程
$ pm2 restart app.js # 重启指定的进程名
$ pm2 restart 0 # 重启指定的进程
$ pm2 restart all # 重启所有进程
$ pm2 reload 0 # 重启指定的进程
$ pm2 reload all # 0 秒停机重载进程 (用于 NETWORKED 进程)
$ pm2 stop 0 # 停止指定的进程
$ pm2 stop all # 停止所有进程
$ pm2 delete 0 # 杀死指定的进程
$ pm2 delete all # 杀死全部进程
$ pm2 list # 显示所有进程状态
$ pm2 monit # 监视所有进程
$ pm2 logs # 显示所有进程日志
$ pm2 startup # 产生 init 脚本 保持进程活着
$ pm2 web # 运行健壮的 computer API endpoint (http://localhost:9615)
负载均衡
命令如下,表示开启三个进程。如果-i 0,则会根据机器当前核数自动开启尽可能多的进程。
$ pm2 start app.js -i 3 # 开启三个进程
$ pm2 start app.js -i max # 根据机器CPU核数,开启对应数目的进程
指令tab补全
$ pm2 completion install
$ source ~/.bash_profile
开机自动启动
可以通过pm2 startup来实现开机自启动。细节可参考。大致流程如下
- 通过
pm2 save保存当前进程状态。 通过pm2 startup [platform]生成开机自启动的命令。- 将步骤2生成的命令,粘贴到控制台进行。
传入node args
命令行
pm2 start app.js --node-args="--harmony"
配置文件
{
"name" : "oc-server",
"script" : "app.js",
"node_args" : "--harmony"
}
内存使用超过上限自动重启
如果想要你的应用,在超过使用内存上限后自动重启,那么可以加上 --max-memory-restart 参数。
$ pm2 start big-array.js --max-memory-restart 20M
Nginx as a HTTP proxy
就是在nginx上做个反向代理配置
upstream my_nodejs_upstream {
server 127.0.0.1:3001;
keepalive 64;
}
server {
listen 443 ssl;
server_name www.my-website.com;
ssl_certificate_key /etc/ssl/main.key;
ssl_certificate /etc/ssl/main.crt;
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $http_host;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_pass http://my_nodejs_upstream/;
proxy_redirect off;
proxy_read_timeout 240s;
}
}
fork与cluster启动模式
pm2启动进程的支持两种模式:fork与cluster,对于了解node的人知道,node的多进程编程api: child_process.fork与cluster。关于pm2的fork与cluster两者的本质区别,个人认为就是node API的child_process.fork与cluster的区别,stackoverflow有关于这个问题的讨论。下面做个粗浅的归纳:
cluster是fork的派生,cluster支持所有cluster拥有的特性。
fork不支持socket地址端口复用,cluster支持地址端口复用。因为只有node的cluster模块支持socket选项SO_REUSEADDR。
fork不可以启动多个实例进程,cluster可以启动多个实例。但node的child_process.fork是可以实现启动多个进程的,但是为什么没有实现呢?就个人理解,node多为提供网络服务,启动多个实例需要地址端口复用,此时便可使用cluster模式实现,但fork模式并不支持地址端口复用,多实例进程启动会产生异常错误。但对于常驻任务脚本而言,不需要提供网络服务,此时多进程启动可以实现,同时也提高了任务处理效率。对于上述需求,可以两种方式实现,一是配置app0,app1,app2方式启动多个进程,二是通过应用实例自身调用child_process.fork多进程编程实现。
fork模式可以应用于其他语言,如php,python,perl,ruby,bash,coffee, 而cluster只能应用于node。
fork不支持定时重启,cluster支持定时重启。定时重启也就是配置中的cron_restart配置项。github上面有作者关于fork模式下是否需要实现cron-like定时的讨论,官网文档注明说,fork模式的定时重启这个功能不久将实现。
特点
- 支持进程行为配置 ,即可以通过配置,实现对pm2管理应用的一些基础属性更新修改,如应用名称,启动模式等。
- 支持集群模式,支持负载均衡,但因采用nodejs的cluster模块实现,仅适用于nodejs进程。
- 支持source map,此项针对js, source map文件是js源文件的信息文件,里面存储着源文件的位置信息。
- 支持热重启。
- 支持部署工作流,pm2可依据测试环境和线上环境自动部署到不同的服务器,同时运行在不同配置下。
- 支持监听重启,在文件更新等情况下可实现进程自动重启。
- 支持linux的startup进程启动,startup是指系统boot, 进程自启动,如centos的chkconfig。
- 日志管理,两种日志,pm2系统日志与管理的进程日志,默认会把进程的控制台输出记录到日志中。
- 命令自动补全功能,个人感觉这个功能意义不大,而且尝试了一下,没有原生的linux命令自动补全反应敏捷。
- 监控功能,pm2 monit监控cpu和memory使用情况,keymetrics监控更为详细。
- 支持开发调试模式,非后台运行,pm2-dev start 。
- 支持pm2模块开发,实现pm2的功能扩展。
- keymetrics监控,比pm2 monit监控更为详细友好,通过web页面展示。
- 最大内存重启,设置最大内存限制,超过限制自动重启。
- 编程API,提供API供开发者通过编程方式灵活管理进程。
pm2 注意事项 todo
index.js 成功后,webhooks调成功了会如下图显示

如果pm2启动后状态变成error,执行 npm install pm2@latest -g
pm2 启动 index.js 启动前先在index.js目录
宝塔安装node
安装依赖
index.js 同级目录下
install http
install github-webhook-handler
install child_process
检查权限是不是www的
拷贝jsserver文件
拷贝jsserver文件
拷贝.ssh私钥公钥
拷贝wiki项目