一、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 ;

。。。。。太过强大!

pm2常用命令

启动服务pm2 start [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 [options] 显示指定应用详情

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

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

停止指定应用pm2 stop [options] 停止指定应用

pm2 stop all //停止所有应用

pm2 stop [AppName] //根据应用名停止指定应用

pm2 stop [ID] //根据应用id停止指定应用

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

pm2 restart app.js //同时杀死并重启所有进程,短时间内服务不可用,生成环境慎用

pm2 reload app.js //重新启动所有进程,0秒重启,始终保持至少一个进程在运行

pm2 gracefulReload all //以群集模式重新加载所有应用程序

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

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

pm2 delete all //关闭并删除应用

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

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

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

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

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)

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

本文标题: 使用pm2部署node生产环境的方法步骤

本文地址: http://www.cppcns.com/wangluo/javascript/254121.html

使用pm2启动node文件_使用pm2部署node生产环境的方法步骤相关推荐

  1. 使用pm2启动node文件_使用 PM2 管理nodejs进程

    pm2 是一个带有负载均衡功能的Node应用的进程管理器. 当你要把你的独立代码利用全部的服务器上的所有CPU,并保证进程永远都活着,0秒的重载, PM2是完美的. 它非常适合IaaS结构,但不要把它 ...

  2. 宝塔部署node项目_宝塔面板部署 node.js 项目

    安装: Nginx 1.16.1 安装:MySQL 5.5.62 安装:PM2管理器 4.2.3 Nginx 配置如下: user www www; worker_processes auto; er ...

  3. FANUC机器人_三点法设置工具坐标系的具体方法步骤(图文)

    FANUC机器人_三点法设置工具坐标系的具体方法步骤 设置步骤可参考如下: 如下图所示,按下MENU键,选择"设定"-"坐标系"进入设置画面,

  4. FANUC机器人_程序轨迹编写和修改的具体方法步骤(图文)

    FANUC机器人_程序轨迹编写和修改的具体方法步骤 一. 修改标准动作指令 基本步骤可参考如下: 首先,点击"教点资料",如下图所示,

  5. k8s springboot 文件_用Kubernetes部署Springboot或Nginx,也就一个文件的事

    1 前言 经过<Maven一键部署Springboot到Docker仓库,为自动化做准备>,Springboot的Docker镜像已经准备好,也能在Docker上成功运行了,是时候放上Ku ...

  6. tensorflow图形识别_手把手教你使用TF服务将TensorFlow模型部署到生产环境

    摘要: 训练好的模型不知道如何布置到生产环境?快来学习一下吧! 介绍 将机器学习(ML)模型应用于生产环境已成为一个火热的的话题,许多框架提供了旨在解决此问题的不同解决方案.为解决这一问题,谷歌发布了 ...

  7. python网络框架生产环境_配置Django框架为生产环境的注意事项(DEBUG=False)

    问题描述: Django1.10版本中框架中settings.py配置文件 配置文件settings.py配置了下面两项: DEBUG=False ALLOWED_HOSTS= ['*'] #这样可以 ...

  8. vscode如何运行python新手教程_从零开始的TensorFlow+VScode开发环境搭建的步骤(图文)...

    VScode不愧是用户数量上升最快的编辑器,界面华丽(当然,需要配合各种主题插件),十分容易上手且功能强大.之前用它写C++体验十分nice,现在需要学习tensorflow,而工欲善其事必先利其器, ...

  9. linux java启动脚本文件_不错的linux下通用的java程序启动脚本

    #!/bin/sh #该脚本为Linux下启动java程序的通用脚本.即可以作为开机自启动service脚本被调用, #也可以作为启动java程序的独立脚本来使用. # #Author: tudaxi ...

最新文章

  1. linux平台下防火墙iptables原理(转)
  2. MySQL数据类型--------浮点类型实战
  3. 激光雷达与相机—哪种更适合自动驾驶?
  4. java-类(class)继承,重写,重构,抽象,接口等
  5. juggle dsl语法介绍及codegen浅析
  6. leetcode 326. 3的幂(Power of Three)
  7. OpenCV运行自定义OCR模型
  8. 基于.NetCore3.1系列 —— 认证授权方案之授权揭秘 (下篇)
  9. 解决SSH登录无响应timed out问题
  10. java对mysql读写权限设置_Java学习笔记——MySQL开放3306接口与设置用户权限
  11. mysql order by按照汉字拼音进行排序
  12. 设计干货|菜单 - 导航UI移动版模板
  13. python实验指导书答案函数代码复用_#Python学习笔记(5)函数和代码重用,复用
  14. 网络流24题 餐巾计划(DCOJ8008)
  15. shell脚本使用getopts自定义传入参数选项
  16. Eolink :通过构建 API 全生命周期管理体系,实现降本增效
  17. 如何进行信息化项目需求调研
  18. 从零开始构建 RPM 包
  19. logogo.exe威金变种病毒
  20. 把 14 亿中国人都拉到一个微信群,程序员在技术上能实现吗?

热门文章

  1. linux查看主机厂商,linux下查看主机硬件信息
  2. ajaxfileupload 返回值_用ajaxFileUpLoad上传文件不能正确取得返回值的问题
  3. 两位整数立方的尾数C语言,公务员考试部分数学题的固定算法
  4. ARM内核 和 linux内核
  5. MySQL外键设置中的的nbsp;Cascad…
  6. 可可猪:一只会选日子的猪
  7. 怎么通过硬盘装linux系统文件下载,通过硬盘上的镜像文件安装Linux操作系统
  8. blender基础1:水杯建模~超详细手把手教学,包学包会。
  9. ExcelVBA使用删除重复项获取不重复记录
  10. Bootstrap学习笔记——导航条、分页导航