pm2在项目中的初次尝试

2,643 阅读4分钟

PM2简介

PM2是node进程管理工具,可以利用它来简化很多node应用管理的繁琐任务,如性能监控、自动重启、负载均衡等,而且使用非常简单。

为什么使用pm2

平时在本地进行node项目开发时一般直接使用node app.js启动服务,虽然可以用这种方式启动服务,但是这种方式只能应对一些访问量较少的形式,而且如果当node遇到错误导致线程挂掉会造成网站的无法访问,因此需要一种工具帮助node管理繁琐任务,当node进程挂掉时能够帮助机器自动重启、或者当node服务部署在多台机器时可以帮助机器实现负载均衡,因此需要使用pm2来进行node进程管理。

pm2配置文件

项目的运行环境可能会有多个,如线上的生产环境、测试的test环境、开发的dev环境及本地的local环境,使用vue进行项目构建时需要区分不同环境,因此使用pm2进行node进程管理时也需要区分不同的环境,因此pm2需要一个全局的配置文件进行项目的配置。 通过在项目根目录创建pm2.json配置文件。

{
  "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中根据不同名称来运行不同环境的服务。

 "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模式。

"fork"/"cluster"启动模式:

  • fork模式,单实例多进程,常用于多语言混编,比如php、python等,不支持端口复用,需要自己做应用的端口分配和负载均衡的子进程业务代码。

    缺点就是单服务器实例容易由于异常会导致服务器实例崩溃。

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