摘要:一是什么是可以用于生產(chǎn)環(huán)境的的進程管理工具,并且它內(nèi)置一個負載均衡。嗯嗯,最好的用處就是監(jiān)控我們的生產(chǎn)環(huán)境下的程序運行狀態(tài),讓它給我們?nèi)找岳^日的處于工作狀態(tài)。部署自動部署,避免逐個在所有服務器中進行。
一、PM2是什么
是可以用于生產(chǎn)環(huán)境的Nodejs的進程管理工具,并且它內(nèi)置一個負載均衡。它不僅可以保證服務不會中斷一直在線,并且提供0秒reload功能,還有其他一系列進程管理、監(jiān)控功能。并且使用起來非常簡單。
嗯嗯,最好的用處就是監(jiān)控我們的生產(chǎn)環(huán)境下的node程序運行狀態(tài),讓它給我們?nèi)找岳^日的處于工作狀態(tài)。
pm2官方文檔
二、為森么要使用pm2
原始社會的我們開發(fā)node服務端程序一般過程:
編寫好node程序app.js,運行node app.js;或者寫入script使用npm運行;打開瀏覽器訪問;
好像需要修改內(nèi)容,瀏覽器對修改的內(nèi)容沒有顯示出來?->node app.js->再次運行;
瀏覽器忽然訪問不到服務,好像出錯啦?重啟下->node app.js->再次運行;
哎呀開了好多控制臺窗口,一不小心關(guān)閉了,服務又訪問不到了,繼續(xù)打開控制臺->node app.js->再次運行;
好崩潰!好像有個工具nodemon;安裝使用nodemon app.js;哇,可以自動監(jiān)聽文件修改變化自動重啟,但是關(guān)閉控制臺服務還是會被摧毀。
通過這個很常用的場景,我們了解到要避免這些麻煩一個服務器至少需要有:后臺運行和自動重啟,這兩個能力。
再來看看使用pm2可擁有的能力:
日志管理;兩種日志,pm2系統(tǒng)日志與管理的進程日志,默認會把進程的控制臺輸出記錄到日志中;
負載均衡:PM2可以通過創(chuàng)建共享同一服務器端口的多個子進程來擴展您的應用程序。這樣做還允許以零秒停機時間重新啟動應用程序。
終端監(jiān)控:可以在終端中監(jiān)控應用程序并檢查應用程序運行狀況(CPU使用率,使用的內(nèi)存,請求/分鐘等)。
SSH部署:自動部署,避免逐個在所有服務器中進行ssh。
靜態(tài)服務:支持靜態(tài)服務器功能
支持開發(fā)調(diào)試模式,非后臺運行,pm2-dev start
。。。。。太過強大!
pm2常用命令
啟動服務pm2 start
pm2 start app.js //啟動app.js應用 pm2 start app.js --name app //啟動應用并設置name pm2 start app.sh //腳本啟動 pm2 start app.js --watch //監(jiān)聽模式啟動,當文件發(fā)生變化,自動重啟 //max 表示PM2將自動檢測可用CPU的數(shù)量并運行盡可能多的進程 //max可以自定義,如果是4核CPU,設置為2則占用2個 pm2 start app.js -i max //啟用群集模式(自動負載均衡) pm2-dev start ... // 開發(fā)模式啟動,即不啟用后臺運行
查看啟動列表pm2 list
顯示應用程序詳細信息pm2 show
pm2 show [Name] //根據(jù)name查看 pm2 show [ID] //根據(jù)id查看
停止指定應用pm2 stop
pm2 stop all //停止所有應用 pm2 stop [AppName] //根據(jù)應用名停止指定應用 pm2 stop [ID] //根據(jù)應用id停止指定應用
重啟應用pm2 reload|restart
pm2 restart app.js //同時殺死并重啟所有進程,短時間內(nèi)服務不可用,生成環(huán)境慎用 pm2 reload app.js //重新啟動所有進程,0秒重啟,始終保持至少一個進程在運行 pm2 gracefulReload all //以群集模式重新加載所有應用程序
啟動靜態(tài)服務器pm2 serve ./dist 8080將目錄dist作為靜態(tài)服務器根目錄,端口為8080
刪除應用pm2 delete
pm2 delete all //關(guān)閉并刪除應用 pm2 delete [AppName] //根據(jù)應用名關(guān)閉并刪除應用 pm2 delete [ID] //根據(jù)應用ID關(guān)閉并刪除應用
pm2 kill 殺掉pm2管理的所有進程;
pm2 logs
pm2 logs //查看所有應用日志 pm2 logs [Name] //根據(jù)指定應用名查看應用日志 pm2 logs [ID] //根據(jù)指定應用ID查看應用日志
pm2 monit 監(jiān)控各個應用進程cpu和memory使用情況;
PM2配置方式
命令生產(chǎn)默認示例配置文件pm2 ecosystem或pm2 init,運行默認會生成ecosystem.config.js配置文件
module.exports = { apps: [ { name: "back-Api", //應用名 script: "./server/start.js", //應用文件位置 env: { PM2_SERVE_PATH: "./apidoc", //靜態(tài)服務路徑 PM2_SERVE_PORT: 8080, //靜態(tài)服務器訪問端口 NODE_ENV: "development" //啟動默認模式 }, env_production : { NODE_ENV: "production" //使用production模式 pm2 start ecosystem.config.js --env production }, instances:"max", //將應用程序分布在所有CPU核心上,可以是整數(shù)或負數(shù) instance_var: "INSTANCE_ID", exec_mode: "cluster", watch:[ "server", ], //監(jiān)聽模式,不能單純的設置為true,易導致無限重啟,因為日志文件在變化,需要排除對其的監(jiān)聽 merge_logs: true, //集群情況下,可以合并日志 } ], 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" //部署后的動作 } } };
自定義json配置文件如:processes.json;啟動pm2 start processes.json
{ "apps": [{ "name": "app", //名稱 "script": "./", //程序入口 "cwd": "./", //根目錄 "watch":[ "views" ],//需要監(jiān)控的目錄 "error_file":"./logs/err.log",//錯誤輸出日志 "out_file":"./logs/out.log", //日志 "log_date_format":"YYYY-MM-DD HH:mm Z" //日期格式 }] }pm2常用配置項解析
1. apps:json結(jié)構(gòu),apps是一個數(shù)組,每一個數(shù)組成員就是對應一個pm2中運行的應用 2. name:應用程序名稱"app" 3. cwd:應用程序所在的目錄"./" 4. script:應用程序的腳本路徑"./" 5. log_date_format: 日志文件名輸出日期格式"YYYY-MM-DD HH:mm Z" 6. error_file:自定義應用程序的錯誤日志文件"./logs/app-err.log", 7. out_file:自定義應用程序日志文件"./logs/app-out.log" 8. instances: 應用啟動實例個數(shù),僅在cluster模式有效 默認為fork;或者 max 9. min_uptime:最小運行時間,這里設置的是60s即如果應用程序在60s內(nèi)退出,pm2會認為程序異常退出,此時觸發(fā)重啟max_restarts設置數(shù)量 10. max_restarts:設置應用程序異常退出重啟的次數(shù),默認15次(從0開始計數(shù)) 11. cron_restart:定時啟動,解決重啟能解決的問題 12. watch:是否啟用監(jiān)控模式,默認是false。如果設置成true,當應用程序變動時,pm2會自動重載。這里也可以設置你要監(jiān)控的文件。 13. "ignore_watch": [ // 不用監(jiān)聽的文件 "node_modules", "logs" ], 13. merge_logs:// 設置追加日志而不是新建日志 14. exec_interpreter:應用程序的腳本類型,這里使用的shell,默認是nodejs 15. exec_mode:應用程序啟動模式,這里設置的是cluster_mode(集群),默認是fork 16. autorestart:啟用/禁用應用程序崩潰或退出時自動重啟,默認為true, 發(fā)生異常的情況下自動重啟 17. vizion:啟用/禁用vizion特性(版本控制) 18. "args": "", // 傳遞給腳本的參數(shù) 19. env: { PM2_SERVE_PATH: "./apidoc", //靜態(tài)服務路徑 PM2_SERVE_PORT: 8080, //靜態(tài)服務器訪問端口 NODE_ENV: "development" //啟動默認模式 }, 20. env_production : { NODE_ENV: "production" //使用production模式 pm2 start ecosystem.config.js --env production },pm2配合log4js處理日志
pm2啟動時通常會發(fā)現(xiàn)log4js記錄不到日志信息;
決解方案,安裝pm2的pm2-intercom進程間通信模塊
在log4js的配置文件logger.js里添加如下命令:
pm2: true, pm2InstanceVar: "INSTANCE_ID"
pm2配置文件中添加"instance_var": "INSTANCE_ID", // 添加這一行 字段
發(fā)現(xiàn)如果沒有設置群集模式"exec_mode": "cluster",也會記錄不到;
其他log4js日志配置使用詳情Koa日志中間件封裝開發(fā)(log4js)
“積跬步、行千里”—— 持續(xù)更新中~,喜歡的話留下個贊和關(guān)注哦!
往期經(jīng)典好文:
團隊合作必備的Git操作
談談Js前端模塊化規(guī)范
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/109040.html
摘要:就在幾周前,我正在和一個朋友談話,他不經(jīng)意間提到,你永遠都不會在生產(chǎn)中直接使用來運行程序。我強烈點頭,表示我也不會在生產(chǎn)中直接運行,原因可能每個人都知道。首先,讓我們弄清楚永遠不要在生產(chǎn)中直接通過運行程序的說法。 原文地址:You should never ever run directly against Node.js in production. Maybe. 原文作者:Burke ...
摘要:于是著手將應用遷移到阿里云的上去。環(huán)境介紹本地,應用采用的技術(shù)遠端服務器阿里云核內(nèi)存,,系統(tǒng)為賬戶名系統(tǒng)架構(gòu)服務器部署的應用,并在端口進行監(jiān)聽。通過瀏覽器打開可以看到部署的應用可以訪問了。 背景 前一段時間,是通過百度云的BAE部署自己的Node應用的,不過隨著應用的不斷開發(fā),BAE的限制不斷制約了應用的使用。于是著手將應用遷移到阿里云的ECS上去。本文即是介紹了如何在ECS上搭建No...
摘要:基于構(gòu)建的服務器腳手架這是一個基于的輕量級腳手架,支持支持使用編寫。腳手架可以根據(jù)不同的環(huán)境配置不同的信息運行價值,支持開發(fā),測試,生產(chǎn)環(huán)境的不同參數(shù)配置。 #基于webpack構(gòu)建的 Koa2 restful API 服務器腳手架 這是一個基于 Koa2 的輕量級 RESTful API Server 腳手架,支持 ES6, 支持使用TypeScript編寫。 GIT地址:https...
摘要:使用背景當我們需要將項目部署到遠程線上服務器時傳統(tǒng)的方法可能就是將本地代碼通過等方式上傳到服務器然后通過登入到服務器,配置好環(huán)境手動啟動應用。 使用背景 當我們需要將項目部署到遠程線上服務器時;傳統(tǒng)的方法可能就是: 將本地代碼通過ssh、ftp等方式上傳到服務器; 然后通過ssh登入到服務器,配置好環(huán)境; 手動啟動應用。 太過手動化,麻煩,操作繁瑣。 現(xiàn)代自動化部署 ...
閱讀 662·2021-11-24 09:39
閱讀 3507·2019-08-30 15:53
閱讀 2545·2019-08-30 15:44
閱讀 3263·2019-08-30 12:54
閱讀 2234·2019-08-29 12:23
閱讀 3330·2019-08-26 14:05
閱讀 2131·2019-08-26 13:36
閱讀 3463·2019-08-26 13:33