• PM2实用入门指南


    简介

    PM2是node进程管理工具,可以利用它来简化很多node应用管理的繁琐任务,如性能监控、自动重启、负载均衡等,而且使用非常简单。

    下面就对PM2进行入门性的介绍,基本涵盖了PM2的常用的功能和配置。

    安装

    全局安装,简直不能更简单。

    npm install -g pm2
    

    目录介绍

    pm2安装好后,会自动创建下面目录。看文件名基本就知道干嘛的了,就不翻译了。

    • $HOME/.pm2 will contain all PM2 related files
    • $HOME/.pm2/logs will contain all applications logs
    • $HOME/.pm2/pids will contain all applications pids
    • $HOME/.pm2/pm2.log PM2 logs
    • $HOME/.pm2/pm2.pid PM2 pid
    • $HOME/.pm2/rpc.sock Socket file for remote commands
    • $HOME/.pm2/pub.sock Socket file for publishable events
    • $HOME/.pm2/conf.js PM2 Configuration

    入门教程

    挑我们最爱的express应用来举例。一般我们都是通过npm start启动应用,其实就是调用node ./bin/www。那么,换成pm2就是

    注意,这里用了--watch参数,意味着当你的express应用代码发生变化时,pm2会帮你重启服务,多贴心。

    pm2 start ./bin/www --watch
    

    入门太简单了,没什么好讲的。直接上官方文档:http://pm2.keymetrics.io/docs/usage/quick-start

    常用命令

    启动

    参数说明:

    • --watch:监听应用目录的变化,一旦发生变化,自动重启。如果要精确监听、不见听的目录,最好通过配置文件。
    • -i --instances:启用多少个实例,可用于负载均衡。如果-i 0或者-i max,则根据当前机器核数确定实例数目。
    • --ignore-watch:排除监听的目录/文件,可以是特定的文件名,也可以是正则。比如--ignore-watch="test node_modules "some scripts""
    • -n --name:应用的名称。查看应用信息的时候可以用到。
    • -o --output <path>:标准输出日志文件的路径。
    • -e --error <path>:错误输出日志文件的路径。
    • --interpreter <interpreter>:the interpreter pm2 should use for executing app (bash, python...)。比如你用的coffee script来编写应用。

    完整命令行参数列表:地址

    pm2 start app.js --watch -i 2
    

    重启

    pm2 restart app.js
    

    停止

    停止特定的应用。可以先通过pm2 list获取应用的名字(--name指定的)或者进程id。

    pm2 stop app_name|app_id
    

    如果要停止所有应用,可以

    pm2 stop all
    

    删除

    类似pm2 stop,如下

    pm2 stop app_name|app_id
    pm2 stop all
    

    查看进程状态

    pm2 list
    

    查看某个进程的信息

    [root@iZ94wb7tioqZ pids]# pm2 describe 0
    Describing process with id 0 - name oc-server
    ┌───────────────────┬──────────────────────────────────────────────────────────────┐
    │ status            │ online                                                       │
    │ name              │ oc-server                                                    │
    │ id                │ 0                                                            │
    │ path              │ /data/file/qiquan/over_the_counter/server/bin/www            │
    │ args              │                                                              │
    │ exec cwd          │ /data/file/qiquan/over_the_counter/server                    │
    │ error log path    │ /data/file/qiquan/over_the_counter/server/logs/app-err-0.log │
    │ out log path      │ /data/file/qiquan/over_the_counter/server/logs/app-out-0.log │
    │ pid path          │ /root/.pm2/pids/oc-server-0.pid                              │
    │ mode              │ fork_mode                                                    │
    │ node v8 arguments │                                                              │
    │ watch & reload    │                                                             │
    │ interpreter       │ node                                                         │
    │ restarts          │ 293                                                          │
    │ unstable restarts │ 0                                                            │
    │ uptime            │ 87m                                                          │
    │ created at        │ 2016-08-26T08:13:43.705Z                                     │
    └───────────────────┴──────────────────────────────────────────────────────────────┘
    

    配置文件

    简单说明

    • 配置文件里的设置项,跟命令行参数基本是一一对应的。
    • 可以选择yaml或者json文件,就看个人洗好了。
    • json格式的配置文件,pm2当作普通的js文件来处理,所以可以在里面添加注释或者编写代码,这对于动态调整配置很有好处。
    • 如果启动的时候指定了配置文件,那么命令行参数会被忽略。(个别参数除外,比如--env)

    例子

    举个简单例子,完整配置说明请参考官方文档

    {
      "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": {
          "NODE_ENV": "production"  // 环境参数,当前指定为生产环境
      }
    }
    

    自动重启

    前面已经提到了,这里贴命令行,更多点击这里

    pm2 start app.js --watch
    

    这里是监控整个项目的文件,如果只想监听指定文件和目录,建议通过配置文件的watchignore_watch字段来设置。

    环境切换

    在实际项目开发中,我们的应用经常需要在多个环境下部署,比如开发环境、测试环境、生产环境等。在不同环境下,有时候配置项会有差异,比如链接的数据库地址不同等。

    对于这种场景,pm2也是可以很好支持的。首先通过在配置文件中通过env_xx来声明不同环境的配置,然后在启动应用时,通过--env参数指定运行的环境。

    环境配置声明

    首先,在配置文件中,通过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
    

    负载均衡

    命令如下,表示开启三个进程。如果-i 0,则会根据机器当前核数自动开启尽可能多的进程。

    pm2 start app.js -i 3 # 开启三个进程
    pm2 start app.js -i max # 根据机器CPU核数,开启对应数目的进程 
    

    参考文档:点击查看

    日志查看

    除了可以打开日志文件查看日志外,还可以通过pm2 logs来查看实时日志。这点对于线上问题排查非常重要。

    比如某个node服务突然异常重启了,那么可以通过pm2提供的日志工具来查看实时日志,看是不是脚本出错之类导致的异常重启。

    pm2 logs
    

    指令tab补全

    运行pm2 --help,可以看到pm2支持的子命令还是蛮多的,这个时候,自动完成的功能就很重要了。

    运行如下命令。恭喜,已经能够通过tab自动补全了。细节可参考这里

    pm2 completion install
    source ~/.bash_profile
    

    Alt text

    开机自动启动

    可以通过pm2 startup来实现开机自启动。细节可参考。大致流程如下

    1. 通过pm2 save保存当前进程状态。
    2. 通过pm2 startup [platform]生成开机自启动的命令。(记得查看控制台输出)
    3. 将步骤2生成的命令,粘贴到控制台进行,搞定。

    传入node args

    直接上例子,分别是通过命令行和配置文件。

    命令行:

    pm2 start app.js --node-args="--harmony"
    

    配置文件:

    {
      "name" : "oc-server",
      "script" : "app.js",
      "node_args" : "--harmony"
    }
    

    实例说明

    假设是在centos下,那么运行如下命令,搞定。强烈建议运行完成之后,重启机器,看是否设置成功。

    [root@iZ94wb7tioqZ option_analysis]# pm2 save
    [root@iZ94wb7tioqZ option_analysis]# pm2 startup centos
    [PM2] Generating system init script in /etc/init.d/pm2-init.sh
    [PM2] Making script booting at startup...
    [PM2] /var/lock/subsys/pm2-init.sh lockfile has been added
    [PM2] -centos- Using the command:
          su -c "chmod +x /etc/init.d/pm2-init.sh; chkconfig --add pm2-init.sh"
    
    [PM2] Done.
    [root@iZ94wb7tioqZ option_analysis]# pm2 save
    [PM2] Dumping processes
    

    远程部署

    可参考官方文档,配置也不复杂,用到的时候再来填写这里的坑。TODO

    官方文档:http://pm2.keymetrics.io/docs/usage/deployment/#getting-started

    监控(monitor)

    运行如下命令,查看当前通过pm2运行的进程的状态。

    pm2 monit
    

    看到类似输出

    [root@oneday-dev0 server]# pm2 monit
    ⌬ PM2 monitoring (To go further check out https://app.keymetrics.io) 
                                           [                              ] 0 %
    ⌬ PM2 monitoring (To go further check o[|||||||||||||||               ] 196.285 MB  
    
     ● fis-receiver                        [                              ] 0 %
    [1] [fork_mode]                        [|||||                         ] 65.773 MB  
    
     ● www                                 [                              ] 0 %
    [2] [fork_mode]                        [|||||                         ] 74.426 MB  
    
     ● oc-server                           [                              ] 0 %
    [3] [fork_mode]                        [||||                          ] 57.801 MB  
    
     ● pm2-http-interface                  [                              ] stopped
    [4] [fork_mode]                        [                              ] 0 B   
    
     ● start-production
    [5] [fork_mode]
    

    内存使用超过上限自动重启

    如果想要你的应用,在超过使用内存上限后自动重启,那么可以加上--max-memory-restart参数。(有对应的配置项)

    pm2 start big-array.js --max-memory-restart 20M
    

    更新pm2

    官方文档:http://pm2.keymetrics.io/docs/usage/update-pm2/#updating-pm2

    $ pm2 save # 记得保存进程状态
    $ npm install pm2 -g
    $ pm2 update
    

    pm2 + nginx

    无非就是在nginx上做个反向代理配置,直接贴配置。

    
    upstream my_nodejs_upstream {
        server 127.0.0.1:3001;
    }
    
    server {
        listen 80;
        server_name my_nodejs_server;
        root /home/www/project_root;
        
        location / {
        	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_http_version 1.1;
        	proxy_set_header Upgrade $http_upgrade;
        	proxy_set_header Connection "upgrade";
        	proxy_max_temp_file_size 0;
        	proxy_pass http://my_nodejs_upstream/;
        	proxy_redirect off;
        	proxy_read_timeout 240s;
        }
    }
    

    官方文档:http://pm2.keymetrics.io/docs/tutorials/pm2-nginx-production-setup

    在线监控系统

    收费服务,使用超级简单,可以方便的对进程的服务情况进行监控。可以试用下,地址在这里

    这里贴个项目中试用的截图。

    pm2

    pm2编程接口

    如果想把pm2的进程监控,跟其他自动化流程整合起来,pm2的编程接口就很有用了。细节可参考官方文档:
    http://pm2.keymetrics.io/docs/usage/pm2-api/

    模块扩展系统

    pm2支持第三方扩展,比如常用的log rotate等。可参考官方文档

    写在后面

    pm2的文档已经写的很好了,学习成本很低,即使是没用过pm2的小伙伴,基本上照着getting started的例子就可以把项目给跑起来,所以文中不少地方都是建议直接参看官方文档。

    。。。

  • 相关阅读:
    八数码难题 (codevs 1225)题解
    小木棍 (codevs 3498)题解
    sliding windows (poj 2823) 题解
    集合删数 (vijos 1545) 题解
    合并果子 (codevs 1063) 题解
    等价表达式 (codevs 1107)题解
    生理周期 (poj 1006) 题解
    区间 (vijos 1439) 题解
    区间覆盖问题 题解
    种树 (codevs 1653) 题解
  • 原文地址:https://www.cnblogs.com/chyingp/p/pm2-documentation.html
Copyright © 2020-2023  润新知