<<編程基礎-語言JavaScript.Nodejs.Mobile>>
https://github.com/openstf
<pre>
pm2和forever是啟動Nodejs服務常用到的兩個工具。使用這兩個指令可以使node服務在后臺運行(類似于linux的nohup),另外它們可以在服務因異?;蚱渌虮粴⒌艉筮M行自動重啟。 由于Node的單線程特征,自動重啟能很大程度上的提高它的健壯性。
本文不對比兩者工具優劣,只是結合自己的使用,簡要介紹如何在工程部署時更好的使用pm2。
基本指令
npm install pm2 -g
: 全局安裝。
pm2 start app.js
: 啟動服務,入口文件是app.js。
pm2 start app.js -i [n] --name [name]
: 啟動n個進程,名字命名為name。
npm restart [name or id]
: 重啟服務。
npm reload [name or id]
: 和rastart功能相同,但是可以實現0s的無縫銜接;如果有nginx的使用經驗,可以對比nginx reload指令。
pm2 start app.js --max_memory_restart 1024M
: 當內存超過1024M時自動重啟。 如果工程中有比較棘手的內存泄露問題,這個算是一個折中方案。
pm2 monit
: 對服務進行監控。
更多的指令可以參考 PM2 介紹
高級用法
pm2支持配置文件啟動:
pm2 ecosystem
: 生成配置文件ecosystem.json
pm2 startOrRestart /file/path/ecosystem.json
: 通過配置文件啟動服務
如下是我開發時ecosystem.json的內容:
{
/**
* Application configuration section
* http://pm2.keymetrics.io/docs/usage/application-declaration/
* 多個服務,依次放到apps對應的數組里
*/
apps : [
// First application
{
name : "nova",
max_memory_restart: "300M",
script : "/root/nova/app.js",
out_file : "/logs/nova_out.log",
error_file : "/logs/nova_error.log",
instances : 4,
exec_mode : "cluster",
env: {
NODE_ENV: "production"
}
}
]
}
上述采用cluster模式啟動了4個服務進程;如果服務占用的內存超過300M,會自動進行重啟。
監控工具
pm2的監控功能是其一大特色,它提供的監控服務Keymetrics monitoring 很酷炫,感興趣的可以配置玩一下。
一些思考
1. 服務進程數
至于要啟動幾個進程,可以通過服務器的內核數進行確定,幾個內核就啟動幾個服務。指令如下:
# 查看物理CPU個數
cat /proc/cpuinfo| grep "physical id" | sort| uniq | wc -l
# 查看每個物理CPU中core的個數(即核數)
cat /proc/cpuinfo| grep "cpu cores"| uniq
# 查看邏輯CPU的個數
cat /proc/cpuinfo| grep "processor"| wc -l
當然可以啟動多個端口,一個端口號對應一個服務,這樣的話就需要nignx來做負載均衡了。
2. 是否需要nginx
nginx可以做的事情主要有兩個:
反向代理,實現簡單的負載均衡: 如果有多臺服務器或者一臺服務器多個端口,可以考慮用nginx。
靜態資源緩存:把一些靜態資源(如靜態頁面,js等資源文件)放到nginx里,可以極大的提高服務的性能。
3. 自動化部署
通過shell腳本實現資源拉取、服務重啟、nginx緩存更新等操作,再配合pm2的監控功能,就初步達到了一個后端工程部署的標配了。
參考資料:
pm2是非常優秀工具,它提供對基于node.js的項目運行托管服務。它基于命令行界面,提供很多特性: 內置的負載均衡器等等,下面我們就一起來看看吧。
一、簡介
pm2是一個帶有負載均衡功能的應用進程管理器,類似有Supervisor,forever。
二、安裝
Linux Binaries下載地址:https://nodejs.org/dist
cd oneinstack/src
wget https://nodejs.org/dist/v4.2.4/node-v4.2.4-linux-x64.tar.gz
tar xzf node-v4.2.4-linux-x64.tar.gz
cp node-v4.2.4-linux-x64/bin/node /usr/local/bin/
cp -R node-v4.2.4-linux-x64/lib/node_modules /usr/local/lib/
ln -s /usr/local/lib/node_modules/npm/bin/npm-cli.js /usr/local/bin/npm
npm install pm2@latest -g #安裝最新版本pm2模塊
PS: 如果你的主機無法連接公網,先找到能連公網的主機安裝上面的方法安裝pm2,然后拷貝到你要安裝的主機??截惾缦履夸洠?br>
/usr/local/bin/node
/usr/local/lib/node_modules
再創建相關軟連接
三、PM2常用命令
假設你現在已經寫好了一個app.js的文件,需要啟動,你可以使用pm2進行管理
1. 啟動
pm2 start app.js
pm2 start app.js --name my-api #my-api為PM2進程名稱
pm2 start app.js -i 0 #根據CPU核數啟動進程個數
pm2 start app.js --watch #實時監控app.js的方式啟動,當app.js文件有變動時,pm2會自動reload
2. 查看進程
pm2 list
pm2 show 0 或者 # pm2 info 0 #查看進程詳細信息,0為PM2進程id
3. 監控
pm2 monit
4. 停止
pm2 stop all #停止PM2列表中所有的進程
pm2 stop 0 #停止PM2列表中進程為0的進程
5. 重載
pm2 reload all #重載PM2列表中所有的進程
pm2 reload 0 #重載PM2列表中進程為0的進程
6. 重啟
pm2 restart all #重啟PM2列表中所有的進程
pm2 restart 0 #重啟PM2列表中進程為0的進程
7. 刪除PM2進程
pm2 delete 0 #刪除PM2列表中進程為0的進程
pm2 delete all #刪除PM2列表中所有的進程
8. 日志操作
pm2 logs [--raw] #Display all processes logs in streaming
pm2 flush #Empty all log file
pm2 reloadLogs #Reload all logs
9. 升級PM2
npm install pm2@lastest -g #安裝最新的PM2版本
pm2 updatePM2 #升級pm2
10. 更多命令參數請查看幫助
pm2 --help
四、PM2目錄結構
默認的目錄是:當前用于的家目錄下的.pm2目錄(此目錄可以自定義,請參考:五、自定義啟動文件),詳細信息如下:
$HOME/.pm2 #will contain all PM2 related files
$HOME/.pm2/logs #will contain all applications logs
$HOME/.pm2/pids #will contain all applications pids
$HOME/.pm2/pm2.log #PM2 logs
$HOME/.pm2/pm2.pid #PM2 pid
$HOME/.pm2/rpc.sock #Socket file for remote commands
$HOME/.pm2/pub.sock #Socket file for publishable events
$HOME/.pm2/conf.js #PM2 Configuration
五、自定義啟動文件
創建一個test.json的示例文件,格式如下:
{
"apps":
{
"name": "test",
"cwd": "/data/wwwroot/nodejs",
"script": "./test.sh",
"exec_interpreter": "bash",
"min_uptime": "60s",
"max_restarts": 30,
"exec_mode" : "cluster_mode",
"error_file" : "./test-err.log",
"out_file": "./test-out.log",
"pid_file": "./test.pid"
"watch": false
}
}
說明:
apps:json結構,apps是一個數組,每一個數組成員就是對應一個pm2中運行的應用
name:應用程序的名稱
cwd:應用程序所在的目錄
script:應用程序的腳本路徑
exec_interpreter:應用程序的腳本類型,這里使用的shell,默認是nodejs
min_uptime:最小運行時間,這里設置的是60s即如果應用程序在60s內退出,pm2會認為程序異常退出,此時觸發重啟max_restarts設置數量
max_restarts:設置應用程序異常退出重啟的次數,默認15次(從0開始計數)
exec_mode:應用程序啟動模式,這里設置的是cluster_mode(集群),默認是fork
error_file:自定義應用程序的錯誤日志文件
out_file:自定義應用程序日志文件
pid_file:自定義應用程序的pid文件
watch:是否啟用監控模式,默認是false。如果設置成true,當應用程序變動時,pm2會自動重載。這里也可以設置你要監控的文件。
詳細參數列表:見附件八
六、實例
已上面的test.json為例
cat > /data/wwwroot/nodejs/test.sh << EOF
!/bin/bash
while :
do
echo "Test" >> 1.log
sleep 5
done
EOF
chmod +x test.sh #添加執行權限
pm2 start test.json #啟動,如下圖:
[圖片上傳失敗...(image-291475-1511349583307)]
pm2 list #查看pm2進程,如下圖:
[圖片上傳失敗...(image-1f3f2c-1511349583307)]
七、備注
其他可參數見官網:http://pm2.keymetrics.io
====================================================================================================================
安裝:npm install -g pm2
啟動程序:pm2 start <app_name|id|all>
列舉進程:pm2 list
退出程序:pm2 stop <app_name|id|all>
重起應用:pm2 restart
程序信息:pm2 describe id|all
監控:pm2 monit
實時集中log處理: pm2 logs
API:pm2 web (端口:9615 )
<pre>
使用PM2來部署nodejs項目。
如果直接通過node app來啟動,如果報錯了可能直接停在整個運行,supervisor感覺只是拿來用作開發環境的。再網上找到pm2.目前似乎最常見的線上部署nodejs項目的有forever,pm2這兩種。
使用場合:
supervisor是開發環境用。
forever管理多個站點,每個站點訪問量不大,不需要監控。
pm2 網站訪問量比較大,需要完整的監控界面。
PM2的主要特性:
內建負載均衡(使用Node cluster 集群模塊)
后臺運行
0秒停機重載,我理解大概意思是維護升級的時候不需要停機.
具有Ubuntu和CentOS 的啟動腳本
停止不穩定的進程(避免無限循環)
控制臺檢測
提供 HTTP API
遠程控制和實時的接口API ( Nodejs 模塊,允許和PM2進程管理器交互 )
安裝
npm install -g pm2
用法
$ npm install -g pm2
命令行全局安裝pm2
$ pm2 start app.js
啟動app項目
$ pm2 list
列出由pm2管理的所有進程信息,還會顯示一個進程會被啟動多少次,因為沒處理的異常。
$ pm2 monit
監視每個node進程的CPU和內存的使用情況
$ pm2 logs
顯示所有進程日志
$ pm2 stop all
停止所有進程
$ pm2 restart all
重啟所有進程
$ pm2 reload all
0秒停機重載進程 (用于 NETWORKED 進程)
$ pm2 stop 0
停止指定的進程
$ pm2 restart 0
重啟指定的進程
$ pm2 startup
產生 init 腳本 保持進程活著
$ pm2 web
運行健壯的 computer API endpoint (http://localhost:9615)
$ pm2 delete 0
殺死指定的進程
$ pm2 delete all
殺死全部進程
運行進程的不同方式:
$ pm2 start app.js -i max
根據有效CPU數目啟動最大進程數目
$ pm2 start app.js -i 3
啟動3個進程
$ pm2 start app.js -x
用fork模式啟動 app.js 而不是使用 cluster
$ pm2 start app.js -x -- -a 23
用fork模式啟動 app.js 并且傳遞參數 (-a 23)
$ pm2 start app.js --name serverone
啟動一個進程并把它命名為 serverone
$ pm2 stop serverone
停止 serverone 進程
$ pm2 start app.json
啟動進程, 在 app.json里設置選項
$ pm2 start app.js -i max -- -a 23
在--之后給 app.js 傳遞參數
$ pm2 start app.js -i max -e err.log -o out.log
啟動 并 生成一個配置文件
配置pm2啟動文件
在項目根目錄添加一個processes.json:
內容如下:
{
"apps": [
{
"name": "mywork",
"cwd": "/srv/node-app/current",
"script": "bin/www",
"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,
"min_uptime": "200s",
"max_restarts": 10,
"max_memory_restart": "1M",
"cron_restart": "1 0 * * *",
"watch": false,
"merge_logs": true,
"exec_interpreter": "node",
"exec_mode": "fork",
"autorestart": false,
"vizion": false
}
]
}
說明:
apps:json結構,apps是一個數組,每一個數組成員就是對應一個pm2中運行的應用
name:應用程序名稱
cwd:應用程序所在的目錄
script:應用程序的腳本路徑
log_date_format:
error_file:自定義應用程序的錯誤日志文件
out_file:自定義應用程序日志文件
pid_file:自定義應用程序的pid文件
instances:
min_uptime:最小運行時間,這里設置的是60s即如果應用程序在60s內退出,pm2會認為程序異常退出,此時觸發重啟max_restarts設置數量
max_restarts:設置應用程序異常退出重啟的次數,默認15次(從0開始計數)
cron_restart:定時啟動,解決重啟能解決的問題
watch:是否啟用監控模式,默認是false。如果設置成true,當應用程序變動時,pm2會自動重載。這里也可以設置你要監控的文件。
merge_logs:
exec_interpreter:應用程序的腳本類型,這里使用的shell,默認是nodejs
exec_mode:應用程序啟動模式,這里設置的是cluster_mode(集群),默認是fork
autorestart:啟用/禁用應用程序崩潰或退出時自動重啟
vizion:啟用/禁用vizion特性(版本控制)
可以通過pm2 start processes.json
來啟動。
也可以把命令寫在package.json里。如下:
pm2 是一個帶有負載均衡功能的Node應用的進程管理器.
當你要把你的獨立代碼利用全部的服務器上的所有CPU,并保證進程永遠都活著,0秒的重載, PM2是完美的。它非常適合IaaS結構,但不要把它用于PaaS方案(隨后將開發Paas的解決方案).
備注:SaaS、PaaS和IaaS是云服務模式。
SaaS 軟件即服務,例如Google的 Gmail 郵箱服務.面向應用型用戶.
PaaS 平臺即服務.例如Google的GAE,面向開發型用戶
IaaS 基礎架構即服務,例如亞馬遜的AWS,IaaS對于不知道新推出的應用程序/網站會有多成功的創業公司來說非常有用
請參考
云服務模式:SaaS、PaaS和IaaS,哪一種適合你?
主要特性:
內建負載均衡(使用Node cluster 集群模塊)
后臺運行
0秒停機重載,我理解大概意思是維護升級的時候不需要停機.
具有Ubuntu和CentOS 的啟動腳本
停止不穩定的進程(避免無限循環)
控制臺檢測
提供 HTTP API
遠程控制和實時的接口API ( Nodejs 模塊,允許和PM2進程管理器交互 )
測試過Nodejs v0.11 v0.10 v0.8版本,兼容CoffeeScript,基于Linux 和MacOS.
安裝
npm install -g pm2
用法
$ npm install pm2 -g # 命令行安裝 pm2
$ pm2 start app.js -i 4 #后臺運行pm2,啟動4個app.js
# 也可以把'max' 參數傳遞給 start
# 正確的進程數目依賴于Cpu的核心數目
$ pm2 start app.js --name my-api # 命名進程
$ pm2 list # 顯示所有進程狀態
$ pm2 monit # 監視所有進程
$ pm2 logs # 顯示所有進程日志
$ pm2 stop all # 停止所有進程
$ pm2 restart all # 重啟所有進程
$ pm2 reload all # 0秒停機重載進程 (用于 NETWORKED 進程)
$ pm2 stop 0 # 停止指定的進程
$ pm2 restart 0 # 重啟指定的進程
$ pm2 startup # 產生 init 腳本 保持進程活著
$ pm2 web # 運行健壯的 computer API endpoint (
)
$ pm2 delete 0 # 殺死指定的進程
$ pm2 delete all # 殺死全部進程
運行進程的不同方式:
$ pm2 start app.js -i max # 根據有效CPU數目啟動最大進程數目
$ pm2 start app.js -i 3 # 啟動3個進程
$ pm2 start app.js -x #用fork模式啟動 app.js 而不是使用 cluster
$ pm2 start app.js -x -- -a 23 # 用fork模式啟動 app.js 并且傳遞參數 (-a 23)
$ pm2 start app.js --name serverone # 啟動一個進程并把它命名為 serverone
$ pm2 stop serverone # 停止 serverone 進程
$ pm2 start app.json # 啟動進程, 在 app.json里設置選項
$ pm2 start app.js -i max -- -a 23 #在--之后給 app.js 傳遞參數
$ pm2 start app.js -i max -e err.log -o out.log # 啟動 并 生成一個配置文件
你也可以執行用其他語言編寫的app ( fork 模式):
$ pm2 start my-bash-script.sh -x --interpreter bash
$ pm2 start my-python-script.py -x --interpreter python
0秒停機重載:
這項功能允許你重新載入代碼而不用失去請求連接。
注意:
僅能用于web應用
運行于Node 0.11.x版本
運行于 cluster 模式(默認模式)
$ pm2 reload all
CoffeeScript:
$ pm2 start my_app.coffee #這就是全部
PM2準備好為產品級服務了嗎?
只需在你的服務器上測試
$ git clone
https://github.com/Unitech/pm2.git
$ cd pm2
$ npm install # 或者 npm install --dev ,如果devDependencies 沒有安裝
$ npm test
pm2 list
列出由pm2管理的所有進程信息,還會顯示一個進程會被啟動多少次,因為沒處理的異常。
||
| |
pm2 monit
監視每個node進程的CPU和內存的使用情況。
||