项目线上运行过程中,可能出现pm2进程莫名消失的情况以及pm2重启失败等情况。所以需要使用一个独立于语言外的工具进行进程监控。常用工具有god, supervisor,monit等。

1.安装monit

1
sudo apt-get install monit

2.配置monitrc,默认路径:/etc/monit/monitrc

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
修改检测时间
set daemon 2 //默认 120
设置通知邮箱信息
set mailserver smtp.qq.com port 465
USERNAME "" PASSWORD ""
using sslv3
设置通知邮件格式
set mail-format {
from: xxx@xxx.com
subject:monit alert -- $EVENT $SERVICE
message: $EVENT Service $SERVICE
Date: $DATE
Action: $ACTION
Host: $HOST
Description: $DESCRIPTION
Your faithful employee,
Monit
}
其中mail-format中from应该和mailserver中的username一致
设置监控信息通知人地址
set alert lonso@foxmail.com

3.配置项目对应的监控信息

1
2
3
4
5
6
7
8
9
check process node_test matching your/start/script.js
start program = "/bin/bash -c 'cd /your/project/ && PM2_HOME=/your/pm2_home/.pm2 /usr/local/bin/pm2 start start.json'" as uid ubuntu and gid ubuntu
stop program = "/bin/bash -c 'cd /your/project/ && PM2_HOME=/your/pm2_home/.pm2 /usr/local/bin/pm2 stop start.json'" as uid ubuntu and gid ubuntu
if failed host 127.0.0.1 port 6000 then alert
#如果127.0.0.1:6000 访问失败则进行通知

其中,由于monit使用execv 所以执行脚本需要加入,’/bin/bash’.wiki

1
2
Finally, Monit uses the system call execv to execute a program or a script. This means that you cannot write shell commands directly in the start, stop or exec statements. To do this, you must do as above; start a shell and issue your commands there. For example:
start program = "/bin/bash -c 'my shell command && my other command'"

PM2_HOME 设置,默认会访问/root/.pm2,所以需要当前用户正确的pm2 home。

脚本启动用户组设置:

1
start program = 'xxxx' as uid ubuntu and gid ubuntu;以ubuntu用户和ubutun用户组启动

以上监控process的时候使用matching匹配文件的情况,是因为pm2在做负载时会生成app-1.pig,app-2.pid等这类的pid文件,所以使用mathing能够统一匹配方便管理.

至此,正常情况下,以上配置成功后,当进程挂掉的时候monit会自动重启,并且会发送邮件到指定的邮箱。

但是,通常情况下会需要一下一些问题:
确保node的环境变量位置

1
2
3
4
5
6
7
8
9
/usr/local/bin/pm2 中
#!/usr/bin/env node 默认使用/usr/bin/env中的node
有些时候我们的node安装路径为 /usr/local/bin/node
所以这点可能会导致项目不能正常启动,错误信息如下
/usr/bin/env:node No such file or directory
解决方法:
sudo ln -s /usr/local/bin/node /usr/bin/node

额外的,可以使用各种邮件服务器进行邮件通知。
本项目中测试了qq邮箱和office 365

配置参考如下:

qq邮箱

1
2
3
set mailserver smtp.qq.com port 465
USERNAME "username" PASSWORD "password"
using sslv3

office 365

1
2
3
set mailserver smtp.office365.com port 587
USERNAME "username" PASSWORD "password"
using tlsv1 with timeout 30 seconds

start program 和stop program执行返回信息可以使用以下方式debug:

1
"/bin/bash -c '/path/myscript &>/tmp/myscript.out'" # &> 之间没有空格

更多信息参考:wiki