目前Nodejs开发中有很多痛点,其中有一个是修改完代码以后需要我们重启服务才能看到效果。这样一次次的杀进程、重启,杀进程、重启很让人头大。程序员是最痛恨重复工作的物种,之前有了解过的同学可能知道 forever 。 forever 可以帮我们解决上面的问题,通过对资源变化的检测做到变化后自动重启。开发阶段我们使用 node file.js 来启动另外由于Nodejs的单线程,任何异常都会导致整个服务中断,这对于生产上长时间提供服务的程序来讲是不可以的, forever 可以帮我们在异常后重启,保证服务一直在线,我想这也就是它名字的由来吧。但我想说的是 forever 不够“高!大!上!”。接下来我要介绍一个足够高大上的神器– pm2

简介

pm2 = P (rocess) M (anager)2,是可以用于生产环境的Nodejs的进程管理工具,并且它内置一个负载均衡。它不仅可以保证服务不会中断一直在线,并且提供0秒reload功能,还有其他一系列进程管理、监控功能。并且使用起来非常简单。下面我将把我的使用过程分享出来,Nodejs应用是一个基于Express 4.x的应用,名称是 Wolverine 。

安装

环境清单:

  • windows7 x64
  • node v5.0.0
  • npm 3.3.6

全局安装 pm2

$ npm install pm2 -g

更新

$ pm2 update

启动

直接启动的命令: pm2 start *** --watch (修改名称 --name="")

以前启动 Wolverine 是利用package.json的 scripts 来实现的,只需要执行 npm run start 就可以启动,配置如下:

"scripts": {
"start": "node ./bin/www",
"debug": "node debug ./bin/www" },

使用 pm2 我们可以在start处配置成 pm2 ./bin/www ,命令后面支持加参数来实现watch、cluster多进程模式等功能。我不太喜欢一大串的命令,于是我使用了配置文件的方式。

在 Wolverine 的根目录,我创建了一个 processes.json 配置文件,配置文件内容如下,注释写的也很清楚了

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

随后,我在package.json中增加了一条

"pm2": "pm2 start processes.json"

在启动就直接输入如下命令就好:

$ npm run pm2

看到下面的界面,就启动成功了,然后我们就可以关掉这个窗口了,服务不会因此停止,是不是高大上多了。

管理和监控

启动成功的界面会展示App name和id,这两个值很重要。当然这两个值都可以在processes.json配置文件进行配置。

打开命令行,在任何路径下,输入

$ pm2 list

就能看到启动时的图表界面,方便我们查看所有通过pm2管理的Nodejs服务。

输入,下面命令配合id或者name可以查看某一个进程的详细信息

$ pm2 show Wolverine 或者
$ pm2 show 0

内容涉及重启次数、运行时间、脚本路径、参数、日志路径、运行模式等等信息

输入

$ pm2 monit

停止、重启等命令

$ pm2 stop [app-name|id]  #停止某一个进程,可以使用app-name或者id
$ pm2 stop all #停止所有进程 $ pm2 restart all #重启所有的进程 $ pm2 delete [app-name|id]#删除并停止进程
$ pm2 delete all #删除并停止所有进程

可以进一步查看每一个服务的cpu、内存动态占用情况。

日志监控

如果你一直使用 tail -f log_file.log log_error.log 来查看日志,你可能会爱上下面的这个功能。

$ pm2 logs
$ pm2 logs [app-name]

我们可以实时查看全部进程的日志,或者只查看某一个。我们甚至可以使用json格式查看日志。

$ pm2 logs --json

windows下创建服务

  1. npm i pm2 -g
  2. npm i pm2-windows-service -g
  3. 安装服务:pm2-service-install -n niumowangya (安装后在windows服务中多了一个 niumowangya 的服务); ##卸载pm2-service-uninstall
  4. 设置环境变量:PM2_SERVICE_SCRIPTS = PM2的配置文件( .pm2) or PM2_HOME=D:\.pm2(自己安装的PM2配置的路径);
  5. windows服务中重新启动myservice服务

linux下创建服务

https://pm2.io/doc/en/runtime/guide/startup-hook/?utm_source=pm2&utm_medium=website&utm_campaign=rebranding#next-steps

nodejs部署方式-pm2的更多相关文章

  1. nodejs高大上的部署方式-PM2

    1.最常用的属nohup了,其实就是在后台执行进程,末尾加个&   [zhoujie@ops-dev ~]$ nohup node /home/zhoujie/ops/app.js & ...

  2. nodejs部署配置pm2

    高大上先上部署node方式: 直接通过node app来启动,如果报错了可能直接停在整个运行, supervisor感觉只是拿来用作开发环境的. 目前似乎最常见的线上部署nodejs项目的有forev ...

  3. nodejs在Liunx上的部署生产方式-PM2

    先安装:npm install -g pm2 (注意:使用它要先安装它,用root账号和全局模式安装一下) 安装完成使用:pm2 -v 查看版本信息 安装成功之后,启动nodejs项目:pm2 sta ...

  4. node程序的部署神器pm2的基本使用

    pm2是从nodejs衍生出来的服务器进程管理工具,可以做到开机就启动nodejs.当然了,也可以用nohup来做这件事情的. 前言 众所周知,Node.js运行在Chrome的JavaScript运 ...

  5. 介绍几种SSIS部署方式

    介绍 如果你已经开发完一个不错的SSIS包并且能够在你的本地完美的运行,每个任务都亮起绿色的通过标志.这时为了能够让这个包处理能够在指定时间运行,你需要将其发布到一个服务器上,并做好相关配置.作为开发 ...

  6. 到底应该选择那种Linux.NET的部署方式?

    当前部署Linux.NET环境的方式可谓是五花八门,既有传统的源码编译的方式.又有各式各样的一键安装脚本.还有绿色包安装方式,而随着Mono官方的新站上线,更增加了采用RPM包的部署方式.那对于一名L ...

  7. 使用Kylin构建企业大数据分析平台的4种部署方式

    本篇博客重点介绍如何使用Kylin来构建大数据分析平台.根据官网介绍,其实部署Kylin非常简单,称为非侵入式安装,也就是不需要去修改已有的 Hadoop大数据平台.你只需要根据的环境下载适合的Kyl ...

  8. .NET Core应用程序的2种部署方式

    1. Portable 共享.NET Core运行时环境与程序集依赖,部署的目标机器上需要事先安装.NET Core SDK,这是.NET Core的默认部署方式. 2. Self-contained ...

  9. ThinkPHP 学习笔记 ( 一 ) 项目部署:应用部署方式与模块分组部署方式

    /** * ThinkPHP version 3.1.3 */ ThinkPHP ( 官方网站:http://www.thinkphp.cn/ ) 目前最新版本是 3.2.2,它要求 PHP 的版本高 ...

随机推荐

  1. nginx.conf添加lua.conf配置

    1.在nginx的conf下配置lua.conf......vi lua.conf server { listen ; server_name _; location /lua { default_t ...

  2. 源码安装Nginx加TCP反向代理模块

    说明: 安装方式是源码编译安装,因此先安装相关依赖,否则报错. yum -y install gcc* patch openssl openssl-devel 安装步骤: 下载nginx源码包: wg ...

  3. C# 《编写高质量代码改善建议》整理&笔记 --(五)类型设计

    1.区分接口和抽象类的应用场合 区别: ①接口支持多继承,抽象类则不能. ②接口可以包含方法,属性,索引器,事件的签名,但不能有实现,抽象类则可以. ③接口在增加新方法后,所有的继承者都必须重构,否则 ...

  4. Spring Boot 中的静态资源到底要放在哪里?

    当我们使用 SpringMVC 框架时,静态资源会被拦截,需要添加额外配置,之前老有小伙伴在微信上问松哥Spring Boot 中的静态资源加载问题:"松哥,我的HTML页面好像没有样式?& ...

  5. [翻译] Linux 内核中的位数组和位操作

    目录 Linux 内核里的数据结构 原文链接与说明 Linux 内核中的位数组和位操作 位数组声明 体系结构特定的位操作 通用位操作 链接 Linux 内核里的数据结构 原文链接与说明 https:/ ...

  6. .net后台防止API接口被重复请求

    思路大概是这样的: 1.获取到发出请求的客户端的IP 2.将该IP存入Cache作为KEY,将次数作为Value初始化为0,过期时间设置为1分钟 3.每次请求都将value+1,超过指定的次数后返回f ...

  7. AngularJs with Webpackv1 升級到 Webpack4

    本篇記錄一下升級的血淚過程 請注意升級前請先創一個新目錄將升級應用與舊應用隔離 1. 需要將相關的套件做統一升級的動作,已確認需要升級所有舊的loaders 其它應用的套件可先不做升級的動作 (如果編 ...

  8. java_方法引用

    什么是方法引用? 个人简述方法引用: 方法引用主要是针对已经有的方法来让目前的编程更加简洁 当我们想要使用一个接口的子类的时候,子类需要重写这个接口中的抽象方法, 被重写的这个方法参数列表固定,返回值 ...

  9. oracle学习笔记(七) 预编译Statement介绍与使用

    预编译Statement优点 执行效率高 由于预编译语句使用占位符 "?",在执行SQL之前语句会被先发送到Oracle服务器进行语法检查和编译等工作,并将SQL语句加入到Orac ...

  10. .net面向对象设计原则

    稳定的框架来源于好的设计,好的设计才能出好的作品,掌握面向对象基本原则才会使我们的设计灵活.合理.不僵化,今天就来谈一谈我们.net 面向对象设计的基本原则. 对于一个没有任何设计经验的开发者来说,如 ...