运维笔记

pm2 部署node生产环境

Einic Yeo · 6月26日 · 2019年 · · · · · · · ·

一、PM2是什么

  • 是可以用于生产环境的Nodejs的进程管理工具,并且它内置一个负载均衡。它不仅可以保证服务不会中断一直在线,并且提供0秒reload功能,还有其他一系列进程管理、监控功能。并且使用起来非常简单。
  • 嗯嗯,最好的用处就是监控我们的生产环境下的node程序运行状态,让它给我们日以继日的处于工作状态。
  • pm2官方文档

二、为什么要使用pm2

  • 原始社会的我们开发node服务端程序一般过程:
    1. 编写好node程序app.js,运行node app.js;或者写入script使用npm运行;打开浏览器访问;
    2. 好像需要修改内容,浏览器对修改的内容没有显示出来?->node app.js->再次运行;
    3. 浏览器忽然访问不到服务,好像出错啦?重启下->node app.js->再次运行;
    4. 哎呀开了好多控制台窗口,一不小心关闭了,服务又访问不到了,继续打开控制台->node app.js->再次运行;
  • 好崩溃!好像有个工具nodemon;安装使用nodemon app.js;哇,可以自动监听文件修改变化自动重启,但是关闭控制台服务还是会被摧毁。
  • 通过这个很常用的场景,我们了解到要避免这些麻烦一个服务器至少需要有:后台运行和自动重启,这两个能力。
  • 再来看看使用pm2可拥有的能力:
    1. 日志管理;两种日志,pm2系统日志与管理的进程日志,默认会把进程的控制台输出记录到日志中;
    2. 负载均衡:PM2可以通过创建共享同一服务器端口的多个子进程来扩展您的应用程序。这样做还允许以零秒停机时间重新启动应用程序。
    3. 终端监控:可以在终端中监控应用程序并检查应用程序运行版权声明:本文遵循 CC 4.0 BY-SA 版权协议,若要转载请务必附上原文出处链接及本声明,谢谢合作!状况(CPU使用率,使用的内存,请求/分钟等)。
    4. SSH部署:自动部署,避免逐个在所有服务器中进行ssh。
    5. 静态服务:支持静态服务器功能
    6. 支持开发调试模式,非后台运行,pm2-dev start <appName>;
    7. 。。。。。太过强大!

三、pm2常用命令

1、 启动服务pm2 start <script_file|config_file> [options] 启动指定应用

pm2 start app.js                //启动app.js应用
pm2 start app.js --name app    //启动应用并设置name
pm2 start app.sh                //脚本启动

pm2 start app.js --watch    //监听模式启动,当文件发生变化,自动重启

//max 表示PM2将自动检测可用CPU的数量并运行尽可能多的进程
//max可以自定义,如果是4核CPU,设置为2则占用2个
pm2 start app.js -i max //启用群集模式(自动负载均衡)

pm2-dev start ... // 开发模式启动,即不启用后台运行

pm2 startup      // 创建开机自启动命令
pm2 save        // 保存当前应用列表
pm2 resurrect   // 重新加载保存的应用列表

2、查看启动列表pm2 list
3、显示应用程序详细信息pm2 show [options] 显示指定应用详情

pm2 show [Name]      //根据name查看
pm2 show [ID]        //根据id查看

4、停止指定应用pm2 stop <appName> [options] 停止指定应用

pm2 stop all               //停止所有应用
pm2 stop [AppName]        //根据应用名停止指定应用
pm2 stop [ID]             //根据应用id停止指定应用

5、重启应用pm2 reload|restart <appName> [options] 重启指定应用

pm2 restart app.js        //同时杀死并重启所有进程,短时间内服务不可用,生成环境慎用
pm2 reload app.js        //重新启动所有进程,0秒重启,始终保持至少一个进程在运行
pm2 gracefulReload all   //以群集模式重新加载所有应用程序

6、启动静态服务器pm2 serve ./dist 8080将目录dist作为静态服务器根目录,端口为8080
7、删除应用pm2 delete [options] 删除指定应用;如果修改了应用配置行为,需要先删除应用,重新启动后方才会生效,如修改脚本入口文件;

pm2 delete all               //关闭并删除应用
pm2 delete [AppName]        //根据应用名关闭并删除应用
pm2 delete [ID]            //根据应用ID关闭并删除应用

8、pm2 kill 杀掉pm2管理的所有进程;
9、pm2 logs 查看指定应用的日志,即标准输出和标准错误

pm2 logs            //查看所有应用日志
pm2 logs [Name]    //根据指定应用名查看应用日志
pm2 logs [ID]      //根据指定应用ID查看应用日志

pm2 monit 监控各个应用进程cpu和memory使用情况;


四、配置pm2启动文件

// apps:json结构,apps是一个数组,每一个数组成员就是对应一个pm2中运行的应用
{
  "apps": [
    {
      "name": "goods",// 启动任务名
      "cwd": "/srv/node-app/current",// 应用程序所在的目录
      "script": "server.js", // 启动入口(应用程序的脚本路径)
      "log_date_format": "YYYY-MM-DD HH:mm Z", //日志格式化和monent一致
      "error_file": "/var/log/node-app/node-app.stderr.log",//自定义应用程序的错误日志文件
      "out_file": "log/node-app.stdout.log", // 日志输出路径 
      "pid_file": "pids/node-geo-api.pid",//自定义应用程序的pid文件
      "instances": 6, 
      //最小运行时间,这里设置的是60s即如果应用程序在60s内退出,pm2会认为程序异常退出,此时触发重启max_restarts设置数量
      "min_uptime": "200s",
      //设置应用程序异常退出重启的次数,默认15次(从0开始计数)
      "max_restarts": 10,
      "max_memory_restart": "1M",
      // 定时启动,解决重启能解决的问题
      "cron_restart": "1 0 * * *",
      // 是否启用监控模式,默认是false。如果设置成true,当应用程序变动时,pm2会自动重载。这里也可以设置你要监控的文件
      "watch": false,
      "merge_logs": true, // 合并多个任务日志
      // 应用程序的脚本类型,这里使用的shell,默认是nodejs
      "exec_interpreter": "node",
      // 应用程序启动模式,这里设置的是cluster_mode(集群),默认是fork
      "exec_mode": "fork",
      // 启用/禁用应用程序崩溃或退出时自动重启
      "autorestart": false,
      // 启用/禁用vizion特性(版本控制)
      "vizion": false
    }
  ]
}

五、PM2部署

1、 命令生产默认示例配置文件pm2 ecosystempm2 init,运行默认会生成ecosystem.config.js配置文件

module.exports = {
  apps: [
    {
      name: 'back-Api',      //应用名
      script: './server/start.js',   //应用文件位置
      env: {
        PM2_SERVE_PATH: "./apidoc",    //静态服务路径
        PM2_SERVE_PORT: 8080,   //静态服务器访问端口
        NODE_ENV: 'development' //启动默认模式
      },
      env_production : {
        NODE_ENV: 'production'  //使用production模式 pm2 start ecosystem.config.js --env production
      },
      instances:"max",          //将应用程序分布在所有CPU核心上,可以是整数或负数
      instance_var: "INSTANCE_ID",
      exec_mode: "cluster",
      watch:[
        "server",
      ],  //监听模式,不能单纯的设置为true,易导致无限重启,因为日志文件在变化,需要排除对其的监听
      merge_logs: true,         //集群情况下,可以合并日志
    }
  ],
  deploy: {
      production : {
        user: 'node',                      //ssh 用户
        host: '212.83.163.1',              //ssh 地址
        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'  //部署后的动作
      }
  }
}; 

2、自定义json配置文件如:processes.json;启动pm2 start processes.json

    {
      "apps": [{
        "name": "app",  //名称
        "script": "./", //程序入口
        "cwd": "./",           //根目录
        "watch":[
            "views"
        ],//需要监控的目录
        "error_file":"./logs/err.log",//错误输出日志
        "out_file":"./logs/out.log",  //日志
        "log_date_format":"YYYY-MM-DD HH:mm Z" //日期格式
        }]
    }

六、pm2常用配置项解析

1. apps:json结构,apps是一个数组,每一个数组成员就是对应一个pm2中运行的应用

2. name:应用程序名称"app"

3. cwd:应用程序所在的目录"./"

4. script:应用程序的脚本路径"./"

5. log_date_format: 日志文件名输出日期格式"YYYY-MM-DD HH:mm Z"

6. error_file:自定义应用程序的错误日志文件"./logs/app-err.log",

7. out_file:自定义应用程序日志文件"./logs/app-out.log"

8. instances: 应用启动实例个数,仅在cluster模式有效 默认为fork;或者 max

9. min_uptime:最小运行时间,这里设置的是60s即如果应用程序在60s内退出,pm2会认为程序异常退出,此时触发重启max_restarts设置数量

10. max_restarts:设置应用程序异常退出重启的次数,默认15次(从0开始计数)

11. cron_restart:定时启动,解决重启能解决的问题

12. watch:是否启用监控模式,默认是false。如果设置成true,当应用程序变动时,pm2会自动重载。这里也可以设置你要监控的文件。

13. "ignore_watch": [                           // 不用监听的文件
            "node_modules",
            "logs"
        ],
13. merge_logs:// 设置追加日志而不是新建日志

14. exec_interpreter:应用程序的脚本类型,这里使用的shell,默认是nodejs

15. exec_mode:应用程序启动模式,这里设置的是cluster_mode(集群),默认是fork

16. autorestart:启用/禁用应用程序崩溃或退出时自动重启,默认为true, 发生异常的情况下自动重启

17. vizion:启用/禁用vizion特性(版本控制)

18. "args": "", // 传递给脚本的参数

19. env: {
        PM2_SERVE_PATH: "./apidoc",    //静态服务路径
        PM2_SERVE_PORT: 8080,   //静态服务器访问端口
        NODE_ENV: 'development' //启动默认模式
      },

20. env_production : {
        NODE_ENV: 'production'  //使用production模式 pm2 start ecosystem.config.js --env production
      },

七、pm2配合log4js处理日志

1. pm2启动时通常会发现log4版权声明:本文遵循 CC 4.0 BY-SA 版权协议,若要转载请务必附上原文出处链接及本声明,谢谢合作!js记录不到日志信息;

2. 决解方案,安装pm2的pm2-intercom进程间通信模块

3. 在log4js的配置文件logger.js里添加如下命令:

pm2: true,  pm2InstanceVar: 'INSTANCE_ID' 

4. pm2配置文件中添加"instance_va版权声明:本文遵循 CC 4.0 BY-SA 版权协议,若要转载请务必附上原文出处链接及本声明,谢谢合作!r": "INSTANCE_ID", // 添加这一行 字段

5 .发现如果没有设置群集模式"exec_mode": "cluster",也会记录不到;

八、 Nuxt项目部署示例

项目中整合 vue + nuxt + axios + vuex + vue-router (nuxt 自带 vuex 和 vue-router),一个基于 Nuxt 的服务器端渲染 Demo

nuxt项目的启动组件nuxt-start安装

pm2 install nuxt-start && ln -s /usr/local/node/lib/node_modules/nuxt-start/bin/nuxt-start.js /usr/local/bin/nuxt-start

pm2 配置文件初始化

执行pm2 init生成ecosystem.config.js,再根据实际需求修改如下:

[root@infvie wwwroot]# more ecosystem.config.js 
module.exports = {
  apps : [{
    name: 'NuxtDemoName',
    script: '/usr/local/bin/nuxt-start',

    // Options reference: https://pm2.io/doc/en/runtime/reference/ecosystem-file/
    instances: 1,
    autorestart: true,
    watch: true,
    merge_logs : true,
    cwd : "/data/wwwroot/NuxtDemo/",
    max_memory_restart: '125M',
  }],
} 

pm2启动NuxtDemo

[root@infvie wwwroot]# ll
total 16
-rw-r--r--  1 www  www   338 Jul 18 14:39 ecosystem.config.js
drwxr-xr-x  6 www  www   4096 Jul 18 14:45 NuxtDemo
[root@infvie wwwroot]# su - www -c 'pm2 start /data/wwwroot/ecosystem.config.js'

参考文献

https://pm2.io/doc/zh/r版权声明:本文遵循 CC 4.0 BY-SA 版权协议,若要转载请务必附上原文出处链接及本声明,谢谢合作!untime/reference/pm2-programmatic/

https://pm2.keymetrics.io/docs/usage/quick-start/

https://www.jian版权声明:本文遵循 CC 4.0 BY-SA 版权协议,若要转载请务必附上原文出处链接及本声明,谢谢合作!shu.com/p/d2a640b8661c

0 条回应