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