PM2进程管理器

什么是PM2 ?

pm2 是一个带有负载均衡功能的Node应用的进程管理器.当你要把你的独立代码利用全部的服务器上的所有CPU,并保证进程永远都活着,0秒的重载, PM2是完美的,下面我们来看pm2常用的命令用法介绍吧。

PM2 (github上的源码)是开源的基于Nodejs的进程管理器,包括守护进程,监控,日志的一整套完整的功能,基本是Nodejs应用程序不二的守护进程选择,事实上它并不仅仅可以启动Nodejs的程序,只要是一般的脚本的程序它同样可以胜任。

PM2常用命令

假设你现在已经写好了一个app.js的文件,需要启动,你可以使用pm2进行管理

1. 启动

# pm2 start app.js
# pm2 start app.js --name my-api       #my-api为PM2进程名称
# pm2 start app.js -i 0                #根据CPU核数启动进程个数
# pm2 start app.js --watch             #实时监控app.js的方式启动,当app.js文件有变动时,pm2会自动reload

2. 查看进程

# pm2 list
# pm2 show 0 或者 # pm2 info 0         #查看进程详细信息,0为PM2进程id 

3. 监控

# pm2 monit 

4. 停止

# pm2 stop all                        #停止PM2列表中所有的进程
# pm2 stop 0                          #停止PM2列表中进程为0的进程

5. 重载

# pm2 reload all                      #重载PM2列表中所有的进程
# pm2 reload 0                        #重载PM2列表中进程为0的进程

6. 重启

# pm2 restart all                     #重启PM2列表中所有的进程
# pm2 restart 0                       #重启PM2列表中进程为0的进程

7. 删除PM2进程

# pm2 delete 0                        #删除PM2列表中进程为0的进程
# pm2 delete all                      #删除PM2列表中所有的进程

8. 日志操作

# pm2 logs                      # 显示所有应用程序的日志
# pm2 logs [app-name]           # 显示指定应用程序的日志
# pm2 flush                           #Empty all log file
# pm2 reloadLogs                      #Reload all logs

9. 升级PM2

# npm install pm2@lastest -g          #安装最新的PM2版本
# pm2 updatePM2                       #升级pm2

10.配置文件模板

# pm2 generate                  # 生成一个简单的json配置文件

pm2常用参数

--watch:            监听应用目录的变化,一旦发生变化,自动重启。如果要精确监听、不见听的目录,最好通过配置文件。
 
-i --instances:      启用多少个实例,可用于负载均衡。如果-i 0或者-i max,则根据当前机器核数确定实例数目。
 
--ignore-watch:      排除监听的目录/文件,可以是特定的文件名,也可以是正则。比如--ignore-watch="test node_modules some_scripts".
 
-n --name:           应用的名称。查看应用信息的时候可以用到。

PM2使用配置文件启动任务

{
  "apps":
    {
      "name": "test",
      "cwd": "/data/wwwroot/nodejs",
      "script": "./test.js",
      "exec_interpreter": "nodejs",
      "min_uptime": "60s",
      "max_restarts": 30,
      "exec_mode" : "cluster_mode",
      "error_file" : "./test-err.log",
      "out_file": "./test-out.log",
      "pid_file": "./test.pid"
      "watch": false
    }
}

参数说明:

apps:json结构,apps是一个数组,每一个数组成员就是对应一个pm2中运行的应用。
 
name:应用程序的名称。
 
cwd:应用程序所在的目录。
 
script:应用程序的脚本路径。
 
exec_interpreter:应用程序的脚本类型,默认是nodejs。
 
min_uptime:最小运行时间,这里设置的是60s即如果应用程序在60s内退出,pm2会认为程序异常退出,此时触发重启max_restarts设置数量。
 
max_restarts:设置应用程序异常退出重启的次数,默认15次(从0开始计数)。
 
exec_mode:应用程序启动模式,这里设置的是cluster_mode(集群),默认是fork。
 
error_file:自定义应用程序的错误日志文件。
 
out_file:自定义应用程序日志文件。
 
pid_file:自定义应用程序的pid文件。
 
watch:是否启用监控模式,默认是false。如果设置成true,当应用程序变动时,pm2会自动重载。这里也可以设置你要监控的文件。

监控文件:

{
  "watch": ["server", "client"],
  "ignore_watch" : ["node_modules", "client/img"],
  "watch_options": {
    "followSymlinks": false
  }
}

另外一个实例:

{
  "name"        : "fis-receiver",         // 应用名称
  "script"      : "./bin/www",            // 实际启动脚本
  "cwd"         : "./",                  // 当前工作路径
  "watch": [                            // 监控变化的目录,一旦变化,自动重启
    "bin",
    "routers"
  ],
  "ignore_watch" : [                     // 从监控目录中排除
    "node_modules", 
    "logs",
    "public"
  ],
  "watch_options": {
    "followSymlinks": false
  },
  "error_file" : "./logs/app-err.log",    // 错误日志路径
  "out_file"   : "./logs/app-out.log",    // 普通日志路径
}

环境配置声明

首先,在配置文件中,通过env选项声明多个环境配置。简单说明下:

  • env为默认的环境配置(生产环境),env_devenv_test则分别是开发、测试环境。可以看到,不同环境下的NODE_ENVREMOTE_ADDR字段的值是不同的。
  • 在应用中,可以通过process.env.REMOTE_ADDR等来读取配置中生命的变量。
  "env": {
    "NODE_ENV": "production",
    "REMOTE_ADDR": "http://www.example.com/"
  },
  "env_dev": {
    "NODE_ENV": "development",
    "REMOTE_ADDR": "http://wdev.example.com/"
  },
  "env_test": {
    "NODE_ENV": "test",
    "REMOTE_ADDR": "http://wtest.example.com/"
  }

启动指明环境:

假设通过下面启动脚本(开发环境),那么,此时process.env.REMOTE_ADDR的值就是相应的 http://wdev.example.com/,可以自己试验下。

pm2 start app.js --env dev

CMD设置环境变量:

#node中常用的到的环境变量是NODE_ENV,首先查看是否存在
set NODE_ENV
#如果不存在则添加环境变量
set NODE_ENV=production
 
node app.js

powershell:

#node中常用的到的环境变量是NODE_ENV,首先查看是否存在
$env:NODE_ENV
#如果不存在则添加环境变量
$env:NODE_ENV="production"
 
node app.js

什么是process模块?

process模块用来与当前进程互动,可以通过全局变量process访问,不必使用require命令加载。

process对象提供一系列属性,用于返回系统信息:

  • process.pid:当前进程的进程号。
  • process.version:Node的版本,比如v0.10.18。
  • process.platform:当前系统平台,比如Linux。
  • process.title:默认值为“node”,可以自定义该值。
  • process.argv:当前进程的命令行参数数组。
  • process.env:指向当前shell的环境变量,比如process.env.HOME。
  • process.execPath:运行当前进程的可执行文件的绝对路径。

process对象提供以下方法:

  • process.exit():退出当前进程。
  • process.cwd():返回运行当前脚本的工作目录的路径。
  • process.chdir():改变工作目录。
  • process.nextTick():将一个回调函数放在下次事件循环的顶部。

nextTick详解

在这种处理模式下,process.nextTick()的意思就是定义出一个动作,并且让这个动作在下一个事件轮询的时间点上执行。我们来看一个例子。例子中有一个foo(),你想在下一个时间点上调用他,可以这么做:

function foo() {
    console.error('foo');
}
 
process.nextTick(foo);
console.error('bar');

运行上面的代码,你从下面终端打印的信息会看到,"bar"的输出在“foo”的前面。这就验证了上面的说法,foo()是在下一个时间点运行的。

bar
foo 

你也可以使用setTimeout()函数来达到貌似同样的执行效果:

setTimeout(foo, 0);
console.log('bar');

但在内部的处理机制上,process.nextTick()和setTimeout(fn, 0)是不同的,process.nextTick()不是一个单纯的延时,他有更多的特性。

更精确的说,process.nextTick()定义的调用会创建一个新的子堆栈。在当前的栈里,你可以执行任意多的操作。但一旦调用netxTick,函数就必须返回到父堆栈。然后事件轮询机制又重新等待处理新的事件,如果发现nextTick的调用,就会创建一个新的栈。

在下面的例子里有一个compute(),我们希望这个函数尽可能持续的执行,来进行一些运算密集的任务。

但与此同时,我们还希望系统不要被这个函数堵塞住,还需要能响应处理别的事件。这个应用模式就像一个单线程的web服务server。在这里我们就可以使用process.nextTick()来交叉执行compute()和正常的事件响应。

var http = require('http');
 
function compute() {
    // performs complicated calculations continuously
    // ...
    process.nextTick(compute);
}
 
http.createServer(function(req, res) {
     res.writeHead(200, {'Content-Type': 'text/plain'});
     res.end('Hello World');
}).listen(5000, '127.0.0.1');
 
compute();

在这种模式下,我们不需要递归的调用compute(),我们只需要在事件循环中使用process.nextTick()定义compute()在下一个时间点执行即可。在这个过程中,如果有新的http请求进来,事件循环机制会先处理新的请求,然后再调用compute()。反之,如果你把compute()放在一个递归调用里,那系统就会一直阻塞在compute()里,无法处理新的http请求了。

当然,我们无法通过process.nextTick()来获得多CPU下并行执行的真正好处,这只是模拟同一个应用在CPU上分段执行而已。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值