1. 程式人生 > >PM2用法簡介

PM2用法簡介

簡介

PM2是node程序管理工具,可以利用它來簡化很多node應用管理的繁瑣任務,如效能監控、自動重啟、負載均衡等,而且使用非常簡單。引用

全域性安裝

sudo npm install [email protected] -g

用法

  • 最簡單的啟用一個應用: pm2 start app.js
  • 停止:pm2 stop app_name|app_id
  • 刪除:pm2 delete app_name|app_id
  • 重啟:pm2 restart app_name|app_id
  • 停止所有:pm2 stop all
  • 檢視所有的程序:pm2 list
  • 檢視所有的程序狀態:pm2 status
  • 檢視某一個程序的資訊:pm2 describe app_name|app_id

引數說明

  • --watch:監聽應用目錄原始碼的變化,一旦發生變化,自動重啟。如果要精確監聽、不見聽的目錄,最好通過配置檔案
  • -i --instances:啟用多少個例項,可用於負載均衡。如果-i 0或者-i max,則根據當前機器核數確定例項數目,可以彌補node.js缺陷
  • --ignore-watch:排除監聽的目錄/檔案,可以是特定的檔名,也可以是正則。比如--ignore-watch="test node_modules "some scripts"
  • -n --name:應用的名稱。檢視應用資訊的時候可以用到
  • -o --output <path>:標準輸出日誌檔案的路徑,有預設路徑
  • -e --error <path>:錯誤輸出日誌檔案的路徑,有預設路徑
  • --interpreter <interpreter>:the interpreter pm2 should use for executing app (bash, python...)。比如你用的coffee script來編寫應用

完整引數命令: pm2 start index.js --watch -i 2

配置檔案

  • 配置檔案裡的設定項,跟命令列引數基本是一一對應的
  • 配置檔案的格式可以為json/yaml
  • json格式的配置檔案,pm2當作普通的js檔案來處理,所以可以在裡面添加註釋或者編寫程式碼,這對於動態調整配置很有好處
  • 如果啟動的時候指定了配置檔案,那麼命令列引數會被忽略(個別引數除外,比如--env)

完整引數單個app配置:

{
  "name"             : "node-app", //啟動app名稱
  "cwd"              : "/srv/node-app/current", "args" : ["--toto=heya coco", "-d", "1"], "script" : "bin/app.js", "node_args" : ["--harmony", " --max-stack-size=102400000"], "log_date_format" : "YYYY-MM-DD HH:mm Z", "error_file" : "/var/log/node-app/node-app.stderr.log", "out_file" : "log/node-app.stdout.log", "pid_file" : "pids/node-geo-api.pid", "instances" : 6, //or 0 => 'max' "min_uptime" : "200s", // 200 seconds, defaults to 1000 "max_restarts" : 10, // defaults to 15 "max_memory_restart": "1M", // 1 megabytes, e.g.: "2G", "10M", "100K", 1024 the default unit is byte. "cron_restart" : "1 0 * * *", "watch" : false, "ignore_watch" : ["[\\/\\\\]\\./", "node_modules"], "merge_logs" : true, "exec_interpreter" : "node", "exec_mode" : "fork", "autorestart" : false, // enable/disable automatic restart when an app crashes or exits "vizion" : false, // enable/disable vizion features (versioning control) // Default environment variables that will be injected in any environment and at any start "env": { "NODE_ENV": "production", "AWESOME_SERVICE_API_TOKEN": "xxx" } "env_*" : { "SPECIFIC_ENV" : true } } 

完整配置檔案寫法:

{
  "apps" : [{
    // Application #1
    "name"        : "worker-app", "script" : "worker.js", "args" : ["--toto=heya coco", "-d", "1"], "watch" : true, "node_args" : "--harmony", "merge_logs" : true, "cwd" : "/this/is/a/path/to/start/script", "env": { "NODE_ENV": "development", "AWESOME_SERVICE_API_TOKEN": "xxx" }, "env_production" : { "NODE_ENV": "production" }, "env_staging" : { "NODE_ENV" : "staging", "TEST" : true } },{ // Application #2 "name" : "api-app", "script" : "api.js", "instances" : 4, "exec_mode" : "cluster_mode", "error_file" : "./examples/child-err.log", "out_file" : "./examples/child-out.log", "pid_file" : "./examples/child.pid" }] } 

通過yaml管理多個應用

process.yml:

apps:
  - script   : app.js instances: 4 exec_mode: cluster - script : worker.js watch : true env : NODE_ENV: development env_production: NODE_ENV: production 

啟動:pm2 start process.yml

環境切換

正式開發中分為不同的環境(開發環境、測試環境、生產環境),我們需要根據不同的情景來切換各種環境
pm2通過在配置檔案中通過env_xx來宣告不同環境的配置,然後在啟動應用時,通過--env引數指定執行的環境

環境配置定義,在應用中,可以通過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/" } 

啟動指定的環境:pm2 start app.js --env development

負載均衡

  pm2 start app.js -i 3 # 開啟三個程序
  pm2 start app.js -i max # 根據機器CPU核數,開啟對應數目的程序 

開機自動啟動

  1. 通過pm2 save儲存當前程序狀態。
  2. 通過pm2 startup [platform]生成開機自啟動的命令。例如:pm2 startup centeros
  3. 將步驟2生成的命令,貼上到控制檯進行,搞定。

更新

安裝最新的:npm install [email protected] -g
然後在記憶體中更新:pm2 update

參考