PM2学习(二)配置文件&环境管理


配置文件

简单说明

  • 配置文件里的设置项,跟命令行参数基本是一一对应的。
  • 可以选择yaml或者json文件,就看个人喜好。
  • 如果启动的时候指定了配置文件,那么命令行参数会被忽略。(个别参数除外,比如--env)

举个简单例子,如下json文件,完整配置说明请参考官方文档

{
  "apps": // apps属性配置了需要pm2管理的服务群,为一个数组,可配置多个项目
   [
    {
      "name": "test", //项目名称(应用名称)
      "cwd": "/project/test", //项目目录
      "script": "bin/www", //项目的启动文件
      "log_date_format": "YYYY-MM-DD HH:mm Z", // 日志日期格式,Z 为时区
      "error_file": "/project/log/testError.log", // 错误日志目录
      "out_file": "/project/log/test.log", // 普通日志目录
      "pid_file": "/project/pid/test.pid", // 项目pid文件
      "min_uptime": "120s", // 最小运行时间,如果程序在这个时间内退出,会被认为错误,自动重启
      "max_restarts": 8, // 最大的自动重启次数
      "max_memory_restart": "10M", // 重启占用最大内存
      "cron_restart": "1 0 * * *", // 定时重启 (*/30 * * * *)每隔30分钟重启一次,(0 10 9 * * *) 每天9:10重启一次 
      "exec_interpreter": "node", //项目的脚本类型,默认node,可选shell
      "exec_mode": "fork", // 项目的启动方式,默认fork,可选cluster[集群],若为cluster,可配置instances
      "instances": 4, // 实例个数,如果exec_mode为cluster[集群],可配置集群实例的个数
      "autorestart": false, // 启用/禁用 项目崩溃或退出时自动重启
      "vizion": false // 启用/禁用 vizion特性(版本控制)
      "watch": [  // 监控变化的目录,一旦变化,自动重启
          "bin",
          "routers"
      ],
      "ignore_watch" : [  // 从监控目录中排除
          "node_modules", 
          "logs",
          "public"
      ],
      "watch_options": {
          "followSymlinks": false
      },
      "env": { // 环境变量配置 "NODE_ENV": "production"  // 环境参数,当前指定为生产环境
           "PORT": 5650, // 端口
      },
      "kill_timeout": 10000
    }
  ]
}    
  • watch可以是布尔值,路径数组或表示路径的字符串。默认为false。
  • ignore_watch可以是一个路径数组或一个字符串,它将被chokidar解释为glob或正则表达式。
  • watch_options是一个替代chokidar的选项的对象。有关定义,请参阅chokidar文档

也可以使用pm2 init命令,创建一个ecosystem.config.js文件,其中已经有默认的配置。

module.exports = { apps : [{ name: 'API', script: 'app.js', // Options reference: https://pm2.io/doc/en/runtime/reference/ecosystem-file/
       args: 'one two', instances: 1, autorestart: true, watch: false, max_memory_restart: '1G', env: { NODE_ENV: 'development' }, env_production: { NODE_ENV: 'production' } }], 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 reload ecosystem.config.js --env production' } } };

简单介绍一下:apps属性配置了需要pm2管理的服务群。

然后deploy属性支持用户使用pm2直接把多个服务群部署到阿里云。

然后使用: pm2 start ecosystem.config.js

部署到云上,这里不展示了,只要配置好ssh,即可部署到任意云平台。 

更多配置参数参考:pm2入坑详解

环境管理

在实际项目开发中,我们的应用经常需要在多个环境下部署,比如开发环境、测试环境、生产环境等。在不同环境下,有时候配置项会有差异,比如链接的数据库地址不同等。

对于这种场景,pm2也是可以很好支持的。首先通过在配置文件中通过env_xx来声明不同环境的配置,然后在启动应用时,通过--env参数指定运行的环境。

环境配置声明

首先,在配置文件中,通过env选项声明多个环境配置。简单说明下:

  • env为默认的环境配置(生产环境),env_devenv_test则分别是开发、测试环境。可以看到,不同环境下的NODE_ENVREMOTE_ADDR字段的值是不同的。
  • 在应用中,可以通过process.env.REMOTE_ADDR等来读取配置中生命的变量。
 "env": { "NODE_ENV": "production", "REMOTE_ADDR": "http://www.example.com/" }, "env_dev": { "NODE_ENV": "development", "REMOTE_ADDR": "http://wdev.example.com/" }, "env_test": { "NODE_ENV": "test", "REMOTE_ADDR": "http://wtest.example.com/" }

启动指明环境

假设通过下面启动脚本(开发环境),那么,此时process.env.REMOTE_ADDR的值就是相应的 http://wdev.example.com/ ,可以自己试验下。

pm2 start app.js --env dev

对于我们init生成的ecosystem.config.js文件,我们可以将其修改成

{ env: { NODE_ENV: 'dev' }, env_development: { NODE_ENV: 'dev' }, env_production: { NODE_ENV: 'prod' } }

他们对应的启动命令分别为:

  • pm2 start ecosystem.config.js --watch --env

  • pm2 start ecosystem.config.js --watch --env development

  • pm2 start ecosystem.config.js --watch --env production

实战配置文件

1、activity项目

pm2.config.js:

module.exports = {
    apps: [
        {
            name: 'game-activity-dev6',
            script: './server/index.js',
            env_dev: { PORT: 6015, NODE_ENV: 'development', }
        },
    ],
};

pm2test.config.js:

// 此文件为staging环境下的启动文件。
module.exports = {
    "apps": [{
        "env": { "NODE_ENV": "development", "NODE_BUILD": "test", "PORT": 6015 }, "name": "game-activity",
        "script": "server/index.js"
    }]
}

pm2.json:

{
  "apps": [{
    "env": { "NODE_ENV": "production", "PORT": 6015 }, "name": "game-activity",
    "script": "server/index.js",
    "execMode": "cluster",
    "watch": "process.env.NODE_ENV !== 'production'",
    "ignore_watch": ["node_modules", "dist", "build"],
    "instances": 20,
    "max_memory_restart": "1024M",
    "kill_timeout": 2000,
    "max_restarts": 20,
    "autorestart": true,
    "restart_delay": 1000
  }]
}

2、gamecenter项目

pm2.config.js:

module.exports = {
    apps: [
{ name:
'game-center-dev1', script: 'server/index.js', env_dev: { NODE_ENV: 'test', PORT: 5650, }, }, { name: 'game-center-dev2', script: 'server/index.js', env_dev2: { NODE_ENV: 'development', PORT: 5651, }, }, { name: 'game-center-dev3', script: 'server/index.js', env_dev3: { NODE_ENV: 'development', PORT: 5652, }, }, { name: 'game-center-dev4', script: 'server/index.js', env_dev4: { NODE_ENV: 'development', PORT: 5653, }, }, { name: 'game-center-dev5', script: 'server/index.js', env_dev5: { NODE_ENV: 'development', PORT: 5654, }, }, { name: 'game-center-dev6', script: 'server/index.js', env_dev6: { NODE_ENV: 'development', PORT: 5655, }, }, { name: 'game-center-dev7', script: 'server/index.js', env_dev7: { NODE_ENV: 'development', PORT: 5656, }, }, ], };

 

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM