pm2

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pm2相关的知识,希望对你有一定的参考价值。

Centos7安装nodejs、npm、pm2

1、        安装软件包:

安装nodejs

# yum -y install nodejs

安装npm

#yum -y install npm

安装pm2

#npm install pm2 -g

常用命令:

$ npm install pm2 -g     # 命令行安装 pm2

$ pm2 start app.js -i 4  # 后台运行pm2,启动4个app.js

                         # 也可以把‘max‘ 参数传递给 start

                         # 正确的进程数目依赖于Cpu的核心数目

$ pm2 start app.js --name my-api # 命名进程

$ pm2 list               # 显示所有进程状态

$ pm2 monit              # 监视所有进程

$ 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  # 启动 并 生成一个配置文件
你也可以执行用其他语言编写的app  ( fork 模式):
$ pm2 start my-bash-script.sh    -x --interpreter bash
$ pm2 start my-python-script.py -x --interpreter python
 
Pm2升级:
$ git clone https://github.com/Unitech/pm2.git
$ cd pm2
$ npm install  # 或者 npm install --dev ,如果devDependencies 没有安装
$ npm test

Pm2 回滚

1、查看当前的deploy的deploy id及commit-id:

# pm2 deploy ecosystem.josn daily curr

 

2、查看上一次deploy的deploy id及commit-id:

# pm2 deploy ecosystem.json daily prev

 

3、查看所有的deploy的deploy id及commit-id:

# pm2 deploy ecosystem.json daily list

 

4、回滚到相应的版本:

# pm2 deploy ecosystem.json daily revert deploy-id

 

2、        使用放式:

1)        nginx配置

    server {

    server_name your.domain.com;

    return 301 $scheme://domain.com$request_uri;

}

server {

      listen 80;

server_name domain.com;

client_max_body_size 10G;

location / {

    proxy_set_header X-Real-IP $remote_addr;

    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_pass http://127.0.0.1:3000;

    proxy_redirect off;

    proxy_buffering off;

     }

       }

     2) deploy

#app.js

     

var express = require(‘express’);

var app = express();

app.get(‘/‘, function(req, res) {

  res.send(‘Hello, World!’);

});

var server = app.listen(3000, function() {

console.log(‘Server listening at http://%s:%s‘, host, port);

});

#pm2

生成pm2的配置文件,pm2使用ecosystem.json为配置文件,使用以下命令生成:

# pm2  ecosystem

配置样例:

{

  "apps": [

    {

      "name": "lion-API",

      "script": "server.js",

      "env": {

        "newrelic": "true",

        "PORT_SERVER": 10010

      },

      "instances": 1,

      "exec_mode": "cluster",

      "merge_logs": true,

      "log_date_format" : "YYYY-MM-DD HH:mm Z",

    },

    {

      "name": "lion-adminApiServer",

      "script": "admin/adminApiServer.js",

      "env": {

        "newrelic": "true",

        "NEW_RELIC_HOME": "./admin",

        "PORT_ADMIN": 10011

      },

      "instances": 1,

      "exec_mode": "cluster",

      "max_memory_restart": "900M"

    }

  ],

  "deploy": {

    "lion": {

      "user": "root",

      "host": "10.10.105.121",

      "ref": "origin/lion",

      "repo": "[email protected]:fireball/Saturn.git",

      "path": "/data/lion",

      "post-setup": "cnpm install",

      "post-deploy": "NODE_ENV=daily cnpm install && MONGO_DB=saturn_daily NODE_ENV=daily npm run-script test && pm2 startOrReload deploy/ecosystem.lion.json --env lion",

      "env": {

        "NODE_ENV": "daily",

        "MORGAN": true

 

      }

    }

  }

}

 

 

 

 

 

配置说明:

{ "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": 6,

"min_uptime": "200s",

"max_restarts": 10,

"max_memory_restart": "500M",

"cron_restart": "1 0 * * *",

"watch": false,

"merge_logs": true,

"exec_interpreter": "node",

"exec_mode": "cluster",

"autorestart": false,

"vizion": false } ]

}

 

  • apps:json结构,apps是一个数组,每一个数组成员就是对应一个pm2中运行的应用
  • name:应用程序名称
  • cwd:应用程序所在的目录
  • script:应用程序的脚本路径
  • log_date_format: 定义日期格式
  • error_file:自定义应用程序的错误日志文件
  • out_file:自定义应用程序日志文件
  • pid_file:自定义应用程序的pid文件
  • instances: 启动的实例数,在cluster模式下使用多实例。
  • min_uptime:最小运行时间,这里设置的是60s即如果应用程序在60s内退出,pm2会认为程序异常退出,此时触发重启max_restarts设置数量
  • max_restarts:设置应用程序异常退出重启的次数,默认15次(从0开始计数)
  • cron_restart:定时启动,解决重启能解决的问题
  • watch:是否启用监控模式,默认是false。如果设置成true,当应用程序变动时,pm2会自动重载。这里也可以设置你要监控的文件。
  • merge_logs:
  • exec_interpreter:应用程序的脚本类型,这里使用的shell,默认是nodejs
  • exec_mode:应用程序启动模式,这里设置的是cluster_mode(集群),默认是fork
  • autorestart:启用/禁用应用程序崩溃或退出时自动重启
  • vizion:启用/禁用vizion特性(版本控制)

 

以上是关于pm2的主要内容,如果未能解决你的问题,请参考以下文章

无法在 nodeJS 中获取 pm2 退出或停止事件

pm2踩过的坑

nodejs之pm2自动重启服务

PM2源码浅析

PM2工作原理

pm2同一套代码启动两个不同的进程