nodejs高大上的部署方式(PM2)


Posted in NodeJs onSeptember 11, 2018

如果直接通过node app来启动,如果报错了可能直接停在整个运行,supervisor感觉只是拿来用作开发环境的。再网上找到pm2.目前似乎最常见的线上部署nodejs项目的有forever,pm2这两种。

使用场合:

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

PM2的主要特性:

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

1、最常用的属nohup了,其实就是在后台执行进程,末尾加个&

[zhoujie@ops-dev ~]$ nohup node /home/zhoujie/ops/app.js &
[1] 31490nohup: ignoring input and appending output to `nohup.out'

即此时程序已启动,直接访问即可,原程序的的标准输出被自动改向到当前目录下的nohup.out文件,起到了log的作用。该命令可以在你退出帐户/关闭终端之后继续运行相应的进程。nohup就是不挂起的意思( no hang up)。

该命令的一般形式为:nohup command &

这个不太靠谱的样子,经常默默的进程在后台就挂了

2、用screen另开一个屏幕,这种方式可以直接在屏幕上看到程序运行情况

给该应用程序开个screen,如:screen -r ops ,用npm start启动,

退出该后台:ctrl + a,再按d,可不能直接ctrl +c,否则就退出了

这种方式很不专业,呵呵,不过方便看在生产环境的操作。

这个本质上用的forever,package.json里配置的:

"scripts": {
  "start": "forever app.js",
  "test": "supervisor app.js"
 },

3、PM2

使用它要先安装它,用root账号和全局模式安装一下:

npm install -g pm2

用它来启动程序(在当前目录下可以直接启动,pm2 start app.js --name uops)

[zhoujie@ops-dev uops]$ pm2 start app.js 
[PM2] Spawning PM2 daemon
[PM2] Success
[PM2] Process app.js launched
┌──────────┬────┬──────┬─────┬────────┬───────────┬────────┬─────────────┬──────────┐
│ App name │ id │ mode │ PID │ status │ restarted │ uptime │   memory │ watching │
├──────────┼────┼──────┼─────┼────────┼───────────┼────────┼─────────────┼──────────┤
│ app   │ 0 │ fork │ 308 │ online │     0 │ 0s   │ 21.879 MB  │ disabled │
└──────────┴────┴──────┴─────┴────────┴───────────┴────────┴─────────────┴──────────┘
 Use `pm2 info <id|name>` to get more details about an app
[zhoujie@ops-dev uops]$

看,它显示了Success,程序已经默默的成功的启动了,可以实时监控程序的运行,比如执行个pm2 restart,则上述restarted那栏变成1,可以显示程序运行了多长时间、占用内存大小,实在是太赞啦!

nodejs高大上的部署方式(PM2)

终止程序也很简单:pm2 stop

nodejs高大上的部署方式(PM2)

列举出所有用pm2启动的程序:pm2 list

[zhoujie@ops-dev uops]$ pm2 list
┌──────────┬────┬──────┬─────┬────────┬───────────┬────────┬─────────────┬──────────┐
│ App name │ id │ mode │ PID │ status │ restarted │ uptime │   memory │ watching │
├──────────┼────┼──────┼─────┼────────┼───────────┼────────┼─────────────┼──────────┤
│ app   │ 0 │ fork │ 984 │ online │     1 │ 3s   │ 64.141 MB  │ disabled │
└──────────┴────┴──────┴─────┴────────┴───────────┴────────┴─────────────┴──────────┘
 Use `pm2 info <id|name>` to get more details about an app

查看启动程序的详细信息:pm2 describe id

[zhoujie@ops-dev uops]$ pm2 desc 0
Describing process with pid 0 - name app
┌───────────────────┬─────────────────────────────────────────┐
│ status      │ online                 │
│ name       │ app                   │
│ id        │ 0                    │
│ path       │ /home/zhoujie/uops/app.js        │
│ args       │                     │
│ exec cwd     │ /home/zhoujie/uops           │
│ error log path  │ /home/zhoujie/.pm2/logs/app-error-0.log │
│ out log path   │ /home/zhoujie/.pm2/logs/app-out-0.log  │
│ pid path     │ /home/zhoujie/.pm2/pids/app-0.pid    │
│ mode       │ fork_mode                │
│ node v8 arguments │                     │
│ watch & reload  │ ✘                    │
│ interpreter    │ node                  │
│ restarts     │ 1                    │
│ unstable restarts │ 0                    │
│ uptime      │ 93s                   │
│ created at    │ 2015-01-07T09:41:25.672Z        │
└───────────────────┴─────────────────────────────────────────┘
[zhoujie@ops-dev uops]$

通过pm2 list命令来观察所有运行的进程以及它们的状态已经足够好了.但是怎么来追踪它们的资源消耗呢?别担心,用这个命令:pm2 monit

可以得到进程(以及集群)的CPU的使用率和内存占用(ctrl +c 退出)

nodejs高大上的部署方式(PM2)

实时集中log处理:pm2 logs

nodejs高大上的部署方式(PM2)

强大API: pm2 web

你想要监控所有被PM2管理的进程,而且同时还想监控运行这些进程的机器的状态,

[zhoujie@ops-dev uops]$ pm2 web
Launching web interface on port 9615
[PM2] Process /usr/local/node/lib/node_modules/pm2/lib/HttpInterface.js launched
[PM2] Process launched
┌────────────────────┬────┬──────┬──────┬────────┬───────────┬────────┬─────────────┬──────────┐
│ App name      │ id │ mode │ PID │ status │ restarted │ uptime │   memory │ watching │
├────────────────────┼────┼──────┼──────┼────────┼───────────┼────────┼─────────────┼──────────┤
│ app        │ 0 │ fork │ 984 │ online │     1 │ 9m   │ 74.762 MB  │ disabled │
│ pm2-http-interface │ 1 │ fork │ 1878 │ online │     0 │ 0s   │ 15.070 MB  │ disabled │
└────────────────────┴────┴──────┴──────┴────────┴───────────┴────────┴─────────────┴──────────┘
 Use `pm2 info <id|name>` to get more details about an app

启动程序的时候顺便在浏览器访问:http://localhost:9615

擦,我眼睛被亮瞎了,这么炫酷,竟然把部署的服务器的信息和程序的信息都显示出来了:

nodejs高大上的部署方式(PM2)

这东西对程序运行的监控页面的开发实在是太有帮助了,呵呵~~

监控:pm2 monit
实时集中log处理: pm2 logs
API:pm2 web (端口:9615 )

常用命令总结:

  • $ 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里。如下:

通过npm run start来启动。

关于pm2远程部署到多台机器,参考:http://pm2.keymetrics.io/docs/usage/deployment/

官网:http://pm2.keymetrics.io/docs/usage/quick-start/

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

NodeJs 相关文章推荐
轻松创建nodejs服务器(3):代码模块化
Dec 18 NodeJs
NodeJS学习笔记之(Url,QueryString,Path)模块
Jan 13 NodeJs
nodejs 整合kindEditor实现图片上传
Feb 03 NodeJs
深入nodejs中流(stream)的理解
Mar 27 NodeJs
nodejs前端自动化构建环境的搭建
Jul 26 NodeJs
详解NODEJS基于FFMPEG视频推流测试
Nov 17 NodeJs
Nodejs模块载入运行原理
Feb 23 NodeJs
NodeJS 实现多语言的示例代码
Sep 11 NodeJs
详解nodejs解压版安装和配置(带有搭建前端项目脚手架)
Dec 06 NodeJs
Nodejs中怎么实现函数的串行执行
Mar 02 NodeJs
NodeJs 模仿SIP话机注册的方法
Jun 21 NodeJs
NodeJs使用webpack打包项目的方法详解
Feb 28 NodeJs
Nodejs使用Mongodb存储与提供后端CRD服务详解
Sep 04 #NodeJs
Nodejs Express 通过log4js写日志到Logstash(ELK)
Aug 30 #NodeJs
NodeJS如何实现同步的方法示例
Aug 24 #NodeJs
Nodejs中的JWT和Session的使用
Aug 21 #NodeJs
nodejs 如何手动实现服务器
Aug 20 #NodeJs
nodejs实现一个word文档解析器思路详解
Aug 14 #NodeJs
NodeJs项目中关闭ESLint的方法
Aug 09 #NodeJs
You might like
PHP执行zip与rar解压缩方法实现代码
2010/12/05 PHP
匹配csdn用户数据库与官方用户的重合度并将重叠部分的用户筛选出来
2011/12/25 PHP
php学习笔记之面向对象编程
2012/12/29 PHP
PHP与MYSQL中UTF8 中文排序示例代码
2014/10/23 PHP
使用Thinkphp框架开发移动端接口
2015/08/05 PHP
浅谈使用 Yii2 AssetBundle 中 $publishOptions 的正确姿势
2017/11/08 PHP
PHP自动生成缩略图函数的源码示例
2019/03/18 PHP
php输出形式实例整理
2020/05/05 PHP
JavaScript 学习笔记 Black.Caffeine 09.11.28
2009/11/30 Javascript
javascript数组去重的六种方法汇总
2015/08/16 Javascript
原生js实现焦点轮播图效果
2017/01/12 Javascript
详解angularJs中关于ng-class的三种使用方式说明
2017/06/02 Javascript
ajax请求data遇到的问题分析
2018/01/18 Javascript
JavaScript 继承 封装 多态实现及原理详解
2019/07/29 Javascript
vue下canvas裁剪图片实例讲解
2020/04/16 Javascript
vue实现购物车加减
2020/05/30 Javascript
使用Python中的cookielib模拟登录网站
2015/04/09 Python
详解Python多线程Selenium跨浏览器测试
2017/04/01 Python
Pandas之drop_duplicates:去除重复项方法
2018/04/18 Python
Python快速查找list中相同部分的方法
2018/06/27 Python
使用Python实现在Windows下安装Django
2018/10/17 Python
详解Python静态网页爬取获取高清壁纸
2019/04/23 Python
如何基于Python制作有道翻译小工具
2019/12/16 Python
属性与 @property 方法让你的python更高效
2020/09/21 Python
python中用ctypes模拟点击的实例讲解
2020/11/26 Python
python反扒机制的5种解决方法
2021/02/06 Python
python实现MySQL指定表增量同步数据到clickhouse的脚本
2021/02/26 Python
如何查找网页漏洞
2016/06/22 面试题
教师自我鉴定
2013/12/13 职场文书
优秀乡村医生事迹材料
2014/05/28 职场文书
资源环境与城乡规划管理专业自荐书
2014/09/26 职场文书
承德避暑山庄导游词
2015/02/03 职场文书
开学典礼观后感
2015/06/15 职场文书
军训心得体会范文(2016最新篇)
2016/01/11 职场文书
2016党员干部政治学习心得体会
2016/01/23 职场文书
Python+OpenCV实现在图像上绘制矩形
2022/03/21 Python