內容轉自:PM2用法簡介
簡介
PM2是node進程管理工具,可以利用它來簡化很多node應用管理的繁瑣任務,如性能監控、自動重啓、負載均衡等,而且使用非常簡單。引用
全局安裝
sudo npm install pm2@latest -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核數,開啓對應數目的進程
開機自動啓動
- 通過pm2 save保存當前進程狀態。
- 通過pm2 startup [platform]生成開機自啓動的命令。例如:pm2 startup centeros
- 將步驟2生成的命令,粘貼到控制檯進行,搞定。
更新
安裝最新的:npm install pm2@latest -g
然後在內存中更新:pm2 update
參考
- 官方文檔1:http://pm2.keymetrics.io/docs/usage/pm2-doc-single-page/
- 官方文檔2:http://pm2.keymetrics.io/docs/usage/quick-start/
- PM2實用入門指南:http://www.cnblogs.com/chyingp/p/pm2-documentation.html
- nodejs高大上的部署方式-PM2: http://www.2cto.com/kf/201501/367718.html