利用PM2部署node.js项目的方法教程


Posted in Javascript onMay 10, 2017

前言

大家在开发中应该发现了,如果直接通过node app来启动,如果报错了可能直接停在整个运行,supervisor感觉只是拿来用作开发环境的。再网上找到pm2.目前似乎最常见的线上部署nodejs项目的有forever,pm2这两种。下面本文将详细介绍利用PM2部署node.js项目的方法教程,需要的朋友们下面来一起看看详细的介绍:

使用场合:

  • supervisor是开发环境用。
  • forever管理多个站点,每个站点访问量不大,不需要监控。
  • pm2 网站访问量比较大,需要完整的监控界面。

PM2的主要特性:

  • 内建负载均衡(使用Node cluster 集群模块)
  • 后台运行
  • 0秒停机重载,我理解大概意思是维护升级的时候不需要停机.
  • 具有Ubuntu和CentOS 的启动脚本
  • 停止不稳定的进程(避免无限循环)
  • 控制台检测
  • 提供 HTTP API
  • 远程控制和实时的接口API ( Nodejs 模块,允许和PM2进程管理器交互 )

安装

npm install -g pm2

用法

$ npm install -g pm2 命令行全局安装pm2

$ pm2 start app.js 启动app项目

$ pm2 list 列出由pm2管理的所有进程信息,还会显示一个进程会被启动多少次,因为没处理的异常。

利用PM2部署node.js项目的方法教程

$ pm2 monit 监视每个node进程的CPU和内存的使用情况

利用PM2部署node.js项目的方法教程

$ 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 (http://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 启动 并 生成一个配置文件

配置pm2启动文件

在项目根目录添加一个processes.json:

内容如下:

{
 "apps": [
 {
  "name": "mywork",
  "cwd": "/srv/node-app/current",
  "script": "bin/www",
  "log_date_format": "YYYY-MM-DD HH:mm Z",
  "error_file": "/var/log/node-app/node-app.stderr.log",
  "out_file": "log/node-app.stdout.log",
  "pid_file": "pids/node-geo-api.pid",
  "instances": 6,
  "min_uptime": "200s",
  "max_restarts": 10,
  "max_memory_restart": "1M",
  "cron_restart": "1 0 * * *",
  "watch": false,
  "merge_logs": true,
  "exec_interpreter": "node",
  "exec_mode": "fork",
  "autorestart": false,
  "vizion": false
 }
 ]
}

说明:

  • apps:json结构,apps是一个数组,每一个数组成员就是对应一个pm2中运行的应用
  • name:应用程序名称
  • cwd:应用程序所在的目录
  • script:应用程序的脚本路径
  • log_date_format:
  • 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特性(版本控制)

可以通过pm2 start processes.json来启动。

也可以把命令写在package.json里。如下:

利用PM2部署node.js项目的方法教程

通过npm run pm2来启动。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
取得父标签
Nov 14 Javascript
不使用中间变量,交换int型的 a, b两个变量的值。
Oct 29 Javascript
40款非常棒的jQuery 插件和制作教程(系列一)
Oct 26 Javascript
原生js实现跨浏览器获取鼠标按键的值
Apr 08 Javascript
2则自己编写的jQuery特效分享
Feb 26 Javascript
js当前页面登录注册框,固定div,底层阴影的实例代码
Oct 04 Javascript
关于Vue.js一些问题和思考学习笔记(1)
Dec 02 Javascript
js实现简易垂直滚动条
Feb 22 Javascript
vue之父子组件间通信实例讲解(props、$ref、$emit)
May 22 Javascript
ionic4+angular7+cordova上传图片功能的实例代码
Jun 19 Javascript
vue+springboot图片上传和显示的示例代码
Feb 14 Javascript
如何使用RoughViz可视化Vue.js中的草绘图表
Jan 30 Vue.js
全面解析vue中的数据双向绑定
May 10 #Javascript
利用forever和pm2部署node.js项目过程
May 10 #Javascript
javascript简单链式调用案例分析
May 10 #Javascript
Angular.JS通过指令操作DOM的方法
May 10 #Javascript
JS实现队列的先进先出功能示例
May 10 #Javascript
BootStrap的两种模态框方式
May 10 #Javascript
微信小程序之购物车功能
Sep 23 #Javascript
You might like
星际争霸, 教主第一视角, ZvT经典龙蛇演义
2020/03/02 星际争霸
ThinkPHP3.1基础知识快速入门
2014/06/19 PHP
总结一些PHP中好用但又容易忽略的小知识
2017/06/02 PHP
PhpStorm的使用教程(本地运行PHP+远程开发+快捷键)
2020/03/26 PHP
载入jQuery库的最佳方法详细说明及实现代码
2012/12/28 Javascript
javascript数组快速打乱重排的方法
2014/01/02 Javascript
AngularJS之依赖注入模拟实现
2016/08/19 Javascript
Vue.js 父子组件通讯开发实例
2016/09/06 Javascript
JS简单获取并修改input文本框内容的方法示例
2018/04/08 Javascript
JS/jQuery实现获取时间的方法及常用类完整示例
2019/03/07 jQuery
Element中的Cascader(级联列表)动态加载省\市\区数据的方法
2019/03/27 Javascript
Vue之beforeEach非登录不能访问的实现(代码亲测)
2019/07/18 Javascript
微信小程序定义和调用全局变量globalData的实现
2019/11/01 Javascript
[05:49]2014DOTA2TI4正赛第二日综述 昔日冠军纷纷落马 VG LGD占尽先机
2014/07/20 DOTA
[50:20]DOTA2上海特级锦标赛主赛事日 - 5 总决赛Liquid VS Secret第四局
2016/03/06 DOTA
[01:13:08]2018DOTA2亚洲邀请赛4.6 淘汰赛 mineski vs LGD 第二场
2018/04/10 DOTA
[52:07]完美世界DOTA2联赛PWL S3 LBZS vs access 第二场 12.10
2020/12/13 DOTA
Python中字典创建、遍历、添加等实用操作技巧合集
2015/06/02 Python
Python中使用OpenCV库来进行简单的气象学遥感影像计算
2016/02/19 Python
用Python设计一个经典小游戏
2017/05/15 Python
Python检测网络延迟的代码
2018/05/15 Python
对python 调用类属性的方法详解
2019/07/02 Python
在python中画正态分布图像的实例
2019/07/08 Python
python中自带的三个装饰器的实现
2019/11/08 Python
Python如何测试stdout输出
2020/08/10 Python
实列教程 一款基于jquery和css3的响应式二级导航菜单
2014/11/13 HTML / CSS
CSS3实现伪类hover离开时平滑过渡效果示例
2017/08/10 HTML / CSS
电子商务应届生求职信
2013/11/16 职场文书
护理专科自荐书范文
2014/02/18 职场文书
竞选班长自荐书范文
2014/03/09 职场文书
中共广东省委常委会党的群众路线教育实践活动整改方案
2014/09/23 职场文书
2014年英语教师工作总结
2014/12/03 职场文书
施工单位工程部经理岗位职责
2015/04/09 职场文书
2016年春节慰问信息大全
2015/11/30 职场文书
Python实现Excel文件的合并(以新冠疫情数据为例)
2022/03/20 Python
Win10 最新稳定版本 21H2开始推送
2022/04/19 数码科技