文章已同步至掘金:https://juejin.cn/post/6889300755539312653
欢迎访问😃,有任何问题都可留言评论哦~
pm2是什么? {#pm2%E6%98%AF%E4%BB%80%E4%B9%88%EF%BC%9F}
PM2是 node 进程管理工具,可以利用它来简化很多node应用管理的繁琐任务,这里推荐一个 node 版本控制工具--nvm。
为什么要用pm2? {#%E4%B8%BA%E4%BB%80%E4%B9%88%E8%A6%81%E7%94%A8pm2%3F}
对于线上项目,如果直接通过 node app
来启动,因为 node 是单线程的,所以如果报错了可能会使项目直接停止,从而导致整个服务崩溃。
一般监控 node 有几种方案:
- supervisor: 一般用作开发环境的使用;
- forever: 管理多个站点,一般每个站点的访问量不大的情况,不需要监控;
- PM2: 网站的访问量比较大,需要完整的监控页面。
pm2优点 {#pm2%E4%BC%98%E7%82%B9}
- 后台运行(关掉cmd窗口依然运行)
- 0 秒停机重载,维护升级时不需要停机
- Linux (stable) & MacOSx (stable) & Windows (stable).多平台支持
- 进程守护 (停止不稳定的进程,避免无限循环)
- 内建负载均衡
- 实时控制台检测
- 提供 HTTP API等
- 远程控制和实时的接口API ( nodejs 模块,允许和PM2进程管理器交互 )
- 不仅仅可以启动node程序,对于一般的脚本程序同样可以
安装 {#%E5%AE%89%E8%A3%85}
确保有node环境
npm install -g pm2
使用 {#%E4%BD%BF%E7%94%A8}
启动 {#%E5%90%AF%E5%8A%A8}
pm2 start app.js
(如果提示找不到命令且你已安装成功,则可能你没有配置环境变量,需要自己手动配一下)
参数说明:
--watch
:监听应用目录的变化,一旦发生变化,自动重启。如果要精确监听、不见听的目录,最好通过配置文件。-i --instances
:启用多少个实例,可用于负载均衡。如果-i 0
或者-i max
,则根据当前机器核数确定实例数目。--ignore-watch
:排除监听的目录/文件,可以是特定的文件名,也可以是正则。比如--ignore-watch="test node_modules "
-n --name
:指定应用的名称。查看应用信息的时候可以用到。-o --output <path>
:标准输出日志文件的路径。-e --error <path>
:错误输出日志文件的路径。--interpreter <interpreter>
:the interpreter pm2 should use for executing app (bash, python...)。比如你用的coffee script来编写应用。-x
:用fork模式启动app.js,而不是cluster模式
fork模式:单实例多进程,常用于多语言混编,比如php、python等,不支持端口复用,需要自己做应用的端口分配和负载均衡的子进程业务代码。
- 缺点:就是单服务器实例容易由于异常会导致服务器实例崩溃。
cluster模式:多实例多进程,但是只支持node,端口可以复用,不需要额外的端口配置,0代码实现负载均衡。
- 优点:就是由于多实例机制,可以保证服务器的容错性,就算出现异常也不会使多个服务器实例同时崩溃。 例子:
pm2 start app.js --watch
:实时监控的方式启动,app.js文件有变动时,pm2会自动reload(重启)
pm2 start app.js -i max
:根据有效CPU数目启动最大进程数目
pm2 start app.js -i 3
:启动3个进程
pm2 start app.js --ignore-watch="test node_modules"
:排除监听的目录/文件
pm2 start app.js --name mynode
:启动一个进程并把它命名为mynode
pm2 start app.json
:启动进程, 可以在 app.json里设置选项
pm2 start app.js -i max - -z 10
:在 -- 之后给 app.js 传递参数(-z 10)
查看与监视进程 {#%E6%9F%A5%E7%9C%8B%E4%B8%8E%E7%9B%91%E8%A7%86%E8%BF%9B%E7%A8%8B}
pm2 list
:显示所有进程信息;pm2 show 11
,pm2 info 11
:查看进程id为 11 的详细信息;pm2 monit
:进入监视页面,监视每个node进程的CPU和内存的使用情况。
重载、重启 {#%E9%87%8D%E8%BD%BD%E3%80%81%E9%87%8D%E5%90%AF}
pm2 restart 11
:重启id为 11 的进程;pm2 restart all
:重启所有进程;pm2 reload 11
:0秒停机重载id为 11 进程(用于 NETWORKED 进程);pm2 reload all
:重载所有进程;
停止、删除进程 {#%E5%81%9C%E6%AD%A2%E3%80%81%E5%88%A0%E9%99%A4%E8%BF%9B%E7%A8%8B}
pm2 stop/delete 11
:停止/删除id为 11 的进程;pm2 stop/delete all
:停止/删除所有进程;
日志操作 {#%E6%97%A5%E5%BF%97%E6%93%8D%E4%BD%9C}
pm2 logs
:显示所有进程的日志;pm2 logs 11
:显示进程id为 11 的日志;pm2 flush
:清空所有日志文件;pm2 reloadLogs
:重载所有日志;pm2 startup
:产生 init 脚本,保持进程活着;
杀进程 {#%E6%9D%80%E8%BF%9B%E7%A8%8B}
pm2 kill
:杀死pm2进程 ;
开机自动启动 {#%E5%BC%80%E6%9C%BA%E8%87%AA%E5%8A%A8%E5%90%AF%E5%8A%A8}
1、通过pm2 save
保存当前进程状态。
2、通过pm2 startup [platform]
生成开机自启动的命令。例如:pm2 startup centeros
3、将步骤2生成的命令,粘贴到控制台进行,搞定。
pm2配置文件启动 {#pm2%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%E5%90%AF%E5%8A%A8}
在上面的启动命令例子中,有一条pm2 start app.json
命令,可以在app.json文件中添加配置
apps:json结构,apps是一个数组,数组中的每一个对象就对应一个pm2中运行的应用
参数说明:
- name:应用程序名称
- args:脚本的参数域
- cwd:应用程序所在的目录
- script:应用程序的脚本路径
- log_date_format:
- node_args:node 的参数域
- error_file:自定义应用程序的错误日志文件
- out_file:自定义应用程序日志文件
- pid_file:自定义应用程序的pid文件
- instances:
- 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特性(版本控制)
举个例子:
{
"apps": [
{
"name": "serverName", // 名称
"script": "./index.js", // 入口文件
"env": { // 环境
"NODE_ENV": "development"
},
"env_production": {
"NODE_ENV": "production"
},
"instances": 4, // 启用多少个实例
"exec_mode": "cluster", // 应用程序启动模式,这里设置的是cluster_mode(集群),默认是fork
"max_restarts" : 3, // 设置应用程序异常退出重启的次数,默认15次(从0开始计数)
"restart_delay" : 5000, // 异常重启情况下,延时重启时间
"log_date_format" : "YYYY-MM-DD HH:mm Z",
"combine_logs" : true,
"log_file": "<yourpath>/combined.outerr.log", // 日志目录
"out_file": "<yourpath>/out.log",
"error_file": "<yourpath>/err.log",
}
]
}
注:
pm2 restart
命令不会重新进行 配置文件 需要关掉重启。