0%

PM2学习-2018-06-01

pm2学习笔记

pm2 有一个很好看的 web 管理应用

keymetrics
安装了 pm2以后,到这个网站上注册账号,并用他给的 pm2 link xxx xxxx就把当前电脑的pm2管理的进程情况输出到这个网站上了

基本指令

npm install pm2 -g : 全局安装。 --watch 是监控项目的所有文件,一旦有改变就重启服务器,像nodemon 一样

pm2 start app.js : 启动服务,入口文件是app.js。
pm2 start app.js -i [n] --name [name] : 启动n个进程,名字命名为name。
pm2 start app.js -i max 使用负载均衡的模式启动程序, cluster mode 模式,max 是指服务器有多少个 CPU 就启动多少个应用实例,进行负载均衡,尽最大程度使用 CPU
pm2 serve path port 运行一个静态文件目录,路径应该是一个文件夹,而不是文件,然后在 localhost:port/文件访问
npm restart [name or id] : 重启服务。
npm reload [name or id] : 和rastart功能相同,但是可以实现0s的无缝衔接;如果有nginx的使用经验,可以对比nginx reload指令。
pm2 start app.js --max_memory_restart 1024M : 当内存超过1024M时自动重启。 如果工程中有比较棘手的内存泄露问题,这个算是一个折中方案。
pm2 monit : 对服务进行监控。

更多的指令可以参考 PM2 介绍

高级用法 ecosystem

pm2支持配置文件启动:
pm2 ecosystem: 生成配置文件ecosystem.json
pm2 startOrRestart /file/path/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
54
55
56
57
58
59
60
61
62
63
module.exports = {
/**
* Application configuration section
* http://pm2.keymetrics.io/docs/usage/application-declaration/
*/
apps : [
// First application
{
name : 'mongoDB',
script : 'mongod'
},
// Second application
{
name : 'iot_api',
script : './seeed_IOT/seeed_iot_api/bin/www',
env: {
NODE_ENV: 'release'
},
env_production : {
NODE_ENV: 'release'
},
watch: true,
},
{
name: 'message server',
script: './seeed_IOT/seeed_message_server/bin/www',
env: {
'NODE_ENV': 'release'
},
env_production : {
NODE_ENV: 'release'
},
watch: true,
}
],

/**
* Deployment section
* http://pm2.keymetrics.io/docs/usage/deployment/
*/
deploy : {
// production : {
// user : 'node', // 登录远程服务器的用户名,此处填写我们创建的hwl
// host : '212.83.163.1', // 服务器 IP
// ref : 'origin/master', // git 地址及分支
// repo : '[email protected]:repo.git', // git 仓库地址
// path : '/var/www/production', // 服务器路径
// 'post-deploy' : 'npm install && pm2 reload ecosystem.config.js --env production'
// },
// dev : {
// user : 'node',
// host : '212.83.163.1',
// ref : 'origin/master',
// repo : '[email protected]:repo.git',
// path : '/var/www/development',
// 'post-deploy' : 'npm install && pm2 reload ecosystem.config.js --env dev',
// env : {
// NODE_ENV: 'dev'
// }
// }
}
};

配置项:

  1. name 应用进程名称;
  2. script 启动脚本路径;
  3. cwd 应用启动的路径,关于script与cwd的区别举例说明:在/home/polo/目录下运行/data/release/node/index.js,此处script为/data/release/node/index.js,cwd为/home/polo/;
  4. args 传递给脚本的参数;
  5. interpreter 指定的脚本解释器;
  6. interpreter_args 传递给解释器的参数;
  7. instances 应用启动实例个数,仅在cluster模式有效,默认为fork;
  8. exec_mode 应用启动模式,支持fork和cluster模式;
  9. watch 监听重启,启用情况下,文件夹或子文件夹下变化应用自动重启;
  10. ignore_watch 忽略监听的文件夹,支持正则表达式;
  11. max_memory_restart 最大内存限制数,超出自动重启;
  12. env 环境变量,object类型,如{“NODE_ENV”:”production”, “ID”: “42”};
  13. log_date_format 指定日志日期格式,如YYYY-MM-DD HH:mm:ss;
  14. error_file 记录标准错误流,$HOME/.pm2/logs/XXXerr.log),代码错误可在此文件查找;
  15. out_file 记录标准输出流,$HOME/.pm2/logs/XXXout.log),如应用打印大量的标准输出,会导致pm2日志过大;
  16. min_uptime 应用运行少于时间被认为是异常启动;
  17. max_restarts 最大异常重启次数,即小于min_uptime运行时间重启次数;
  18. autorestart 默认为true, 发生异常的情况下自动重启;
  19. cron_restart crontab时间格式重启应用,目前只支持cluster模式;
  20. force 默认false,如果true,可以重复启动一个脚本。pm2不建议这么做;
  21. restart_delay 异常重启情况下,延时重启时间;

本地pm2的ecosystem配置

在本地的目标应用下,输入:

1
pm2 ecosystem

生成pm2的部署配置模板文件如下:

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
{
/**
* Application configuration section
* PM2 - Application Declaration
*/
apps : [
// First application
{
name : "API",
script : "app.js",
env: {
COMMON_VARIABLE: "true"
},
env_production : {
NODE_ENV: "production"
}
},
// Second application
{
name : "WEB",
script : "web.js"
}
],
/**
* Deployment section
* PM2 - Deployment
*/
deploy : {
production : {
### ### ## user : "node",
host : "212.83.163.1",
ref : "origin/master",
repo : "[email protected]: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 : "[email protected]:repo.git",
path : "/var/www/development",
"post-deploy" : "npm install && pm2 startOrRestart ecosystem.json --env dev",
env : {
NODE_ENV: "dev"
}
}
}
}

应为目前我们仅部署一个应用,因此,先把不必要的信息删除,即删除apps部分的第二项。同时把我们的目标文件改为你应用的入口文件,此处修改为Express.js的默认设置,即:

1
script    : "./bin/www",

apps部分就设置完毕了,然后再设置deploy部分。其中production用于生产环境,dev用于开发环境,为了演示,我们只设置production部分。

下面依次介绍各个设置:

1
2
3
4
5
6
7
8
production : {
user : "登录远程服务器的用户名,此处填写我们创建的yishi",
host : "远程服务器的IP或hostname,此处可以是数组同步部署多个服务器,不过鉴于我们只有一个服务器,因此我们填写123.57.205.23",
ref : "远端名称及分支名,此处填写origin/master",
repo : "git仓库地址,此处填写[email protected]:e10101/pm2app.git",
path : "远程服务器部署目录,需要填写user具备写入权限的目录,此处填写/home/yishi/www/production",
"post-deploy" : "部署后需要执行的命令,此处填写npm install && pm2 startOrRestart ecosystem.json --env production"
}

整理后,按照我们的设置,应为:

1
2
3
4
5
6
7
8
production: {
user: "yishi",
host: "123.57.205.23",
ref: "origin/master",
repo: "[email protected]:e10101/pm2app.git",
path: "/home/yishi/www/production",
"post-deploy": "npm install && pm2 startOrRestart ecosystem.json --env production"
},

因为pm2的部署是通过ssh进行的,因此需要开通本地到远程服务器的无密码登录,同样,在Mac下,通过ssh-keygen生成RSA公钥,并拷贝到远程服务器:

1
scp ~/.ssh/id_rsa.pub [email protected]:/home/yishi/.ssh/authorized_keys

上述命令中的yishi为用户名,执行时需要替换为你设置的用户名。

设置ssh完毕后,再看看整理完毕的ecosystem配置文件,如下:

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
{
/**
* Application configuration section
* PM2 - Application Declaration
*/
apps : [
// First application
{
name : "pm2app",
script : "./bin/www",
env: {
COMMON_VARIABLE: "true"
},
env_production : {
NODE_ENV: "production"
}
}
],
/**
* Deployment section
* PM2 - Deployment
*/
deploy : {
production : {
user: "yishi",
host: "123.57.205.23",
ref: "origin/master",
repo: "[email protected]:e10101/pm2app.git",
path: "/home/yishi/www/production",
"post-deploy": "npm install && pm2 startOrRestart ecosystem.json --env production"
}
}
}

在本地应用目录下,执行pm2 deploy命令:

1
pm2 deploy ecosystem.json production setup

提示错误:

1
2
3
4
5
6
Host key verification failed.
fatal: Could not read from remote repository.
Please make sure you have the correct access rights and the repository exists.
failed to clone
Deploy failed

此时主要是在远程服务器中,并未将http://github.com加入known_hosts,在服务器端通过如下命令设置:

1
ssh-keyscan -t rsa github.com >> ~/.ssh/known_hosts

在本地继续执行部署命令:

1
pm2 deploy ecosystem.json production setup

此时,如无其他问题,输出应提示:

1
2
  ○ setup complete
--> Success

至此,pm2的部署设置完毕。

pm2部署

pm2的部署设置完毕后,接下来就是实际部署了。

在部署前,现将本地代码修改并进行git提交:

1
2
3
git add .
git commit -m "update ecosystem"
git push

提交后,在本地应用目录,输入如下命令进行生产环境的部署:

1
pm2 deploy ecosystem.json production

可以看到如下输出:

1
2
3
4
5
6
7
8
9
10
11
[PM2][WARN] Applications pm2app not running, starting...
[PM2] App [pm2app] launched (1 instances)
┌──────────┬────┬──────┬──────┬────────┬─────────┬────────┬─────────────┬──────────┐
│ App name │ id │ mode │ pid │ status │ restart │ uptime │ memory │ watching │
├──────────┼────┼──────┼──────┼────────┼─────────┼────────┼─────────────┼──────────┤
│ pm2app │ 0 │ fork │ 1028 │ online │ 0 │ 0s │ 11.246 MB │ disabled │
└──────────┴────┴──────┴──────┴────────┴─────────┴────────┴─────────────┴──────────┘
Use `pm2 show <id|name>` to get more details about an app
○ hook test
○ successfully deployed origin/master
--> Success

部署成功,在远程服务器查看端口情况:

1
netstat -antp

可以看到应用默认部署的3000端口已经开放了。通过浏览器打开:

1
http://123.57.205.23:3000/

可以看到部署的Web应用可以访问了。(如果netstat -antp中可见3000端口可访问,可以检查下ECS的防火墙设置,确保3000端口对外开放)

pm2其他命令

应用列表:

1
pm2 list

应用信息(查看应用编号为0的信息):

1
pm2 show 0 

(重要)服务器端设置pm2开机自动启动

开启启动设置,此处是CentOS系统,其他系统替换最后一个选项(可选项:ubuntu, centos, redhat, gentoo, systemd, darwin, amazon):

1
pm2 startup centos

然后按照提示需要输入的命令进行输入:

1
sudo su -c "env PATH=$PATH:/usr/bin pm2 startup centos -u yishi --hp /home/yishi"

保存pm2设置:

1
pm2 save

现在重新启动系统,测试是否可以开机启动:

1
sudo reboot

等系统重启后,通过浏览器检查系统是否自动启动:

1
http://123.57.205.23:3000/

如果启动正常,说明设置成功!

以上就是如何通过pm2部署Node应用到服务器生成环境的总结。