pm2项目部署总结

PM2项目部署总结

Posted by wang chong on February 5, 2019

什么是pm2

pm2是一个带有负载均衡功能的Node应用的进程管理器。pm2是一个后台进程管理器。

前台进程与后台进程

  1. 前台进程是指项目启动进程之后,这个一直在终端中运行,不能关掉,关掉的话项目就会终止。像supervisor和nodemon就是前台进程管理。
  2. 后台进程是在计算机后台启动一个进行,不会在终端中显示,但是仍然启动。

pm2的特点

  1. 内建负载均衡
  2. 后台运行
  3. 0秒停机重启
  4. 具有Ubuntu和CentOS的启动脚本
  5. 停止不稳定的进程(避免无限循环)
  6. 控制台检测
  7. 提供HTTP API
  8. 远程控制和实时的接口API(Nodejs模块,允许和pm2进程管理器交互)

pm2的生态文件

一般我们会在项目的根目录创建pm2.json文件,基本内容如下:

{
    "name" : "node-app",
    "script" : "app.js",
    "log_data_format" : "YYYY-MM-DD HH:mm Z",
    "out_file" : "log/node-app.stdout.log",
    "watch" : true,
    "instances": "max",
    "exec_mode" : "cluster"
}

这是一个简单的生态文件。具体的属性值可参考pm2生态文件属性

启动pm2,可直接使用以下命令

pm2 start pm2.json

环境变量的设置

pm2生态文件中可使用env_[name]的形式设置多个环境变量

{
    "name" : "node-app",
    "script" : "app.js",
    "log_data_format" : "YYYY-MM-DD HH:mm Z",
    "out_file" : "log/node-app.stdout.log",
    "watch" : true,
    "instances": "max",
    "exec_mode" : "cluster"
    "env" : {
        "NODE_ENV" : "development"
    },
    "env_production" : {
        "NODE_ENV" :"production"
    }
}

终端使用–env参数指定环境

pm2 start pm2.json –env production

项目一旦启动环境变量就是定值,无法更改,如果非要更改可使用–update-env来更改

pm2 restart pm2.json –update-env

进程管理

pm2是一个保存在后台的进程,一个守护进程,负责处理您所有正在运行的进程。

pm2 进程命令

启动进程

pm2 start pm2.json

停止进程

pm2 stop node-app node-app为启动进程名称

pm2 stop all 停止所有

重启进程

pm2 restart node-app

列出所有进程

pm2 ls

启动本地监控

pm2 monit

pm2的日志管理

pm2的日志可以实时获取并存储在硬盘中,默认情况下保存在~/.pm2/logs中

所有进程的实时日志

pm2 logs

可指定进程名称表示只查看单个进程的实时日志

清空日志

pm2 flush

用配置文件指定日志管理

就下面的配置而言

{
    "name": 'app',
    "script": 'app.js',
    "output": './out.log',
    "error": './error.log',
	"log": './combined.outerr.log',
}
  1. output表示只是标准输出相当于JavaScript的console.log()
  2. error表示只是错误输出相当于JavaScript的console.error()
  3. log 相当于上面两种的结合,默认是禁用的。
  4. 循环日志:pm2 install pm2-logrotate
合并日志

负载均衡集群模式下,每一个都有自己的日志文件在pm2.json中加上merg_logs:true就可以合并日志文件

{
    "name": 'app',
    "script": 'app.js',
    "output": './out.log',
    "error": './error.log',
	"log": './combined.outerr.log',
	"merge_logs" : true,
}
禁用日志

如果想禁用日志的话,在配置文件中output和error的值改为’/dev/null’就可以禁用日志

{
    "name": 'app',
    "script": 'app.js',
    "output": '/dev/null',
    "error": '/dev/null',
}
格式化日志

通过在配置文件中添加属性”log_type” : “json”,让日志为json文件输出

{
    "name": 'app',
    "script": 'app.js',
    "output": './out.log',
    "error": './error.log',
	"log": './combined.outerr.log',
	"log_type" : "json",
	"merge_logs" : true,
}
日志时间戳

通过在配置文件中添加属性 “log_data_format” : “YYYY-MM-DD HH:mm Z”,让日志有时间戳

{
    "name": 'app',
    "script": 'app.js',
    "output": './out.log',
    "error": './error.log',
	"log": './combined.outerr.log',
	"log_type" : "json",
	 "log_data_format" : "YYYY-MM-DD HH:mm Z",
	"merge_logs" : true,
}

启动脚本

启动脚本的目的是保存我们的进程列表,并在计算机重启甚至出现意外时将其恢复。

每个操作系统都有一个特定的工具来处理启动脚本。

安装

检测计算机上可用的init系统并生成配置

pm2 startup

sudo su -c “env PATH=$PATH:/home/unitech/.nvm/versions/node/v4.3/bin pm2 startup -u --hp

保存进程列表

pm2 save

禁用启动脚本

pm2 unstartup

设置用户权限

如果您希望启动挂钩在其他用户下执行,使用 -u < username >和 –hp < user_home>选项:

pm2 startup ubuntu -u www –hp /home/ubuntu

更新启动脚本

pm2 unstartup

pm2 startup

兼容性

支持的Init系统是:

  1. systemd: Ubuntu >= 16, CentOS >= 7, Arch, Debian >= 7
  2. upstart: Ubuntu <= 14
  3. launchd: Darwin, MacOSx
  4. openrc: Gentoo Linux, Arch Linux
  5. rcd: FreeBSD
  6. systemv: Centos 6, Amazon Linux

在启动时候可以指定平台

pm2 [startup unstartup] [platform]

最后的参数可以是下面的任意一个

[ubuntu ubuntu14 ubuntu12 centos centos6 arch oracle amazon macos darwin freebsd systemd systemv upstart launchd rcd openrc]。

各操作系统的启动脚本

  1. ubuntu 使用 updaterc.d 和脚本 lib/scripts/pm2-init.sh
  2. centos/redhat 使用 chkconfig 和脚本 lib/scripts/pm2-init-centos.sh
  3. gentoo 使用 rc-update 和脚本 lib/scripts/pm2
  4. systemd 使用 systemctl 和脚本 lib/scripts/pm2.service
  5. darwin 使用 launchd 来加载一个特定的 plist 以便在重启后复活进程.

负载均衡

pm2的负载均衡也可以称之为集群模式。下面是官网的一张图

内置的负载平衡器提供联网的Node.js应用(http(s)/ tcp /udp服务器),可在所有可用的CPU上进行缩放,无需修改任何代码。

使用

在启动时候可以通过-i+参数来启动负载均衡

pm2 start pm2.json -i max

max表示pm2将自动检测可用cpu的数量并尽可能的多运行进程。

在配置文件中使用

在pm2.json文件中添加instances属性就可以实现上述操作

{
    "name": 'app',
    "script": 'app.js',
    "output": './out.log',
    "error": './error.log',
	"log": './combined.outerr.log',
	"log_type" : "json",
	 "log_data_format" : "YYYY-MM-DD HH:mm Z",
	"merge_logs" : true,
	"instances" : "max"  值可以是一个整数 表示特定数量的集群,可以使max字符,表示启动cpu内核数量最大的集群。
}

0秒宕机重载

当使用restart时,pm2会先杀死进程然后再重启进程,所以在短时间内无法启动服务,通过重载,pm2会一一的重启所有进程,保证始终都有一个进程在运行。

pm2 reload node-app 或者 pm2 reload pm2.json

观测

pm2有个非常强大的观测系统,在配置文件中把watch属性值改为true,就可以启动这个观测,或者在命令行启动的时候后面加上–watch

{
    "name": 'app',
    "script": 'app.js',
    "output": './out.log',
    "error": './error.log',
	"log": './combined.outerr.log',
	"log_type" : "json",
	 "log_data_format" : "YYYY-MM-DD HH:mm Z",
	"merge_logs" : true,
	"instances" : "max"  值可以是一个整数 表示特定数量的集群,可以使max字符,表示启动cpu内核数量最大的集群。
	"watch" : true,
}

这个是pm2的观测平台