先說一些廢話 之前學習Nodejs項目的時候使用了pm2作為生產環境的進程管理工具,最近伺服器崩了需要重啟一些服務,發現有些命令記得不是特別清楚, 所以這裡寫一篇文章幫助自己記憶整理一下pm2的常用命令,後續有需要查閱一下即可~ 常用命令 進入bin目錄啟動:pm2 start www / pm2 ...
先說一些廢話
之前學習Nodejs
項目的時候使用了pm2
作為生產環境的進程管理工具,最近伺服器崩了需要重啟一些服務,發現有些命令記得不是特別清楚,
所以這裡寫一篇文章幫助自己記憶整理一下pm2
的常用命令,後續有需要查閱一下即可~
常用命令
- 進入bin目錄啟動:
pm2 start www
/pm2 start app.js
pm2 start app.js --name="fx67ll"
啟動並命名為fx67ll,沒有命名的話後續可以用id替代namepm2 start app.js --watch
當文件變化時自動重啟應用pm2 start script.sh
啟動bash腳本pm2 list
查看所有啟動的應用列表pm2 monit
顯示每個應用程式的CPU和記憶體占用情況pm2 show [app-id/app-name]
顯示指定應用程式的所有信息pm2 log
顯示應用程式的日誌信息pm2 log [app-id/app-name]
顯示指定應用程式的日誌信息pm2 flush
清空所有日誌文件pm2 stop all
停止所有應用程式pm2 stop [app-id/app-name]
停止指定應用程式pm2 restart all
重啟所有應用程式pm2 restart [app-id/app-name]
重啟指定應用程式pm2 delete all
關閉並刪除所有應用程式pm2 delete [app-id/app-name]
刪除指定的應用程式pm2 reset [app-id/app-name]
重置重啟數量pm2 startup
創建開機自啟動命令pm2 save
保存當前應用列表pm2 resurrect
重新載入保存的應用列表pm2 update
保存進程,殺死並重啟進程,一般用於更新pm2版本pm2 ecosystem
生成一個示例json配置文件- 更多命令可以參考pm2官方文檔
使用均衡負載模式(cluster mode)的相關命令
pm2 start app.js -i n
均衡負載模式(cluster mode)啟動n個app.js應用實例pm2 reload all
重啟均衡負載模式(cluster mode)下的所有應用pm2 gracefulReload all
Graceful reload all apps in cluster modepm2 scale [app-id/app-name] 10
將指定的應用程式拓展到10個實例
0秒停機重新載入(集群模式下,可以達到重啟時不停止服務)
pm2 reload app.js
重新啟動所有進程,始終保持至少一個進程在運行pm2 gracefulReload all
優雅地以集群模式重新載入所有應用程式
pm2配置文件
生成示例配置文件
// 生成一個示例json配置文件
pm2 ecosystem
// pm2初始化
pm2 init
配置項
- 基礎類
name
:進程名script
:node啟動文件的路徑cwd
:項目所在的目錄args
:通過命令行傳遞給node啟動文件的參數interpreter
:編譯器的絕對路徑(預設node)interpreter_args
:傳給編譯器的參數node_args
:傳給node的參數
- 進階類
instances
:進程數exec_mode
:進程的模式(cluster或fork)- PS: cluster模式利用node的child_process模塊孵化多個子進程,主進程監聽埠,子進程只和主進程通信,從而達到單個埠多個進程;通過輪轉方式實現負載均衡
watch
:布爾值或文件數組,允許開啟監聽文件改動重啟ignore_watch
:不監聽的文件max_memory_restart
:超過該記憶體就自動重啟env
:應用中的預設環境變數env_
:命令行中可傳入的環境變數,覆蓋預設環境變數source_map_support
:預設true,支持sourcemap文件
- 日誌類
log_date_format
:日誌時間格式error_file
:錯誤日誌存放路徑out_file
:全部日誌存放路徑combine_logs
:是否將不同id的進程日誌合併merge_logs
:同上
- 控制流
min_uptime
:pm2認為進程線上的最小時長listen_timeout
:如果app沒有發送ready信號,間隔多長時間reloadkill_timeout
:從告訴進程要關閉到強制關閉進程的間隔時間wait_ready
:是否等待進程發送ready信號max_restarts
:最大不穩定重啟次數(不穩定指的是小於1s或者小於的min_uptime
重啟)restart_delay
:進程掉線後,等待多長時間重啟autorestart
: 是否開啟自動重啟
配置項實踐中需要註意的內容
script
:若使用cluster模式,必須是啟動文件入口,不可通過npm啟動max_restarts
:指不穩定重啟,即小於1s或min_uptime
的重啟,要結合min_uptime
配置才起效listen_timeout
:當cluster模式時,這個值要大於一個進程啟動所需時間,否則reload時會造成短暫的服務不可用
配置文件示例
module.exports = {
apps : [{
name : 'API', //應用名
script : 'app.js', //應用文件位置
env: {
PM2_SERVE_PATH: ".", //靜態服務路徑
PM2_SERVE_PORT: 8080, //靜態伺服器訪問埠
NODE_ENV: 'development' //啟動預設模式
},
env_production : {
NODE_ENV: 'production' //使用production模式 pm2 start ecosystem.config.js --env production
},
instances:"max", //將應用程式分佈在所有CPU核心上,可以是整數或負數
watch:true, //監聽模式
output: './out.log', //指定日誌標準輸出文件及位置
error: './error.log', //錯誤輸出日誌文件及位置,pm2 install pm2-logrotate進行日誌文件拆分
merge_logs: true, //集群情況下,可以合併日誌
log_type:"json", //日誌類型
log_date_format: "DD-MM-YYYY", //日誌日期記錄格式
}],
deploy : {
production : {
user : 'node', //ssh 用戶
host : '212.83.163.1', //ssh 地址
ref : 'origin/master', //GIT遠程/分支
repo : '[email protected]:repo.git', //git地址
path : '/var/www/production', //伺服器文件路徑
post-deploy : 'npm install && pm2 reload ecosystem.config.js --env production' //部署後的動作
}
}
};
配置啟動命令(package.json)
# pm2-server工程的環境變數,目的是區分各個環境的應用啟動路徑
# cross-env NODE_ENV=development
# pm2的啟動命令
# pm2 start pm2-conf/ecosystem.config.js
# 傳遞給pm2的參數,-- only <name>,--env <env name>
# --only detective --env test
cross-env NODE_ENV=development pm2 start pm2-conf/ecosystem.config.js --only detective --env test
關於pm2
pm2是什麼
pm2(Process Manager 2)是具有內置負載均衡器的Node.js應用程式的生產運行時和進程管理器。
它允許您永久保持應用程式活躍,無需停機即可重新載入它們,並促進常見的Devops任務。
pm2特性
- 後臺運行:普通啟動方式:
node index.js
關閉終端就結束進程,pm2
可以後臺運行,終端關閉不影響 - 日誌管理:應用程式日誌保存在伺服器的硬碟中
~/.pm2/logs/
- 負載均衡:
pm2
可以通過創建共用同一伺服器埠的多個子進程來擴展您的應用程式,這樣做還允許您以零秒停機時間重新啟動應用程式 - 終端監控:提供實時的介面,可以在終端中監控您的應用程式並檢查應用程式運行狀況(CPU使用率,使用的記憶體,請求/分鐘等)
- SSH部署:自動部署,避免逐個在所有伺服器中進行
ssh
- 靜態服務:支持靜態伺服器功能
- 多平臺支持:適用於
Linux
(穩定)和macOS
(穩定)和Windows
(穩定) - 集成管理:對於多個進程,不同環境,可以統一配置,方便管理
pm2安裝
使用npm命令npm install pm2
即可,配置項參考npm的方式
附錄
參考資料
我是 fx67ll.com,如果您發現本文有什麼錯誤,歡迎在評論區討論指正,感謝您的閱讀!
如果您喜歡這篇文章,歡迎訪問我的 本文github倉庫地址,為我點一顆Star,Thanks~