pm2-代理服务

Posted by hdj on April 29, 2023

前言

有时候我们会使用守护进程保护我们的项目一直启动,可以使用pm2做进程守护。

发布程序时使用forever和PM2的区别

forever vs pm2

通过上图可以很清楚的看到pm2支持的功能更多,比如集群(Clustering)日志(Log aggregation )终端监控(Terminal monitoring )JSON configuration(JSON配置)

配置和集群配合使用

参考来源使用PM2方便开启node集群模式

要点:

Node执行JS代码运行在V8上是单线程,node并非是单线程架构

Node.js是一个运行在名叫V8的JavaScript引擎的平台系统。V8本身是单线程运行的,并没有充分利用多核系统能力。 (注:Node执行JS代码运行在V8上,是单线程,但并非真正的单线程架构)

Node.js的集群模式

Node.js提供了集群模块,简单讲就是复制一些可以共享TCP连接的工作线程。

工作原理

集群模块会创建一个master主线程,然后复制任意多份程序并启动,这叫做工作线程。 工作线程通过 IPC 频道进行通信并且使用了 Round-robin algorithm 算法进行工作调度以此实现负载均衡。 Round-robin调度策略主要是master主线程负责接收所有的连接并派发给下面的各个工作线程。

如何使用

下面是一个很常见的例子:

var cluster = require('cluster');  
var http    = require('http');  
var os      = require('os');

var numCPUs = os.cpus().length;

if (cluster.isMaster) {  
  // Master:
  // Let's fork as many workers as you have CPU cores

  for (var i = 0; i < numCPUs; ++i) {
    cluster.fork();
  }
} else {
  // Worker:
  // Let's spawn a HTTP server
  // (Workers can share any TCP connection.
  //  In this case its a HTTP server)

  http.createServer(function(req, res) {
    res.writeHead(200);
    res.end("hello world");
  }).listen(8080);
}

你可以不受CPU核心限制的创建任意多个工作线程。 使用原生方法有些麻烦而且你还需要处理如果某个工作线程挂掉了等额外的逻辑。 (注:通过fork()复制的进程都是独立的进程,有着全新的V8实例)

PM2的方式
  1. PM2内置了处理上述的逻辑,你不用再写这么多繁琐的代码了。 只需这样一行:

    $ pm2 start app.js -i 4

    -i 表示实例程序的个数。就是工作线程。

    如果i为0表示,会根据当前CPU核心数创建

  2. 保持你的程序不中断运行, 如果有任何工作线程意外挂掉了,PM2会立即重启他们,当前你可以在任何时候重启,只需:实时调整集群数量

    你可以使用命令 pm2 scale 调整你的线程数量,

    如 pm2 scale app +3 会在当前基础上加3个工作线程。

3.在生产环境让你的程序永不中断 PM2 reload 命令会一个接一个的重启工作线程,在新的工作线程启动后才结束老的工作线程。

这种方式可以保持你的Node程序始终是运行状态。即使在生产环境下部署了新的代码补丁。

也可以使用gracefulReload命令达到同样的目的,它不会立即结束工作线程,而是通过IPC向它发送关闭信号,这样它就可以关闭正在进行的连接,还可以在退出之前执行一些自定义任务。这种方式更优雅。

常用命令总结如下:

1.安装pm2

pm install -g pm2

2.启动应用

pm2 start app.js

3.列出所有应用

pm2 list

4.查看资源消耗

pm2 monit

5.查看某一个应用状态

pm2 describe [app id]

6.查看所有日志

pm2 logs

7.重启应用

pm2 restart [app id]

8.停止应用

pm2 stop [app id]

9.开启api访问

pm2 web

10.查看pm2列表

pm2 list

11.删除所有

pm2 delete all