使用pm2部署node生產環境

1、PM2是什麼

  • 是能夠用於生產環境的Nodejs的進程管理工具,而且它內置一個負載均衡。它不只能夠保證服務不會中斷一直在線,而且提供0秒reload功能,還有其餘一系列進程管理、監控功能。而且使用起來很是簡單。
  • 嗯嗯,最好的用處就是監控咱們的生產環境下的node程序運行狀態,讓它給咱們日以繼日的處於工做狀態。
  • pm2官方文檔

2、爲森麼要使用pm2

  • 原始社會的咱們開發node服務端程序通常過程:前端

    1. 編寫好node程序app.js,運行node app.js;或者寫入script使用npm運行;打開瀏覽器訪問;
    2. 好像須要修改內容,瀏覽器對修改的內容沒有顯示出來?->node app.js->再次運行;
    3. 瀏覽器突然訪問不到服務,好像出錯啦?重啓下->node app.js->再次運行;
    4. 哎呀開了好多控制檯窗口,一不當心關閉了,服務又訪問不到了,繼續打開控制檯->node app.js->再次運行;
  • 好崩潰!好像有個工具nodemon;安裝使用nodemon app.js;哇,能夠自動監聽文件修改變化自動重啓,可是關閉控制檯服務仍是會被摧毀。
  • 經過這個很經常使用的場景,咱們瞭解到要避免這些麻煩一個服務器至少須要有:後臺運行和自動重啓,這兩個能力。
  • 再來看看使用pm2可擁有的能力:node

    1. 日誌管理;兩種日誌,pm2系統日誌與管理的進程日誌,默認會把進程的控制檯輸出記錄到日誌中;
    2. 負載均衡:PM2能夠經過建立共享同一服務器端口的多個子進程來擴展您的應用程序。這樣作還容許以零秒停機時間從新啓動應用程序。
    3. 終端監控:能夠在終端中監控應用程序並檢查應用程序運行情況(CPU使用率,使用的內存,請求/分鐘等)。
    4. SSH部署:自動部署,避免逐個在全部服務器中進行ssh。
    5. 靜態服務:支持靜態服務器功能
    6. 支持開發調試模式,非後臺運行,pm2-dev start <appName>;
    7. 。。。。。太過強大!

pm2經常使用命令

  1. 啓動服務pm2 start <script_file|config_file> [options] 啓動指定應用git

    pm2 start app.js                //啓動app.js應用
    pm2 start app.js --name app    //啓動應用並設置name
    pm2 start app.sh                //腳本啓動
    
    pm2 start app.js --watch    //監聽模式啓動,當文件發生變化,自動重啓
    
    //max 表示PM2將自動檢測可用CPU的數量並運行儘量多的進程
    //max能夠自定義,若是是4核CPU,設置爲2則佔用2個
    pm2 start app.js -i max //啓用羣集模式(自動負載均衡)
    
    pm2-dev start ... // 開發模式啓動,即不啓用後臺運行
  2. 查看啓動列表pm2 list
  3. 顯示應用程序詳細信息pm2 show <appName> [options] 顯示指定應用詳情github

    pm2 show [Name]      //根據name查看
    pm2 show [ID]        //根據id查看
  4. 中止指定應用pm2 stop <appName> [options] 中止指定應用shell

    pm2 stop all               //中止全部應用
    pm2 stop [AppName]        //根據應用名中止指定應用
    pm2 stop [ID]             //根據應用id中止指定應用
  5. 重啓應用pm2 reload|restart <appName> [options] 重啓指定應用npm

    pm2 restart app.js        //同時殺死並重啓全部進程,短期內服務不可用,生成環境慎用
    pm2 reload app.js        //從新啓動全部進程,0秒重啓,始終保持至少一個進程在運行
    pm2 gracefulReload all   //以羣集模式從新加載全部應用程序
  6. 啓動靜態服務器pm2 serve ./dist 8080將目錄dist做爲靜態服務器根目錄,端口爲8080
  7. 刪除應用pm2 delete <appName> [options] 刪除指定應用;若是修改了應用配置行爲,須要先刪除應用,從新啓動後方纔會生效,如修改腳本入口文件;json

    pm2 delete all               //關閉並刪除應用
    pm2 delete [AppName]        //根據應用名關閉並刪除應用
    pm2 delete [ID]            //根據應用ID關閉並刪除應用
  8. pm2 kill 殺掉pm2管理的全部進程;
  9. pm2 logs <appName> 查看指定應用的日誌,即標準輸出和標準錯誤segmentfault

    pm2 logs            //查看全部應用日誌
    pm2 logs [Name]    //根據指定應用名查看應用日誌
    pm2 logs [ID]      //根據指定應用ID查看應用日誌
  10. pm2 monit 監控各個應用進程cpu和memory使用狀況;

PM2配置方式

  1. 命令生產默認示例配置文件pm2 ecosystempm2 init,運行默認會生成ecosystem.config.js配置文件api

    module.exports = {
      apps: [
        {
          name: 'back-Api',      //應用名
          script: './server/start.js',   //應用文件位置
          env: {
            PM2_SERVE_PATH: "./apidoc",    //靜態服務路徑
            PM2_SERVE_PORT: 8080,   //靜態服務器訪問端口
            NODE_ENV: 'development' //啓動默認模式
          },
          env_production : {
            NODE_ENV: 'production'  //使用production模式 pm2 start ecosystem.config.js --env production
          },
          instances:"max",          //將應用程序分佈在全部CPU核心上,能夠是整數或負數
          instance_var: "INSTANCE_ID",
          exec_mode: "cluster",
          watch:[
            "server",
          ],  //監聽模式,不能單純的設置爲true,易致使無限重啓,由於日誌文件在變化,須要排除對其的監聽
          merge_logs: true,         //集羣狀況下,能夠合併日誌
        }
      ],
      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'  //部署後的動做
          }
      }
    };
  2. 自定義json配置文件如:processes.json;啓動pm2 start processes.json
{
      "apps": [{
        "name": "app",  //名稱
        "script": "./", //程序入口
        "cwd": "./",           //根目錄
        "watch":[
            "views"
        ],//須要監控的目錄
        "error_file":"./logs/err.log",//錯誤輸出日誌
        "out_file":"./logs/out.log",  //日誌
        "log_date_format":"YYYY-MM-DD HH:mm Z" //日期格式
        }]
    }

pm2經常使用配置項解析

1. apps:json結構,apps是一個數組,每個數組成員就是對應一個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: 應用啓動實例個數,僅在cluster模式有效 默認爲fork;或者 max

9. min_uptime:最小運行時間,這裏設置的是60s即若是應用程序在60s內退出,pm2會認爲程序異常退出,此時觸發重啓max_restarts設置數量

10. max_restarts:設置應用程序異常退出重啓的次數,默認15次(從0開始計數)

11. cron_restart:定時啓動,解決重啓能解決的問題

12. watch:是否啓用監控模式,默認是false。若是設置成true,當應用程序變更時,pm2會自動重載。這裏也能夠設置你要監控的文件。

13. "ignore_watch": [                           // 不用監聽的文件
            "node_modules",
            "logs"
        ],
13. merge_logs:// 設置追加日誌而不是新建日誌

14. exec_interpreter:應用程序的腳本類型,這裏使用的shell,默認是nodejs

15. exec_mode:應用程序啓動模式,這裏設置的是cluster_mode(集羣),默認是fork

16. autorestart:啓用/禁用應用程序崩潰或退出時自動重啓,默認爲true, 發生異常的狀況下自動重啓

17. vizion:啓用/禁用vizion特性(版本控制)

18. "args": "", // 傳遞給腳本的參數

19. env: {
        PM2_SERVE_PATH: "./apidoc",    //靜態服務路徑
        PM2_SERVE_PORT: 8080,   //靜態服務器訪問端口
        NODE_ENV: 'development' //啓動默認模式
      },

20. env_production : {
        NODE_ENV: 'production'  //使用production模式 pm2 start ecosystem.config.js --env production
      },

pm2配合log4js處理日誌

  1. pm2啓動時一般會發現log4js記錄不到日誌信息;
  2. 決解方案,安裝pm2的pm2-intercom進程間通訊模塊
  3. 在log4js的配置文件logger.js裏添加以下命令:數組

    pm2: true, 
    pm2InstanceVar: 'INSTANCE_ID'
  4. pm2配置文件中添加"instance_var": "INSTANCE_ID", // 添加這一行 字段
  5. 發現若是沒有設置羣集模式"exec_mode": "cluster",也會記錄不到;

其餘

  1. log4js日誌配置使用詳情Koa日誌中間件封裝開發(log4js)
「積跬步、行千里」—— 持續更新中~,喜歡的話留下個贊和關注哦!
相關文章
相關標籤/搜索