使用pm2部署node生产环境的方法步骤


Posted in Javascript onMarch 09, 2019

一、PM2是什么

  • 是可以用于生产环境的Nodejs的进程管理工具,并且它内置一个负载均衡。它不仅可以保证服务不会中断一直在线,并且提供0秒reload功能,还有其他一系列进程管理、监控功能。并且使用起来非常简单。
  • 嗯嗯,最好的用处就是监控我们的生产环境下的node程序运行状态,让它给我们日以继日的处于工作状态。
  • pm2官方文档

二、为森么要使用pm2

  • 原始社会的我们开发node服务端程序一般过程:
    • 编写好node程序app.js,运行node app.js;或者写入script使用npm运行;打开浏览器访问;
    • 好像需要修改内容,浏览器对修改的内容没有显示出来?->node app.js->再次运行;
    • 浏览器忽然访问不到服务,好像出错啦?重启下->node app.js->再次运行;
    • 哎呀开了好多控制台窗口,一不小心关闭了,服务又访问不到了,继续打开控制台->node app.js->再次运行;
  • 好崩溃!好像有个工具nodemon;安装使用nodemon app.js;哇,可以自动监听文件修改变化自动重启,但是关闭控制台服务还是会被摧毁。
  • 通过这个很常用的场景,我们了解到要避免这些麻烦一个服务器至少需要有:后台运行和自动重启,这两个能力。
  • 再来看看使用pm2可拥有的能力:
    • 日志管理;两种日志,pm2系统日志与管理的进程日志,默认会把进程的控制台输出记录到日志中;
    • 负载均衡:PM2可以通过创建共享同一服务器端口的多个子进程来扩展您的应用程序。这样做还允许以零秒停机时间重新启动应用程序。
    • 终端监控:可以在终端中监控应用程序并检查应用程序运行状况(CPU使用率,使用的内存,请求/分钟等)。
    • SSH部署:自动部署,避免逐个在所有服务器中进行ssh。
    • 静态服务:支持静态服务器功能
    • 支持开发调试模式,非后台运行,pm2-dev start <appName>;
    • 。。。。。太过强大!

pm2常用命令

启动服务pm2 start <script_file|config_file> [options] 启动指定应用

pm2 start app.js        //启动app.js应用
pm2 start app.js --name app  //启动应用并设置name
pm2 start app.sh        //脚本启动

pm2 start app.js --watch  //监听模式启动,当文件发生变化,自动重启

//max 表示PM2将自动检测可用CPU的数量并运行尽可能多的进程
//max可以自定义,如果是4核CPU,设置为2则占用2个
pm2 start app.js -i max //启用群集模式(自动负载均衡)

pm2-dev start ... // 开发模式启动,即不启用后台运行

查看启动列表pm2 list

显示应用程序详细信息pm2 show <appName> [options] 显示指定应用详情

pm2 show [Name]   //根据name查看
pm2 show [ID]    //根据id查看

停止指定应用pm2 stop <appName> [options] 停止指定应用

pm2 stop all        //停止所有应用
pm2 stop [AppName]    //根据应用名停止指定应用
pm2 stop [ID]       //根据应用id停止指定应用

重启应用pm2 reload|restart <appName> [options] 重启指定应用

pm2 restart app.js    //同时杀死并重启所有进程,短时间内服务不可用,生成环境慎用
pm2 reload app.js    //重新启动所有进程,0秒重启,始终保持至少一个进程在运行
pm2 gracefulReload all  //以群集模式重新加载所有应用程序

启动静态服务器pm2 serve ./dist 8080将目录dist作为静态服务器根目录,端口为8080

删除应用pm2 delete <appName> [options] 删除指定应用;如果修改了应用配置行为,需要先删除应用,重新启动后方才会生效,如修改脚本入口文件;

pm2 delete all        //关闭并删除应用
pm2 delete [AppName]    //根据应用名关闭并删除应用
pm2 delete [ID]      //根据应用ID关闭并删除应用

pm2 kill 杀掉pm2管理的所有进程;

pm2 logs <appName> 查看指定应用的日志,即标准输出和标准错误

pm2 logs      //查看所有应用日志
pm2 logs [Name]  //根据指定应用名查看应用日志
pm2 logs [ID]   //根据指定应用ID查看应用日志

pm2 monit 监控各个应用进程cpu和memory使用情况;

PM2配置方式

命令生产默认示例配置文件pm2 ecosystem或pm2 init,运行默认会生成ecosystem.config.js配置文件

module.exports = {
 apps: [
  {
   name: 'back-Api',   //应用名
   script: './server/start.js',  //应用文件位置
   env: {
    PM2_SERVE_PATH: "./apidoc",  //静态服务路径
    PM2_SERVE_PORT: 8080,  //静态服务器访问端口
    NODE_ENV: 'development' //启动默认模式
   },
   env_production : {
    NODE_ENV: 'production' //使用production模式 pm2 start ecosystem.config.js --env production
   },
   instances:"max",     //将应用程序分布在所有CPU核心上,可以是整数或负数
   instance_var: "INSTANCE_ID",
   exec_mode: "cluster",
   watch:[
    "server",
   ], //监听模式,不能单纯的设置为true,易导致无限重启,因为日志文件在变化,需要排除对其的监听
   merge_logs: true,     //集群情况下,可以合并日志
  }
 ],
 deploy: {
   production : {
    user: 'node',           //ssh 用户
    host: '212.83.163.1',       //ssh 地址
    ref: 'origin/master',       //GIT远程/分支
    repo: 'git@github.com:repo.git',  //git地址
    path: '/var/www/production',    //服务器文件路径
    "post-deploy": 'npm install && pm2 reload ecosystem.config.js --env production' //部署后的动作
   }
 }
};

自定义json配置文件如:processes.json;启动pm2 start processes.json

{
   "apps": [{
    "name": "app", //名称
    "script": "./", //程序入口
    "cwd": "./",      //根目录
    "watch":[
      "views"
    ],//需要监控的目录
    "error_file":"./logs/err.log",//错误输出日志
    "out_file":"./logs/out.log", //日志
    "log_date_format":"YYYY-MM-DD HH:mm Z" //日期格式
    }]
  }

pm2常用配置项解析

1. apps:json结构,apps是一个数组,每一个数组成员就是对应一个pm2中运行的应用

2. name:应用程序名称"app"

3. cwd:应用程序所在的目录"./"

4. script:应用程序的脚本路径"./"

5. log_date_format: 日志文件名输出日期格式"YYYY-MM-DD HH:mm Z"

6. error_file:自定义应用程序的错误日志文件"./logs/app-err.log",

7. out_file:自定义应用程序日志文件"./logs/app-out.log"

8. instances: 应用启动实例个数,仅在cluster模式有效 默认为fork;或者 max

9. min_uptime:最小运行时间,这里设置的是60s即如果应用程序在60s内退出,pm2会认为程序异常退出,此时触发重启max_restarts设置数量

10. max_restarts:设置应用程序异常退出重启的次数,默认15次(从0开始计数)

11. cron_restart:定时启动,解决重启能解决的问题

12. watch:是否启用监控模式,默认是false。如果设置成true,当应用程序变动时,pm2会自动重载。这里也可以设置你要监控的文件。

13. "ignore_watch": [                           // 不用监听的文件
            "node_modules",
            "logs"
        ],
13. merge_logs:// 设置追加日志而不是新建日志

14. exec_interpreter:应用程序的脚本类型,这里使用的shell,默认是nodejs

15. exec_mode:应用程序启动模式,这里设置的是cluster_mode(集群),默认是fork

16. autorestart:启用/禁用应用程序崩溃或退出时自动重启,默认为true, 发生异常的情况下自动重启

17. vizion:启用/禁用vizion特性(版本控制)

18. "args": "", // 传递给脚本的参数

19. env: {
        PM2_SERVE_PATH: "./apidoc",    //静态服务路径
        PM2_SERVE_PORT: 8080,   //静态服务器访问端口
        NODE_ENV: 'development' //启动默认模式
      },

20. env_production : {
        NODE_ENV: 'production'  //使用production模式 pm2 start ecosystem.config.js --env production
      },

pm2配合log4js处理日志

1、pm2启动时通常会发现log4js记录不到日志信息;

2、解决方案,安装pm2的pm2-intercom进程间通信模块

3、在log4js的配置文件logger.js里添加如下命令:

pm2: true, 
pm2InstanceVar: 'INSTANCE_ID'

4、pm2配置文件中添加"instance_var": "INSTANCE_ID", // 添加这一行 字段

5、发现如果没有设置群集模式"exec_mode": "cluster",也会记录不到;

其他

log4js日志配置使用详情Koa日志中间件封装开发(log4js)

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

Javascript 相关文章推荐
js调试工具console.log()方法查看js代码的执行情况
Aug 08 Javascript
jQuery Ajax中的事件详细介绍
Apr 16 Javascript
Jquery和JS获取ul中li标签的实现方法
Jun 02 Javascript
jQuery数据检索中根据关键字快速定位GridView指定行的实现方法
Jun 08 Javascript
DOM 事件的深入浅出(一)
Dec 05 Javascript
JavaScript利用正则表达式替换字符串中的内容
Dec 12 Javascript
JS中Select下拉列表类(支持输入模糊查询)功能
Jan 17 Javascript
react-redux中connect的装饰器用法@connect详解
Jan 13 Javascript
vue如何安装使用Quill富文本编辑器
Sep 21 Javascript
vue-router的使用方法及含参数的配置方法
Nov 13 Javascript
Vue 解决路由过渡动画抖动问题(实例详解)
Jan 05 Javascript
简单了解JavaScript弹窗实现代码
May 07 Javascript
Koa日志中间件封装开发详解
Mar 09 #Javascript
详解vue2.6插槽更新v-slot用法总结
Mar 09 #Javascript
Node.js Stream ondata触发时机与顺序的探索
Mar 08 #Javascript
详解JSON和JSONP劫持以及解决方法
Mar 08 #Javascript
Node.js Event Loop各阶段讲解
Mar 08 #Javascript
vue基础之data存储数据及v-for循环用法示例
Mar 08 #Javascript
vue.js使用v-model实现表单元素(input) 双向数据绑定功能示例
Mar 08 #Javascript
You might like
十天学会php之第九天
2006/10/09 PHP
snoopy 强大的PHP采集类使用实例代码
2010/12/09 PHP
ASP和PHP实现生成网站快捷方式并下载到桌面的方法
2014/05/08 PHP
Js 订制自己的AlertBox(信息提示框)
2009/01/09 Javascript
Jquery 自定义动画概述及示例
2013/03/29 Javascript
深入探讨javascript中的数据类型
2015/03/04 Javascript
全面解析Bootstrap中tab(选项卡)的使用方法
2016/06/06 Javascript
jquery实现多次上传同一张图片
2017/01/09 Javascript
AngularJS+bootstrap实现动态选择商品功能示例
2017/05/17 Javascript
nodejs密码加密中生成随机数的实例代码
2017/07/17 NodeJs
React Native预设占位placeholder的使用
2017/09/28 Javascript
node内置调试方法总结
2018/02/22 Javascript
深入理解Vue 组件之间传值
2018/08/16 Javascript
vue spa应用中的路由缓存问题与解决方案
2019/05/31 Javascript
微信公众号平台接口开发 获取access_token过程解析
2019/08/14 Javascript
微信小程序实现吸顶特效
2020/01/08 Javascript
javascript设计模式 ? 中介者模式原理与用法实例分析
2020/04/20 Javascript
微信小程序学习总结(三)条件、模板、文件引用实例分析
2020/06/04 Javascript
Vue 中使用lodash对事件进行防抖和节流操作
2020/07/26 Javascript
如何利用JS将手机号中间四位变成*号
2020/09/29 Javascript
基于jQuery拖拽事件的封装
2020/11/29 jQuery
python 基础学习第二弹 类属性和实例属性
2012/08/27 Python
python类参数self使用示例
2014/02/17 Python
python实现网页链接提取的方法分享
2014/02/25 Python
Python中多个数组行合并及列合并的方法总结
2018/04/12 Python
Python数据类型之Tuple元组实例详解
2019/05/08 Python
Django+python服务器部署与环境部署教程详解
2020/03/30 Python
python中怎么表示空值
2020/06/19 Python
Python urllib库如何添加headers过程解析
2020/10/05 Python
python logging模块的使用详解
2020/10/23 Python
Html5饼图绘制实现统计图的方法
2020/08/05 HTML / CSS
函授自我鉴定
2013/11/06 职场文书
质量提升方案
2014/06/16 职场文书
法定代表人证明书
2014/11/28 职场文书
党校团干班培训心得体会
2016/01/06 职场文书
比较node.js和Deno
2021/04/27 Javascript