{ "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" // 环境变量,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字段的值是不同的。
在应用中,可以通过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": }
启动指明环境:假设通过下面启动脚本(开发环境),那么,此时process.env.REMOTE_ADDR的值就是相应的链接地址
pm2 start app.js --env dev
负载均衡
命令如下,表示开启三个进程。如果-i 0,则会根据机器当前核数自动开启尽可能多的进程。
m2 start app.js -i 3 # 开启三个进程 pm2 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 web
pm2会启动一个叫做pm2-http-interface的进程提供web服务。你打开浏览器输入http://127.0.0.1:9615,是不是被看到的结果惊艳到了。
pm2与forever对比