使用 pm2 管理项目

PM2

安装

1
2
3
npm install pm2 -g
npm install pm2@latest -g
npm install git://github.com/Unitech/pm2#master -g

升级

1
2
npm install pm2@latest -g
pm2 update #Update in memory pm2

启动应用

1
2
3
4
5
6
7
pm2 start <app_name|id|all>  #可以指定应用名称pm2 start app,js --name=test
pm2 start app.js -i 4 --name "episode" #-i 4 表示启动四个app.js, 也可以-i max 将会最大限度利用cpu核心数目 --name 用于命名进程
pm2 start app.js
pm2 start app.js -i 1 #cluster_mode
pm2 start app.js -i 0 #支持使用多核 CPU
pm2 start big-app.js --max-memory-restart 20M
cluster_mode 需要Node 0.11.x 以上,否则请用fork mode。

传递参数

1
2
pm2 start app.js -- -p 8080 
pm2 start app.js --node-args="--debug=7001 --trace-deprecation"

命名应用

1
NODE_ENV=production pm2 start index.js -n Ghost

生成服务器脚本

1
pm2 startup <ubuntu|centos|gentoo|systemd>  #产生init脚本,保持进程活着

查看信息

1
2
3
4
pm2 list          # 显示所有进程状态
pm2 jlist # Print process list in raw JSON
pm2 prettylist # Print process list in beautified JSON
pm2 info 0 # Display all informations about a specific process

运行控制

1
2
3
4
5
6
7
8
9
10
11
12
pm2 stop 0             # 停止指定进程
pm2 stop all # 停止所有进程
pm2 restart 0 # Restart specific process id
pm2 restart all # 重启所有进程
pm2 delete 0 # Will remove process from pm2 list
pm2 delete all # Will remove all processes from pm2 list
pm2 reload 0 # 类似restart,0秒重载,支持 cluster_mode
pm2 reload all # Will 0s downtime reload (for NETWORKED apps)
pm2 gracefulReload all # Send exit message then reload (for networked apps)
pm2 dump # ~/.pm2/dump.pm2
pm2 kill # 杀掉PM2
pm2 resurrect # 复活所有进程

代码监控

1
2
3
pm2 start app.js --watch  # 代码修改自动重启
pm2 stop 0 # not stop watching
pm2 stop --watch 0 # stop watching

运行监测

1
pm2 monit              # Monitor all processes

日志

1
2
3
4
pm2 logs               # 显示所有进程日志
pm2 ilogs # Advanced termcaps interface to display logs
pm2 flush # Empty all log file
pm2 reloadLogs # Reload all logs

杂项

1
2
3
4
5
6
pm2 ping  # Ensure pm2 daemon has been launched
pm2 reset <process> # Reset meta data (restarted time...)
pm2 sendSignal SIGUSR2 my-app # Send system signal to script
pm2 start app.js --no-daemon # run pm2 daemon in the foreground
pm2 describe id|all #查看启动程序的详细信息
pm2 web #API(端口:9615)

设置开机自启动

使用 pm2 启动 node

1
pm2 start /home/wwwroot/web.js --watch

dump 这些进程列表

1
pm2 save

生成自启动脚本

1
pm2 startup centos

赋予权限

1
chmod +x /etc/init.d/pm2-init.sh

添加服务

1
chkconfig --add [pm2-init.sh](http://pm2-init.sh/)

注意点

注意点一

保证你的 pm2 启动的目录不能在停止 pm2 前被删除,否则将会导致往后的 pm2 因为找不到执行路径产生 ERROR,停止运行。

如何查看 pm2 应用的执行路径:执行 ps ax | grep pm2,在执行结果中寻在 pm2 进程 PID,执行 ls -l /proc/PM2_PID/cwd,可以查看到该进程的执行路径。

注意点二

执行大部分的 pm2 指令将会初始化 pm2,pm2pm2 kill 除外,在非目标的路径下执行 pm2 指令时千万要注意,pm2 的 God Daemon 可能已经被启动。如:PM2 Successfully daemonized

1
2
3
➜  _drafts git:(master) ✗ pm2 --help
[PM2] Spawning PM2 daemon with pm2_home=/Users/xianyu/.pm2
[PM2] PM2 Successfully daemonized

注意点三

使用 pm2 的 ecosystem.json 配置来启动你的 pm2 程序,简单的配置让启动过程更加清晰,从而提高你的工作效率。

在项目根路径执行 pm2 ecosystem,会生成一个 ecosystem.json 文件。

例如:

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
42
43
44
45
46
47
48
49
50
51
52
53
module.exports = {
/**
* Application configuration section
* http://pm2.keymetrics.io/docs/usage/application-declaration/
*/
apps : [

// First application
{
name : "API",
script : "app.js",
cwd : "/opt/someProject/server",
env: {
COMMON_VARIABLE: "true"
},
env_production : {
NODE_ENV: "production"
}
},

// Second application
{
name : "WEB",
script : "web.js"
}
],

/**
* Deployment section
* http://pm2.keymetrics.io/docs/usage/deployment/
*/
deploy : {
production : {
user : "node",
host : "212.83.163.1",
ref : "origin/master",
repo : "git@github.com:repo.git",
path : "/var/www/production",
"post-deploy" : "npm install && pm2 startOrRestart ecosystem.json --env production"
},
dev : {
user : "node",
host : "212.83.163.1",
ref : "origin/master",
repo : "git@github.com:repo.git",
path : "/var/www/development",
"post-deploy" : "npm install && pm2 startOrRestart ecosystem.json --env dev",
env : {
NODE_ENV: "dev"
}
}
}
}

apps 字段中的每一个配置都对应一个 pm2 app,你可以使用 pm2 startOrRestart ecosystem.json 来启动所有应用,使用 pm2 startOrRestart ecosystem.json --only API 只启动 API 这个应用。

注意到,我在 apps 字段中增加了一个配置 cwd: "/opt/someProject/server",这个配置对应了该应用的代码执行路径,换而言之,当我们在程序中执行 process.cwd() 时,返回的就是这个 /opt/someProject/server 路径。因此,我们可以把 /opt 路径当作 pm2 的启动路径,从而管理多个项目服务进程。

在 pm2 的文档中也有类似的文档:Capistrano like deployments

注意点四

完全关闭 pm2 的方法是 pm2 kill,使用 pm2 delete someApp 只能关闭所有的 pm2 应用,而不能关闭 pm2。

使用 ps ax | grep pm2ps ax | grep PM2ps ax | grep God Daemon 来确定是否完全关闭了 pm2。

注意点五

pm2 gracefulReload ecosystem.config.js --env production doesn’t pick up new settings if I have changed something in the ecosystem.config.js

在更改了ecosystem.config.js配置之后,执行pm2 gracefulReload ecosystem.config.js并不会更新新配置,需要先执行pm2 kill