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, }, }, ], };
复制代码

 

 

posted @   坤嬷嬷  阅读(3206)  评论(1编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 字符编码:从基础到乱码解决
点击右上角即可分享
微信分享提示