<<編程基礎-語言JavaScript.Nodejs.Mobile>>

<<編程基礎-語言JavaScript.Nodejs.Mobile>>
https://github.com/openstf

<pre>

pm2forever是啟動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可以做的事情主要有兩個:

  1. 反向代理,實現簡單的負載均衡: 如果有多臺服務器或者一臺服務器多個端口,可以考慮用nginx。

  2. 靜態資源緩存:把一些靜態資源(如靜態頁面,js等資源文件)放到nginx里,可以極大的提高服務的性能。

3. 自動化部署

通過shell腳本實現資源拉取、服務重啟、nginx緩存更新等操作,再配合pm2的監控功能,就初步達到了一個后端工程部署的標配了。

參考資料:

  1. pm2官網

  2. node-deploy-practice

  3. 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管理的所有進程信息,還會顯示一個進程會被啟動多少次,因為沒處理的異常。

image

$ pm2 monit 監視每個node進程的CPU和內存的使用情況

image

$ 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里。如下:

image

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 (

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 # 啟動 并 生成一個配置文件

你也可以執行用其他語言編寫的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管理的所有進程信息,還會顯示一個進程會被啟動多少次,因為沒處理的異常。

|
image

|
| |

pm2 monit

監視每個node進程的CPU和內存的使用情況。

|
image

|

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,533評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,055評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,365評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,561評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,346評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,889評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,978評論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,118評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,637評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,558評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,739評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,246評論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,980評論 3 346
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,362評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,619評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,347評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,702評論 2 370

推薦閱讀更多精彩內容