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命令来了解

相关文章
相关标签/搜索