pm2在項目中的初次嘗試

PM2簡介

PM2是node進程管理工具,能夠利用它來簡化不少node應用管理的繁瑣任務,如性能監控、自動重啓、負載均衡等,並且使用很是簡單。php

爲何使用pm2

平時在本地進行node項目開發時通常直接使用node app.js啓動服務,雖然能夠用這種方式啓動服務,可是這種方式只能應對一些訪問量較少的形式,並且若是當node遇到錯誤致使線程掛掉會形成網站的沒法訪問,所以須要一種工具幫助node管理繁瑣任務,當node進程掛掉時可以幫助機器自動重啓、或者當node服務部署在多臺機器時能夠幫助機器實現負載均衡,所以須要使用pm2來進行node進程管理。vue

pm2配置文件

項目的運行環境可能會有多個,如線上的生產環境、測試的test環境、開發的dev環境及本地的local環境,使用vue進行項目構建時須要區分不一樣環境,所以使用pm2進行node進程管理時也須要區分不一樣的環境,所以pm2須要一個全局的配置文件進行項目的配置。 經過在項目根目錄建立pm2.json配置文件。node

{
  "apps": [
    // dev環境配置
    {
      "name": "YUANNODE-DEV-SERVER",
      "cwd": "./dist",
      "script": "app.js",
      "watch": false,
      "ignore_watch": ["node_modules", "build", "logs"],
      "log_date_format": "YYYY-MM-DD HH:mm Z",
      "out_file": "/data/logs/yuan-node/out.log", // 日誌輸出
      "error_file": "/data/logs/yuan-node/error.log", // 錯誤日誌
      "max_memory_restart": "2G", // 超過多大內存自動重啓,僅防止內存泄露有意義,須要根據本身的業務設置
      "env": {
        "NODE_ENV": "dev"
      },
      "exec_mode": "cluster", // 開啓多線程模式(集羣),用於負載均衡
      "instances": "max", // 啓用多少個實例,可用於負載均衡
      "autorestart": true // 程序崩潰後自動重啓
    },
    // 生產環境pm2配置
    {
      "name": "YUANNODE-PROD-SERVER",
      "cwd": "./dist",
      "script": "app.js",
      "watch": false,
      "ignore_watch": ["node_modules", "build", "logs"],
      "log_date_format": "YYYY-MM-DD HH:mm Z",
      "out_file": "/data/logs/yuan-node/out.log", // 日誌輸出
      "error_file": "/data/logs/yuan-node/error.log", // 錯誤日誌
      "max_memory_restart": "2G", // 超過多大內存自動重啓,僅防止內存泄露有意義,須要根據本身的業務設置
      "env": {
        "NODE_ENV": "prod"
      },
      "exec_mode": "cluster", // 開啓多線程模式,用於負載均衡
      "instances": "max", // 啓用多少個實例,可用於負載均衡
      "autorestart": true // 程序崩潰後自動重啓
    }
  ]
}
複製代碼

經過配置不一樣環境的env來區分不一樣環境,爲了更好區分環境能夠設置不一樣name,在package.json中根據不一樣名稱來運行不一樣環境的服務。python

"pm2-dev": "pm2 start pm2.json --only YUANNODE-DEV-SERVER --watch",
 "pm2-prod": "pm2 start pm2.json --only YUANNODE-PROD-SERVER --watch",
複製代碼

經過配置pm2能夠設置不一樣環境下log存放的位置,能夠配置pm2啓動模式,經過設置"exec_mode": "fork"/"cluster"設置不一樣的pm2啓動模式,pm2默認爲fork模式。nginx

"fork"/"cluster"啓動模式:web

  • fork模式,單實例多進程,經常使用於多語言混編,好比php、python等,不支持端口複用,須要本身作應用的端口分配和負載均衡的子進程業務代碼。json

    缺點就是單服務器實例容易因爲異常會致使服務器實例崩潰。bash

  • cluster模式,多實例多進程,可是隻支持node,端口能夠複用,不須要額外的端口配置,0代碼實現負載均衡。 優勢就是因爲多實例機制,能夠保證服務器的容錯性,就算出現異常也不會使多個服務器實例同時崩潰。服務器

pm2監控

部署到線上的服務通常須要監控系統,能夠時刻幫助開發者瞭解服務運行狀況,pm2提供了pm2 Monitoring進行pm2監控,或者使用pm2-web進行監控,若是隻是進行常見的服務器異常重啓或者過載等監控能夠直接使用pm2 monit進行監控,因爲不一樣環境須要監控的服務不一樣,所以也須要區分監控的命令。多線程

"pm2-monitor-dev": "pm2 link -- -- YUANNODE-DEV-SERVER",
    "pm2-monitor-prod": "pm2 link -- -- YUANNODE-PROD-SERVER"
複製代碼

pm2在nginx上的配置

經過pm2啓動node,再使用nginx作反向代理(通常運維能夠幫忙配置)

upstream my_nodejs_upstream {
    server 127.0.0.1:3001;
}
 
server {
    listen 80;
    server_name my_nodejs_server;
    root /home/www/project_root;
    
    location / {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_set_header X-NginX-Proxy true;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_max_temp_file_size 0;
        proxy_pass http://my_nodejs_upstream/;
        proxy_redirect off;
        proxy_read_timeout 240s;
    }
}
複製代碼

pm2命令-CLI參考

pm2有不少使用命令,能夠經過查看pm2命令來了解

相關文章
相關標籤/搜索