先説一些廢話
之前學習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 allGraceful 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 : 'git@github.com: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的方式
附錄
參考資料
- 參考教程 ———— pm2 官方教程
- 參考文檔 ———— PM2 常用命令
- 參考文檔 ———— pm2介紹及使用手冊
- 參考文檔 ———— pm2入坑詳解
我是 fx67ll.com,如果您發現本文有什麼錯誤,歡迎在評論區討論指正,感謝您的閲讀!
如果您喜歡這篇文章,歡迎訪問我的 本文github倉庫地址,為我點一顆Star,Thanks~ :)
轉發請註明參考文章地址,非常感謝!!!