hualinux1.8 基础安装:nodejs群集工具pm2安装

一、安装环境

我在前面《hualinux1.2 搭建篇:centos8最小化安装》的基础上进行安装的

二、安装pm2

2.1 PM2介绍

#1.PM2应用场景

大家在开发中应该发现了,如果直接通过node app来启动,如果报错了可能直接停在整个运行,supervisor感觉只是拿来用作开发环境的。再网上找到pm2.目前似乎最常见的线上部署nodejs项目的有forever,pm2这两种。

 

使用场合:

  1. supervisor是开发环境用。
  2. forever管理多个站点,每个站点访问量不大,不需要监控。
  3. pm2 网站访问量比较大,需要完整的监控界面

 

PM2的主要特性:

  1. 内建负载均衡(使用Node cluster 集群模块)
  2. 后台运行
  3. 0秒停机重载,我理解大概意思是维护升级的时候不需要停机.
  4. 具有Ubuntu和CentOS 的启动脚本
  5. 停止不稳定的进程(避免无限循环)
  6. 控制台检测
  7. 提供 HTTP API
  8. 远程控制和实时的接口API ( Nodejs 模块,允许和PM2进程管理器交互 )

 

pm2的官网注解为:

PM2 is a production process manager for Node.js applications with a built-in load balancer. It allows you to keep applications alive forever, to reload them without downtime and to facilitate common system admin tasks.

pm2 是一个带有负载均衡功能的Node应用的进程管理器.
当你要把你的独立代码利用全部的服务器上的所有CPU,并保证进程永远都活着,0秒的重载,PM2是完美的。
pm2可以管理nodejs,也可以做群集

 

#2.nodejs群集原理

众所周知,Node.js运行在ChromeJavaScript运行时平台上,我们把该平台优雅地称之为V8引擎。不论是V8引擎,还是之后的Node.js,都是以单线程的方式运行的,因此,在多核心处理器的系统中并不能发挥其最大的性能。

幸运的是,Node.js给我们提供了cluster模块,它可以生成多个工作线程来共享同一个TCP连接。

  它是如何运作的呢?

  首先,Cluster会创建一个master,然后根据你指定的数量复制出多个server app(也被称之为工作线程)。它通过IPC通道与工作线程之间进行通信,并使用内置的负载均衡来更好地处理线程之间的压力,该负载均衡使用了Round-robin算法(也被称之为循环算法)。

  当使用Round-robin调度策略时,master accepts()所有传入的连接请求,然后将相应的TCP请求处理发送给选中的工作线程(该方式仍然通过IPC来进行通信)。

  那如何来使用呢?

  下面是一个最基本的例子:

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(8000);
}

当然,你可以指定任意数量的工作线程,线程的数量不仅限于CPU核心的数量,因为它只是作为一个运行在CPU上的子线程。

  正如你所看到的,要使其正常运行,你需要将你的代码封装到cluster的处理逻辑中,并添加一些额外的代码来指定当一个线程挂掉之后如何进行处理。

PM2内部包含了所有上述的处理逻辑,因此你不必对代码做任何修改。我们将上面的代码还原成最原始的形式:

var http = require('http');

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

2.安装PM2

yum install nodejs npm -y

npm install -g pm2 -y

 

3.PM2相关命令

npm install -g pm2 命令行全局安装pm2

pm2 --help  帮助命令

pm2 start app.js 启动app项目

pm2 list 列出由pm2管理的所有进程信息,还会显示一个进程会被启动多少次,因为没处理的异常。

pm2 logs 显示所有进程日志

pm2 stop all 停止所有进程

pm2 restart all 重启所有进程

pm2 reload all 0秒停机重载进程 (用于 NETWORKED 进程)

pm2 stop 0 停止指定的进程

pm2 restart 0 重启指定的进程

pm2 startup 产生 init 脚本 保持进程活着

pm2 web 运行健壮的 computer API endpoint (http://localhost:9615)

pm2 delete 0 杀死指定的进程

pm2 delete all 杀死全部进程

 

运行进程的不同方式:

pm2 start app.js -i max 根据有效CPU数目启动最大进程数目

pm2 start app.js -i 3 启动3个进程

pm2 start app.js -x 用fork模式启动 app.js 而不是使用 cluster

pm2 start app.js -x -- -a 23 用fork模式启动 app.js 并且传递参数 (-a 23)

pm2 start app.js --name serverone 启动一个进程并把它命名为 serverone

pm2 stop serverone 停止 serverone 进程

pm2 start app.json 启动进程, 在 app.json里设置选项

pm2 start app.js -i max -- -a 23 在--之后给 app.js 传递参数

pm2 start app.js -i max -e err.log -o out.log 启动 并 生成一个配置文件

 

4.简单测试

#1.测试一

#1)建立一个简单的测试文件

mkdir -pv /disk1/test
cd /disk1/test
cat> t1.js<<EOF
var http = require('http');

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

#2)用pm2运行

pm2 start t1.js -i max

上面的命令是起了4个实例,看mode那列自动变成了cluster群集了。

任何时候,如果你需要增加工作线程的数量,可以通过pm2 scale <app name> <n>来对集群进行扩展。参数<n>指定工作线程的数量,被用来增加或减少集群数。你也可以通过pm2 scale app +3的方式来指定要增加多少工作线程。

 

#3)将PM2配置成自动启动

想要PM2在服务器重启后自动运行之前的应用,可以先通过pm2 start启动你的应用,然后执行下面的命令:

pm2 save

这将在~/.pm2目录下生成一个dump.pm2文件,里面描述了当前PM2上运行着的所有应用。然后执行命令:

pm2 startup [platform]

  注意有必要添加可选参数platform以明确告知pm2当前的系统环境。这样,下次当服务器重启时,PM2会自动运行之前保存的应用。

 

#2.测试2

在项目根目录添加一个processes.json:

{
 "apps": [
 {
  "name": "mywork",
  "cwd": "/srv/node-app/current",
  "script": "bin/www",
  "log_date_format": "YYYY-MM-DD HH:mm Z",
  "error_file": "/var/log/node-app/node-app.stderr.log",
  "out_file": "log/node-app.stdout.log",
  "pid_file": "pids/node-geo-api.pid",
  "instances": 4,
  "min_uptime": "200s",
  "max_restarts": 10,
  "max_memory_restart": "1M",
  "cron_restart": "1 0 * * *",
  "watch": false,
  "merge_logs": true,
  "exec_interpreter": "node",
  "exec_mode": "fork",
  "autorestart": false,
  "vizion": false
 }
 ]
}

说明:

1.apps:json结构,apps是一个数组,每一个数组成员就是对应一个pm2中运行的应用

2.name:应用程序名称

3.cwd:应用程序所在的目录

4.script:应用程序的脚本路径

5.log_date_format:

6.error_file:自定义应用程序的错误日志文件

7.out_file:自定义应用程序日志文件

8.pid_file:自定义应用程序的pid文件

9.instances:4个

10.min_uptime:最小运行时间,这里设置的是60s即如果应用程序在60s内退出,pm2会认为程序异常退出,此时触发重启max_restarts设置数量

11.max_restarts:设置应用程序异常退出重启的次数,默认15次(从0开始计数)

12.cron_restart:定时启动,解决重启能解决的问题

13.watch:是否启用监控模式,默认是false。如果设置成true,当应用程序变动时,pm2会自动重载。这里也可以设置你要监控的文件。

14.merge_logs:

15.exec_interpreter:应用程序的脚本类型,这里使用的shell,默认是nodejs

16.exec_mode:应用程序启动模式,这里设置的是cluster_mode(集群),默认是fork

17.autorestart:启用/禁用应用程序崩溃或退出时自动重启

18.vizion:启用/禁用vizion特性(版本控制)

 

可以通过pm2 start processes.json来启动。

也可以把命令写在package.json里。如下:

通过npm run pm2来启动。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值