配置文件
簡單說明
- 配置文件里的設置項,跟命令行參數基本是一一對應的。
- 可以選擇
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_dev、env_test則分別是開發、測試環境。可以看到,不同環境下的NODE_ENV、REMOTE_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, }, }, ], };
