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

全局安装

sudo npm install pm2@latest -g

用法

  • 最简单的启用一个应用: pm2 start app.js
  • 停止:pm2 stop app_name|app_id
  • 删除:pm2 delete app_name|app_id
  • 重启:pm2 restart app_name|app_id
  • 停止所有:pm2 stop all
  • 查看所有的进程:pm2 list
  • 查看所有的进程状态:pm2 status
  • 查看某一个进程的信息:pm2 describe app_name|app_id

参数说明

  • --watch:监听应用目录源码的变化,一旦发生变化,自动重启。如果要精确监听、不见听的目录,最好通过配置文件
  • -i --instances:启用多少个实例,可用于负载均衡。如果-i 0或者-i max,则根据当前机器核数确定实例数目,可以弥补node.js缺陷
  • --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 index.js --watch -i 2

配置文件

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

完整参数单个app配置:

  1. {
  2. "name" : "node-app", //启动app名称
  3. "cwd" : "/srv/node-app/current",
  4. "args" : ["--toto=heya coco", "-d", "1"],
  5. "script" : "bin/app.js",
  6. "node_args" : ["--harmony", " --max-stack-size=102400000"],
  7. "log_date_format" : "YYYY-MM-DD HH:mm Z",
  8. "error_file" : "/var/log/node-app/node-app.stderr.log",
  9. "out_file" : "log/node-app.stdout.log",
  10. "pid_file" : "pids/node-geo-api.pid",
  11. "instances" : 6, //or 0 => 'max'
  12. "min_uptime" : "200s", // 200 seconds, defaults to 1000
  13. "max_restarts" : 10, // defaults to 15
  14. "max_memory_restart": "1M", // 1 megabytes, e.g.: "2G", "10M", "100K", 1024 the default unit is byte.
  15. "cron_restart" : "1 0 * * *",
  16. "watch" : false,
  17. "ignore_watch" : ["[\\/\\\\]\\./", "node_modules"],
  18. "merge_logs" : true,
  19. "exec_interpreter" : "node",
  20. "exec_mode" : "fork",
  21. "autorestart" : false, // enable/disable automatic restart when an app crashes or exits
  22. "vizion" : false, // enable/disable vizion features (versioning control)
  23. // Default environment variables that will be injected in any environment and at any start
  24. "env": {
  25. "NODE_ENV": "production",
  26. "AWESOME_SERVICE_API_TOKEN": "xxx"
  27. }
  28. "env_*" : {
  29. "SPECIFIC_ENV" : true
  30. }
  31. }

完整配置文件写法:

{
  "apps" : [{
    // Application #1
    "name"        : "worker-app",
    "script"      : "worker.js",
    "args"        : ["--toto=heya coco", "-d", "1"],
    "watch"       : true,
    "node_args"   : "--harmony",
    "merge_logs"  : true,
    "cwd"         : "/this/is/a/path/to/start/script",
    "env": {
      "NODE_ENV": "development",
      "AWESOME_SERVICE_API_TOKEN": "xxx"
    },
    "env_production" : {
       "NODE_ENV": "production"
    },
    "env_staging" : {
       "NODE_ENV" : "staging",
       "TEST"     : true
    }
  },{
    // Application #2
    "name"       : "api-app",
    "script"     : "api.js",
    "instances"  : 4,
    "exec_mode"  : "cluster_mode",
    "error_file" : "./examples/child-err.log",
    "out_file"   : "./examples/child-out.log",
    "pid_file"   : "./examples/child.pid"
  }]
}

通过yaml管理多个应用

process.yml:

apps:
  - script   : app.js
    instances: 4
    exec_mode: cluster
  - script : worker.js
    watch  : true
    env    :
      NODE_ENV: development
    env_production:
      NODE_ENV: production

启动:pm2 start process.yml

环境切换

正式开发中分为不同的环境(开发环境、测试环境、生产环境),我们需要根据不同的情景来切换各种环境
pm2通过在配置文件中通过env_xx来声明不同环境的配置,然后在启动应用时,通过--env参数指定运行的环境
环境配置定义,在应用中,可以通过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/"
  }

启动指定的环境:pm2 start app.js --env development

负载均衡

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

开机自动启动

  1. 通过pm2 save保存当前进程状态。
  2. 通过pm2 startup [platform]生成开机自启动的命令。例如:pm2 startup centeros
  3. 将步骤2生成的命令,粘贴到控制台进行,搞定。

    更新

    安装最新的:npm install pm2@latest -g
    然后在内存中更新:pm2 update

    参考