設定檔
在使用 PM2 管理多個應用程式時,請使用 JS 設定檔來組織它們。
產生設定檔
若要產生範例設定檔,您可以輸入此指令
$ pm2 init simple
這將產生範例 ecosystem.config.js
module.exports = {
apps : [{
name : "app1",
script : "./app.js"
}]
}
如果您要建立自己的設定檔,請確定它以 .config.js
結尾,這樣 PM2 才能將它辨識為設定檔。
對設定檔進行操作
與對應用程式進行操作一樣,您可以啟動/停止/重新啟動/刪除設定檔中包含的所有應用程式
# Start all applications
pm2 start ecosystem.config.js
# Stop all
pm2 stop ecosystem.config.js
# Restart all
pm2 restart ecosystem.config.js
# Reload all
pm2 reload ecosystem.config.js
# Delete all
pm2 delete ecosystem.config.js
對特定程序進行操作
您也可以使用其名稱和選項 --only <app_name>
對特定應用程式進行操作
pm2 start ecosystem.config.js --only api-app
注意:--only
選項也適用於啟動/重新啟動/停止/刪除
您甚至可以指定多個要進行操作的應用程式,方法是指定每個應用程式名稱,並以逗號分隔
pm2 start ecosystem.config.js --only "api-app,worker-app"
切換環境
您可以透過 env_*
選項指定不同的環境變數組。
範例
module.exports = {
apps : [{
name : "app1",
script : "./app.js",
env_production: {
NODE_ENV: "production"
},
env_development: {
NODE_ENV: "development"
}
}]
}
現在,若要在不同環境中的變數之間切換,請指定 --env [env name]
選項
pm2 start process.json --env production
pm2 restart process.json --env development
可用的屬性
應用程式行為和設定檔可以使用下列屬性進行微調
一般
欄位 | 類型 | 範例 | 說明 |
---|---|---|---|
名稱 | (字串) | “my-api” | 應用程式名稱(預設為不含副檔名的腳本檔檔名) |
腳本 | (字串) | ”./api/app.js” | 相對於 pm2 啟動的腳本路徑 |
cwd | (字串) | “/var/www/” | 啟動應用程式的目錄 |
引數 | (字串) | “-a 13 -b 12” | 包含透過 CLI 傳遞給腳本的所有引數的字串 |
直譯器 | (字串) | “/usr/bin/python” | 直譯器絕對路徑(預設為 node) |
interpreter_args | (字串) | ”–harmony” | 傳遞給直譯器的選項 |
node_args | (字串) | interpreter_args 的別名 |
進階功能
欄位 | 類型 | 範例 | 說明 |
---|---|---|---|
instances | 數字 | -1 | 要啟動的應用程式執行個體數目 |
exec_mode | 字串 | “cluster” | 啟動應用程式的模式,可以是 “cluster” 或 “fork”,預設為 fork |
watch | 布林值或 [] | true | 啟用監控和重新啟動功能,如果資料夾或子資料夾中的檔案有變更,應用程式將會重新載入 |
ignore_watch | 清單 | [”[\/\\]\./”, “node_modules”] | 由監控功能忽略某些檔案或資料夾名稱的正則表示式清單 |
max_memory_restart | 字串 | “150M” | 如果應用程式超過指定的記憶體量,它將會重新啟動。人機友善的格式:可以是 “10M”、“100K”、“2G” 等… |
env | 物件 | {“NODE_ENV”: “development”, “ID”: “42”} | 將會出現在應用程式中的環境變數 |
env_ |
物件 | {“NODE_ENV”: “production”, “ID”: “89”} | 執行 pm2 restart app.yml --env |
appendEnvToName | 布林值 | true | 預設為 false。用於在單一伺服器上部署多個環境。它會將每個環境附加到名稱。例如:my-api-production |
source_map_support | 布林值 | true | 預設為 true,[啟用/停用原始碼對應檔] |
instance_var | 字串 | “NODE_APP_INSTANCE” | 請參閱文件 |
filter_env | 字串陣列 | [ “REACT_” ] | 排除以 “REACT_” 開頭的全球變數,並禁止它們滲透到叢集中。 |
日誌檔
欄位 | 類型 | 範例 | 說明 |
---|---|---|---|
log_date_format | (字串) | “YYYY-MM-DD HH:mm Z” | 日誌日期格式(請參閱日誌區段) |
error_file | (字串) | 錯誤檔案路徑(預設為 $HOME/.pm2/logs/<app name>-error-<pid>.log) | |
out_file | (字串) | 輸出檔案路徑(預設為 $HOME/.pm2/logs/<app name>-out-<pid>.log) | |
log_file | (字串) | 輸出和錯誤日誌的檔案路徑(預設為停用) | |
combine_logs | 布林值 | true | 如果設為 true,避免使用程序 ID 為日誌檔案加上字尾 |
merge_logs | 布林值 | true | combine_logs 的別名 |
time | 布林值 | false | 預設為 false。如果為 true,會自動在日誌前面加上日期 |
pid_file | (字串) | pid 檔案路徑(預設為 $HOME/.pm2/pids/<app name>-<pid>.pid) |
控制流程
欄位 | 類型 | 範例 | 說明 |
---|---|---|---|
min_uptime | (數字) | 應用程式開始運作的最小正常運行時間 | |
listen_timeout | 數字 | 8000 | 應用程式未偵聽時,強制重新載入前經過的毫秒數 |
kill_timeout | 數字 | 1600 | 在傳送 最後一個 SIGKILL 之前經過的毫秒數 |
shutdown_with_message | 布林值 | false | 使用 process.send(‘shutdown’) 關閉應用程式,而非 process.kill(pid, SIGINT) |
wait_ready | 布林值 | false | 不要等待偵聽事件重新載入,而是等待 process.send(‘ready’) |
max_restarts | 數字 | 10 | 在應用程式被視為有錯誤並停止重新啟動之前,連續不穩定的重新啟動次數(小於 1 秒間隔或透過 min_uptime 設定自訂時間) |
restart_delay | 數字 | 4000 | 在重新啟動已當掉的應用程式之前等待的時間(以毫秒為單位)。預設為 0。 |
autorestart | 布林值 | false | 預設為 true。如果為 false,PM2 將不會在應用程式當掉或正常結束時重新啟動應用程式 |
cron_restart | 字串 | “1 0 * * *” | 重新啟動應用程式的 cron 模式。應用程式必須正在執行,cron 功能才能運作 |
vizion | 布林值 | false | 預設為 true。如果為 false,PM2 將在沒有 vizion 功能(版本控制元資料)的情況下啟動 |
post_update | 清單 | [“npm install”, “echo launching the app”] | 在您從 Keymetrics 儀表板執行拉取/升級操作後將執行的命令清單 |
force | 布林值 | true | 預設為 false。如果為 true,您可以多次啟動同一個腳本,而這通常是不被 PM2 允許的 |
部署
項目名稱 | 說明 | 類型 | 預設值 |
---|---|---|---|
key | SSH 金鑰路徑 | 字串 | $HOME/.ssh |
user | SSH 使用者 | 字串 | |
host | SSH 主機 | [字串] | |
ssh_options | 沒有命令列旗標的 SSH 選項,請參閱「man ssh」 | 字串或 [字串] | |
ref | GIT 遠端/分支 | 字串 | |
repo | GIT 遠端 | 字串 | |
path | 伺服器中的路徑 | 字串 | |
pre-setup | 預設指令或您本機電腦上腳本的路徑 | 字串 | |
post-setup | 主機電腦上的後設指令或腳本路徑 | 字串 | |
pre-deploy-local | 預部署動作 | 字串 | |
post-deploy | 後部署動作 | 字串 |
注意事項
使用 JSON 應用程式宣告時傳遞的所有命令列選項都將被捨棄,例如
CWD
cwd:您的 JSON 宣告不需要與您的腳本放在一起。如果您希望將 JSON 保存在腳本以外的位置(例如,/etc/pm2/conf.d/node-app.json
),您需要使用 cwd
功能(請注意,這對於使用符號連結的 Capistrano 風格目錄結構非常有幫助)。檔案可以相對於 cwd
目錄,或絕對路徑(請參閱以下範例)。
CLI/JSON 選項
所有鍵值都能在 JSON 設定檔中使用,但命令列上幾乎保持相同,例如
exec_mode -> --execute-command
max_restarts -> --max-restarts
force -> --force
使用引號來建立 ESC,例如
$pm2 start test.js --node-args "port=3001 sitename='first pm2 app'"
nodeArgs
參數將會解析為
[
"port=3001",
"sitename=first pm2 app"
]
但不是
[
"port=3001",
"sitename='first",
"pm2",
"app'"
]
停用記錄
你可以傳遞 /dev/null
至 error_file 或 out_file 來停用記錄儲存。注意:從 PM2 2.4.0
開始,/dev/null
或 NULL
會獨立於平台停用記錄。
記錄後綴
你可以透過啟用選項 merge_logs: true
來停用記錄上的自動 ID 後綴(例如 app-name-ID.log
)
環境定義
你需要使用 --env <envname>
告訴 pm2 使用在程序檔案中定義的特定環境
{
"apps" : [{
"name" : "worker-app",
"script" : "./worker.js",
"watch" : true,
"env": {
"NODE_ENV": "development"
},
"env_production" : {
"NODE_ENV": "production"
}
},{
"name" : "api-app",
"script" : "./api.js",
"instances" : 4,
"exec_mode" : "cluster"
}]
}
在此範例中,你將執行 pm2 start ecosystem.json
,它將使用預設環境(在開發中)啟動你的應用程式。然後你使用 pm2 start ecosystem.json --env production
,它將使用屬性 env_<name>
,其中 name 在這裡是 production
,因此它將使用 NODE_ENV=production
啟動你的應用程式。
特殊 ext_type
- min_uptime
min_uptime
的值可以是- 數字 例如
"min_uptime": 3000
表示 3000 毫秒。 - 字串 因此,我們讓它簡短且易於設定:
h
、m
和s
,例如:"min_uptime": "1h"
表示一小時,"min_uptime": "5m"
表示五分鐘,"min_uptime": "10s"
表示十秒(這些將轉換為毫秒)。
- 數字 例如
- max_memory_restart
max_memory_restart
的值可以是- 數字 例如
"max_memory_restart": 1024
表示 1024 位元組(不是位元)。 - 字串因此,我們讓它簡短且容易設定:
G
、M
和K
,例如:"max_memory_restart": "1G"
表示 1 GB、"max_memory_restart": "5M"
表示 5 MB,而"max_memory_restart": "10K"
表示 10 KB(這些值會轉換成位元組)。
- 數字 例如
-
選用值例如
exec_mode
可以採用cluster
(cluster_mode
) 或fork
(fork_mode
) 作為可能的值。 - 須知事項
"instances": 0
表示 PM2 會根據 CPU 數量啟動最多可能的處理程序(叢集模式)- 陣列
args
、node_args
和ignore_watch
可以是Array
類型(例如:"args": ["--toto=heya coco", "-d", "1"]
)或string
類型(例如:"args": "--to='heya coco' -d 1"
)