在生产环境中运行PM2和Node.js

时间: 2019-07-04阅读: 1065标签: pm2

在Stream,我们构建了许多应用程序来展示我们的服务所提供的出色功能。对于几乎所有的应用程序,我们都将它们放在一个云服务器上—通常是DigitalOcean或AWS EC2。

虽然维护代码库和维持它的相关性是有困难的,但我们发现,在维护应用程序时,最具挑战性的是保持它的活动和运行。

此外,由于Node.js是大多数后端API的核心语言,因此很难扩展单个线程进程;这就是PM2发挥作用的地方,也是我们如此喜欢使用它的原因。

现在有很多流程管理器,最著名的是Forever、StrongLoop的流程管理器和good ol ' SystemD。还有PM2,下载量超过6000万次,GitHub之星达到2.5万颗(而且还在不断上升!)我们喜欢PM2,因为简单地说,它易于使用,并且可以完美的管理生产环境。


PM2是什么呢?

PM2是一个经过测试的,Node.js应用程序的生产运行时和进程管理器。它还配备了内置的负载均衡器,使扩展应用程序更加容易。最重要的是,它可以在Linux、Windows和MacOS上工作。

我们使用配置文件(process.json),就可以指定要运行哪些进程以及要扩展到多少进程。启动PM2时,可以指定process.json文件,而PM2负责其余的事务。所有这些都意味着PM2允许我们永远保持Node.js应用程序的活跃,而且还是0秒停机重载,维护升级的时候不需要停机。


安装PM2 
安装PM2简直就是小菜一碟。首先,您需要确保process.json文件已经准备好进入代码,这样我们就可以开始这个过程了。如果您在MacOS上,是非常简单的,用yarn安装PM2就可以了。如果您在Linux、Windows或使用Docker容器(是的,它也支持Docker),请按照这里的说明操作。如果您想知道它应该是什么样子的话,下面是一个用于Winds的process_prod.json文件的示例,这是我们的开源rss和播客应用程序。

{
  "apps": [
    {
      "name": "api",
      "cwd": "api/dist",
      "script": "server.js",
      "watch": false
    },
    {
      "name": "conductor",
      "cwd": "api/dist/workers",
      "script": "conductor.js",
      "watch": false
    },
    {
      "name": "rss-worker",
      "cwd": "api/dist/workers",
      "script": "rss.js",
      "instances": 2,
      "exec_mode": "cluster",
      "watch": false
    },
    {
      "name": "podcast-worker",
      "cwd": "api/dist/workers",
      "script": "podcast.js",
      "instances": 2,
      "exec_mode": "cluster",
      "watch": false
    },
    {
      "name": "og-worker",
      "cwd": "api/dist/workers",
      "script": "og.js",
      "instances": 2,
      "exec_mode": "cluster",
      "watch": false
    }
  ]
}

正如您所见,我们正在运行多个进程,而PM2在没有任何问题的情况下处理它们,使用Node.js集群API自动生成多个进程。


提示和技巧 
对于任何应用程序(我们这里是进程管理器),最好从以前使用过它的人那里了解一些技巧。


自动重启

一旦启动,您的应用程序将永远保持活动状态,在崩溃和机器重新启动后自动重新启动-所有这些都只需要一个简单的命令:pm2 startup


进程管理


无论运行多少应用程序,PM2都有一套指令,是我们可以分别管理它们各自的状态。下面是一些我们常用的一些的指令(无先后顺序):
pm2 start process_prod.json-通过进程json文件启动进程
pm2 ls-显示所有应用程序的列表
pm2 stop <app>-停止一个特定的应用程序
pm2 start <app>-启动一个特定的应用程序
pm2 <app> scale N-将您指定的应用程序缩放到N个实例(可用于扩大或缩小)
pm2 kill-杀死所有正在运行的应用程序
pm2 restart-重新启动所有正在运行的应用程序
pm2 reload-重新加载应用程序配置(当您修改应用程序的环境变量时,这很方便)


进程管理


运行指令pm2 monit将返回关于应用程序健康状况的丰富数据集。例如,您将看到CPU利用率、内存使用量、请求/分钟等等!


日志管理

PM2有内置的日志管理。它汇聚里来自所有应用程序的日志数据,并将其写入单个源以供查看。您甚至可以实时跟踪日志,以查看应用程序的幕后情况。来自PM2的日志管理也伴随着日志循环,这一点非常重要,尤其是当应用程序频繁地输出冗长的日志时。

我经常使用三个命令,你也应该这样做:
pm2 logs—从所有运行的应用程序输出日志
pm2 logs app—仅从应用程序输出日志
pm2 flush—刷新所有日志数据,释放磁盘空间
记住,要做的最重要的事情是启用日志循环。这样做将把一个巨大的日志文件分割成许多更小的文件,这些文件对于PM2来说更便于管理。为此,运行以下指令:
pm2 install pm2-logrotate
有关日志管理的更多信息可以在这里找到。

如果您发现您的服务器上经常充满日志,请考虑使用集中式日志服务,如Loggly、Papertrail或ELK。


最佳做法 
总的来说,我喜欢遵循应用程序The Twelve-Factor App中列出的惯例。它们将帮助您充分利用PM2。如果你还没有读过这份宣言,它可以归结为以下12条规则:

1.在修订控制中监测一个代码基,有效利用多个代码基 
2.显式声明和隔离依赖项 
3.在环境中存储配置 
4.将支持服务视为附加资源 
5.严格分开构建和运行阶段 
6.将应用程序作为一个或多个无状态进程执行 
7.通过端口绑定导出服务 
8.通过流程模型向外扩展 
9.以快速启动和优雅的关机最大化鲁棒性 
10.保持开发、分期和生产尽可能相似 
11·将日志视为事件流 
12· 一次性运行管理任务

如果您遵循上面的规则,您将能够有效地使用PM2扩展任何应用程序,并且几乎没有错误。今天的分享就到这里,希望本文能帮助到您!


站长推荐

1.云服务推荐: 国内主流云服务商,各类云产品的最新活动,优惠券领取。地址:阿里云腾讯云华为云

链接: http://www.fly63.com/article/detial/4511

PM2实现Nodejs项目自动部署

首先简单说下思路:本地git仓库与远程仓库关联(github、码云等平台),然后pm2按照指定配置登录服务器,拉取远程仓库的代码更新,再执行一些指定的命令(如打包等)。

pm2的使用与总结,一款node.js服务器管工具

pm2的使用心得,Node服务常使用的工具是pm2和forever,通过它可以是node的服务在后台运行。通过pm2对node进程的管理,可以简化很多繁琐的任务,例如性能监控、自动重启、负载均衡等

pm2常用指令

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

pm2管理node服务

全局安装pm2;检测pm2是否安装成功,在命令行输入pm2 -v;先查看pm2路径;从全局路径随便选一个,把pm2路径软连接到全局路径上

pm2 命令使用

启动时指定日志存放的文件位置;使用配置文件的方式.注意: 如果你已经启动过了项目,那么再次启动项目时指定的日志路径是不生效的,需要先在pm2实例列表中把该项目清除掉,按照id单个清除如:pm2 delete [id] 或者全部清除掉 pm2 delete all

探索 PM2 Cluster 模式下 Log4js 日志丢失

Node 应用为单线程应用,JS 虽可利用异步 I/O 避免线程阻塞,但无法利用多核 CPU 的优势提升运行效率,提高吞吐量仍需多线程。Node Cluster 可产生多个工作线程共享同一 TCP 连接,主线程通过 IPC 通道与工作线程通讯,并使用 Round-robin 负载均衡极好的处理线程间压力。

PM2_ Node 应用的进程管理器

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

使用pm2快速将项目部署到远程服务器

当我们需要将项目部署到远程线上服务器时;传统的方法可能就是:将本地代码通过ssh、ftp等方式上传到服务器;然后通过ssh登入到服务器,配置好环境;手动启动应用。太过手动化,麻烦,操作繁琐。

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!