node进程管理器神器——PM2(值得收藏)

PM2作为小邹一直在使用的node进程管理软件,我自己心里是感觉非常方便,它在解决node中间层进程异常方面有着不小的功劳,下面小邹就它的两种使用模式给大伙讲解一下(文章同步自小邹的头条号:沪漂程序员的生活史):

node进程管理器神器——PM2(值得收藏)_第1张图片

运行模式

  1. fork_mode
  2. cluster_mode

pm2 start app.js 默认开启的是fork模式,pm2 start app.js -i max 是开启cluster模式(集群模式)。cluster模式的好处,请自行百度。

当然你也可以通过配置文件启动1个或多个node应用

// process.json(也可以yml等配置文件)
{
    "apps": [{
        "name": "myblog",
        "script": "app.js",
        "instances": 2, //利用2个核心
        "exec_mode": "cluster"
    }, {
        "name": "myblog-test",
        "script": "app.js",
        "instances": "max",
        "exec_mode": "cluster",
        "watch": true,
        "env": {
            "NODE_ENV": "development"
        },
        "env_production": {
            "NODE_ENV": "production"
        },
        "interpreter": "/usr/bin/node",
        "interpreter_args": "--harmony",
        "node_args": "--harmony",
        "log_date_format": "YYYY-MM-DD HH:mm Z",
        "error_file": "/web/klhut/www/logs/err.log",
        "out_file": "/web/klhut/www/logs/out.log",
        "pid_file": "/web/klhut/www/logs/app-id.pid"
    }]
}
// 启动应用
pm2 start process.json
//指定对应的运行环境
pm2 start process.json --env production

你可以在package.json里写了几个命令

"scripts": {
    "start": "shell=(nvm use 7 ) && pm2 start ./process.json",
    "restart": "pm2 restart ./process.json",
    "stop": "pm2 stop ./process.json",
    "delete": "npm run stop && pm2 delete ./process.json"
}

pm2还可以设置开机自启动

$ pm2 save
$ pm2  startup centos       //具体看文档

下面小邹讲讲cluster_mode的优势

1、重启异常进程

如果任意一个工作线程挂掉了,不用担心,PM2会立即将其重启。当然,你也完全可以在任何时候手动重启这些线程:

node进程管理器神器——PM2(值得收藏)_第2张图片

2、实时扩展集群

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

node进程管理器神器——PM2(值得收藏)_第3张图片

3、在产品环境实现零停机更新

PM2的reload 功能将依次重启所有的工作线程。每一个线程会等待在新的线程创建之后才会被终止掉,因此,当你在产品环境部署新的代码时,server会不间断地一直保持运行。

使用gracefulReload功能可以达到相同的目的,不同的是它不会立即终止工作线程,而是通过IPC发送一个shutdown信号来关闭所有当前的连接并处理一些自定义的任务,然后再优雅地退出。如下面的代码:

process.on('message', function(msg) {  
  if (msg === 'shutdown') {
    close_all_connections();
    delete_cache();
    server.close();
    process.exit(0);
  }
});

 

你可能感兴趣的:(javascript,node,中间件)