nodeJS进程管理器pm2的使⽤
pm2是⼀个带有负载均衡功能的Node应⽤的进程管理器。当你要把你的独⽴代码利⽤全部的服务器上的所有CPU,并保证进程永远都活着,0秒的重载, PM2是完美的。
PM2是开源的基于Nodejs的进程管理器,包括守护进程,监控,⽇志的⼀整套完整的功能,基本是Nodejs应⽤程序不⼆的守护进程选择,事实上它并不仅仅可以启动Nodejs的程序,只要是⼀般的脚本的程序它同样可以胜任。
主要特性:
python入门教程(非常详细)书内建负载均衡(使⽤Node cluster 集模块)
后台运⾏
0秒停机重载(这项功能允许你重新载⼊代码⽽不⽤失去请求连接。)
具有Ubuntu和CentOS 的启动脚本
停⽌不稳定的进程(避免⽆限循环)
控制台检测
提供 HTTP API
远程控制和实时的接⼝API ( Nodejs 模块,允许和PM2进程管理器交互 )
使⽤环境:
仅能⽤于web应⽤
运⾏于Node 0.11.x版本
运⾏于 cluster 模式(默认模式)
安装
npm install -g pm2
pm2安装好后,会⾃动创建下⾯⽬录:
/.pm2
/
.pm2/logs
/.pm2/pids
/.pm2/pm2.log
/.pm2/pm2.pid
/.pm2/rpc.sock
/.pm2/pub.sock
/.pm2/conf.js
⽤法
易语言行业软件源码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 (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 list
列出由pm2管理的所有进程信息,还会显⽰⼀个进程会被启动多少次,因为没处理的异常。
pm2 monit
监视每个node进程的CPU和内存的使⽤情况。
⼊门教程
挑我们最爱的express应⽤来举例。⼀般我们都是通过npm start启动应⽤,其实就是调⽤node ./bin/www。那么,换成pm2就是
pm2 start ./bin/www –watch
这⾥⽤了–watch参数,意味着当你的express应⽤代码发⽣变化时,pm2会帮你重启服务。
参数说明:html有哪些单标签
--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, )。⽐如你⽤的coffee script来编写应⽤。
完整命令⾏参数列表:
pm2 start app.js –watch -i 2
配置⽂件
1. 配置⽂件⾥的设置项,跟命令⾏参数基本是⼀⼀对应的。
2. 可以选择yaml或者json⽂件,就看个⼈洗好了。
3. json格式的配置⽂件,pm2当作普通的js⽂件来处理,所以可以在⾥⾯添加注释或者编写代码,这对于动态调整配置很
有好处。
4. 如果启动的时候指定了配置⽂件,那么命令⾏参数会被忽略。(个别参数除外,⽐如--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": {
discuz门户模板搜索一品资源"NODE_ENV": "production"      // 环境变量,object类型,如{"NODE_ENV":"production", "ID": "42"};
},
"instances" : "max",          // 开启进程数,可为数值,也可为max。与服务器cpu核数相关。应⽤启动实例个数,仅在cluster模式有效,默认为fork;
"exec_mode" : "cluster"        // 应⽤启动模式,⽀持fork和cluster模式;cluster(多核推荐)
"min_uptime": "60s",          // 应⽤运⾏少于时间被认为是异常启动;
"max_restarts": 30,          // 最⼤异常重启次数,即⼩于min_uptime运⾏时间重启次数;
"max_memory_restart": "300M",      // 最⼤内存限制数,超出⾃动重启;
"autorestart": true,          // 默认为true, 发⽣异常的情况下⾃动重启;
}
⾃定义启动⽂件,创建⼀个test.json的⽰例⽂件,格式如下:
{
"apps":[
{
"name": "test",
"cwd": "/data/wwwroot/nodejs",
"script": "./test.sh",
"exec_interpreter": "bash",
"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:应⽤程序的脚本类型,这⾥使⽤的shell,默认是nodejs
min_uptime:最⼩运⾏时间,这⾥设置的是60s即如果应⽤程序在60s内退出,pm2会认为程序异常退出,此时触发重启max_restarts设置数量
autorestart 默认为true, 发⽣异常的情况下⾃动重启;
max_restarts:设置应⽤程序异常退出重启的次数,默认15次(从0开始计数)
exec_mode:应⽤程序启动模式,这⾥设置的是cluster(集),默认是fork
error_file:⾃定义应⽤程序的错误⽇志⽂件
单元格如何设置下拉选项out_file:⾃定义应⽤程序⽇志⽂件
pid_file:⾃定义应⽤程序的pid⽂件
watch:是否启⽤监控模式,默认是false。如果设置成true,当应⽤程序变动时,pm2会⾃动重载。这⾥也可以设置你要监控的⽂件。
max_memory_restart:当内存超过设置的数量时⾃动重启。如果⼯程中有⽐较棘⼿的内存泄露问题,这个算是⼀个折中⽅案。
instances:启⽤多少个实例,可⽤于负载均衡。仅在cluster模式有效,默认为fork;
cron_restart crontab时间格式,定时重启应⽤,⽬前只⽀持cluster模式;
运⾏实例:已上⾯的test.json为例
pm2 start test.json
在实际项⽬开发中,我们的应⽤经常需要在多个环境下部署,⽐如开发环境、测试环境、⽣产环境等。在不同环境下,有时候配置项会有差异,⽐如链接的数据库地址不同等。
对于这种场景,pm2也是可以很好⽀持的。⾸先通过在配置⽂件中通过env_xx来声明不同环境的配置,然后在启动应⽤时,通过–env参数指定运⾏的环境。
⾸先,在配置⽂件中,通过env选项声明多个环境配置。简单说明下:
env为默认的环境配置(⽣产环境),env_dev、env_test则分别是开发、测试环境。可以看到,不同环境下的NODE_ENV、REMOTE_ADDR字段的值是不同的。
在应⽤中,可以通过v.REMOTE_ADDR等来读取配置中⽣命的变量。
例如:
"env": { "NODE_ENV": "production","REMOTE_ADDR": "ample/"}
"env_dev": { "NODE_ENV": "development", "REMOTE_ADDR": "ample/"}
"env_test": { "NODE_ENV": "test", "REMOTE_ADDR": ample/}
启动指明环境:假设通过下⾯启动脚本(开发环境),那么,此时v.REMOTE_ADDR的值就是相应的链接地址
pm2 start app.js --env dev
负载均衡
命令如下,表⽰开启三个进程。如果-i 0,则会根据机器当前核数⾃动开启尽可能多的进程。
m2 start app.js -i 3 # 开启三个进程
p m2 start app.js -i max # 根据机器CPU核数,开启对应数⽬的进程
⽇志查看
除了可以打开⽇志⽂件查看⽇志外,还可以通过pm2 logs来查看实时⽇志。这点对于线上问题排查⾮常重要。
⽐如某个node服务突然异常重启了,那么可以通过pm2提供的⽇志⼯具来查看实时⽇志,看是不是脚本出错之类导致的异常重启。
pm2 logs
开机⾃动启动
可以通过pm2 startup来实现开机⾃启动。⼤致流程如下:
通过pm2 save保存当前进程状态。
通过pm2 startup [platform]⽣成开机⾃启动的命令。(记得查看控制台输出)
将步骤2⽣成的命令,粘贴到控制台进⾏,搞定。
⾃动重启应⽤
fork不⽀持定时重启,cluster⽀持定时重启。定时重启也就是配置中的cron_restart配置项。
监控(monitor)
运⾏如下命令,查看当前通过pm2运⾏的进程的状态。
pm2 monit
内存使⽤超过上限⾃动重启
如果想要你的应⽤,在超过使⽤内存上限后⾃动重启,那么可以加上–max-memory-restart参数。(有对应的配置项)
二进制转换方法的口诀
pm2 start big-array.js –max-memory-restart 20M
Web API
如果你不仅仅想监控被pm2管理的进程,还需要监控进程所运⾏的机器的信息,你可以使⽤下⾯这个API。
pm2会启动⼀个叫做pm2-http-interface的进程提供web服务。你打开浏览器输⼊http://127.0.0.1:961
5,是不是被看到的结果惊艳到了。
pm2与forever对⽐
Feature Forever PM2
Keep Alive✔✔
Coffeescript✔
Log aggregation✔
API✔
Terminal monitoring✔
Clustering✔
JSON configuration✔
稳定运⾏建议
PM2是⼀款⾮常优秀的Node进程管理⼯具,它有着丰富的特性:能够充分利⽤多核CPU且能够负载均衡、能够帮助应⽤在崩溃后、指定时间(cluster model)和超出最⼤内存限制等情况下实现⾃动重启。
个⼈⼏点看法保证常驻应⽤进程稳定运⾏:
定时重启,应⽤进程运⾏时间久了或许总会产⽣⼀些意料之外的问题,定时可以规避⼀些不可测的情况;
最⼤内存限制,根据观察设定合理内存限制,保证应⽤异常运⾏;
合理min_uptime,min_uptime是应⽤正常启动的最⼩持续运⾏时长,超出此时间则被判定为异常启动;
设定异常重启延时restart_delay,对于异常情况导致应⽤停⽌,设定异常重启延迟可防⽌应⽤在不可测情况下不断重启的导致重启次数过多等问题;
设置异常重启次数,如果应⽤不断异常重启,并超过⼀定的限制次数,说明此时的环境长时间处于不可控状态,服务器异常。此时便可停⽌尝试,发出错误警告通知等。
与supervisor对⽐
supervisor可以实现修改命令后重启应⽤,但是关闭控制台之后,整个进程就挂了。pm2则可以后台运⾏,关闭控制台之后也不影响进程运⾏。
以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。