Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >[译] 在生产环境运行 PM2 & Node.js

[译] 在生产环境运行 PM2 & Node.js

作者头像
江米小枣
发布于 2020-06-15 12:12:01
发布于 2020-06-15 12:12:01
1.7K00
代码可运行
举报
文章被收录于专栏:云前端云前端
运行总次数:0
代码可运行

原文:https://medium.com/hackernoon/running-pm2-node-js-in-production-environments-13e703fc108a

维护你的代码库并保持其相关性确有难度;但与之相比我们会发现,维护一个应用时最大的挑战来自于保持其存活和运行。不仅如此,随着 Node.js 变成大部分后端 API 的核心语言,单线程程序的伸缩也变得困难;这就是 PM2 出现并受到欢迎的原因了。

有很多进程管理工具,广为人知的如 Forever、strong-pm,或是不错的 Linux 系统工具 SystemD。还有就是本文的主角 PM2,有着 4100 多万的总下载量和 31k GitHub stars(译注:截止本文翻译时)。究其原因,简单地说,就是其简单易用并且让管理一个生产环境变得天衣无缝。

何为 PM2?

正如其新版首页中所标榜的,PM2 是一个“身经百战(battle hardened)”的、适用于生产环境的 Node.js 应用运行时和进程管理工具。也自带了内建的 负载均衡器,这使得扩展应用愈加容易。最棒的是,它在 Linux、Windows 和 macOS 都能工作。

通过一个 process.json 配置文件(译注:该文件可自行命名,一般叫做 process.json、processes.json 或 ecosystem.json,该名称将作为参数传入 pm2 start 等命令中),你可以指定想要运行的进程及要扩展到多少个进程。当启动 PM2 时,它将根据以上配置文件处理其他所有的事情(甚至比配置文件指定的更多一些 ?)。

所有这些意味着 PM2 能帮助你保持 Node.js 应用永远运行下去,并在你更新应用或服务器时以 0 故障停机时间自动重启。

安装 PM2

安装 PM2 就是小菜一碟。首先,确保你已经配置好了 process.json 文件,用以启动进程。

一般只需运行 yarn add global pm2 即可安装。如果使用了一个 Docker 容器(对,也支持 Docker),按照 https://pm2.keymetrics.io/docs/usage/docker-pm2-nodejs/ 中的说明安装。

如果你实在好奇它看起来长什么样,这里有一个 process_prod.json 文件的例子,用于一个开源的 RSS & 播客 应用:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// process_prod.json

{
  "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", // 启动模式,默认为 fork
      "watch": false, // 如果允许 watch,则其中的文件改变会引发重启
      "max_memory_restart": "150M" // 引发重启的最大内存使用量
    }
  ]
}

如你所见,我们运行了若干个进程,并且 PM2 轻松掌控了一切;其自动地使用了 Node.js 的 Cluster API 以实现多进程。

译注:配置文件的完整介绍见 https://pm2.keymetrics.io/docs/usage/application-declaration/#ecosystem-file

技巧 & 经验

对于任何应用(或者本例中的进程管理工具),从先行者那里了解一些技巧和经验都是有好处的。

自动重启

一旦 PM2 启动,你的应用就将永远存活,并在应用崩溃和机器重新启动后自动重启 -- 所有这些只消一条简单的命令(用于获得针对所在机器的自动配置过的启动脚本):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pm2 startup

如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ pm2 startup
[PM2] You have to run this command as root. Execute the following command:
      sudo su -c "env PATH=$PATH:/home/unitech/.nvm/versions/node/v4.3/bin pm2 startup <distribution> -u <user> --hp <home-path>

只要按照打印的结果,拷贝并运行得到的脚本就行了。

进程管理

不管你运行了多少个应用,PM2 的一套命令都能让你管理它们各自的状态。以下是常用的一些命令(不区分顺序):

  • pm2 start process_prod.json — 通过进程配置文件启动进程
  • pm2 ls — 列出所有的应用
  • pm2 stop <app> — 停止指定的应用
  • pm2 start <app> — 启动指定的应用
  • pm2 <app> scale N — 缩放指定应用的实例数量
  • pm2 kill — 杀掉所有运行中的应用
  • pm2 restart — 重启所有运行中的应用
  • pm2 reload — 重新加载应用配置(这会在你修改了应用的环境变量时派上用场)

进程监控

运行命令 pm2 monit 会返回关于应用健康的丰富数据。比如,你将看到 CPU 利用率、内存使用量、请求分钟数等等。

日志管理

PM2 内建了日志管理功能。它从所有你的应用中聚合日志数据,并将其写入一个用于阅读的源文件中。你甚至可以通过事实跟踪日志来看到应用背后正在发生什么。PM2 的日志管理也提供了日志循环,这一点非常重要,特别是当应用程序频繁地输出详细日志时。

有三条我经常使用的命令,想必你也应该一样:

  • pm2 logs — 从所有正在运行的应用中输出日志
  • pm2 logs <app> — 只从指定的应用中输出日志
  • pm2 flush — 刷新所有日志数据,释放磁盘空间

请记住,确保日志循环是最重要的事情。这样做将会把一个巨大的日志文件分割成若干易于 PM2 管理的小文件。要做到这点,运行如下命令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pm2 install pm2\-logrotate

日志管理的更多信息可以在 https://pm2.keymetrics.io/docs/usage/log-management/ 找到。

如果发现你的实例经常被日志填满,也可以考虑使用一个集中式日志服务,如 Loggly、Papertrail,或 ELK。

最佳实践

通常,我会乐于遵守 “应用十二因素”(https://12factor.net/)所述的实践。这将帮助你利用 PM2 所有的优势。如果你已经阅读过其声明,应该见到了这 12 条规则:

  1. 一个置于版本控制下的代码库, 多份部署
  2. 明确地声明,并隔离依赖
  3. 在环境而非代码中存储配置
  4. 将后端服务视为附加资源
  5. 严格区分构建和运行阶段
  6. 以一个或多个无状态进程运行应用
  7. 通过端口绑定输出服务
  8. 通过进程模型扩展
  9. 通过快速启动和优雅地关闭保证最大的健壮性
  10. 尽可能保持开发和线上环境尽量一致
  11. 把日志视为事件流
  12. 以一次性进程的形式运行后台管理任务

如果遵守了以上规则,你将能够通过 PM2 高效而安全地扩展任何应用。

译注:如果用于商用软件,请自行评估其开源协议问题

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-01-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 云前端 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
PM2用监控模式实时更新Node.js项目!
一、问题简介 监控目录下所有文件,只要有文件更新就立刻重启。 二、解决方案 1、--watch 监控项目目录下所有文件,任意文件有改动,就自动重启 node.js 项目。 # 1、安装 pm2 npm install pm2 @latest -g # or yarn global add pm2 # 2、转到 node.js 项目根目录下 cd < 项目根目录 > # 3、用 pm2 启动 node.js 项目,项目目录下有文件改动就重启 pm2 start app.js--watch # 现在就可以
Learn-anything.cn
2021/11/26
3K0
为什么 Node 应用要用 PM2 来跑?
线上的 node 应用不只是跑起来就行了,还要做自动重启、日志、多进程、监控这些事情。
神说要有光zxg
2023/08/29
4950
为什么 Node 应用要用 PM2 来跑?
使用pm2部署node生产环境
一、PM2是什么 是可以用于生产环境的Nodejs的进程管理工具,并且它内置一个负载均衡。它不仅可以保证服务不会中断一直在线,并且提供0秒reload功能,还有其他一系列进程管理、监控功能。并且使用起来非常简单。 嗯嗯,最好的用处就是监控我们的生产环境下的node程序运行状态,让它给我们日以继日的处于工作状态。 pm2官方文档 ---- 二、为森么要使用pm2 原始社会的我们开发node服务端程序一般过程: 编写好node程序app.js,运行node app.js;或者写入script使用npm运行
keyWords
2019/03/20
4.1K0
PM2实用入门指南
简介 PM2是node进程管理工具,可以利用它来简化很多node应用管理的繁琐任务,如性能监控、自动重启、负载均衡等,而且使用非常简单。 下面就对PM2进行入门性的介绍,基本涵盖了PM2的常用的功能和
IMWeb前端团队
2018/01/08
1.7K0
PM2实用入门指南
PM2 进程管理工具使用总结
对于后台进程的管理,常用的工具是crontab,可用于两种场景:定时任务和常驻脚本。关于常驻脚本,今天介绍一款更好用的工具:pm2,基于nodejs开发的进程管理器,适用于后台常驻脚本管理,同时对node网络应用有自建负载均衡功能。官方的说法,pm2 是一个带有负载均衡功能的Node应用的进程管理器,个人认为,并不准确,因为pm2支持多种语言,只是对于除node之外的其他进程无负载均衡的能力。
波罗学
2019/07/31
2.8K0
PM2用Cluster Mode,不用修改代码即可提升Node.js项目性能!
cluster mode 就是在单台服务器上,开启多个相同 node.js项目 进程,共同处理网络请求服务,让 node.js项目 处理并发和响应速度达到最高性能。
Learn-anything.cn
2021/11/26
1.3K0
如何使用pm2自动部署Next.js项目
我们需要将通过上面教程生成的id_rsa.pub来实现本地免密登陆远程Centos服务器
Qwe7
2022/02/16
4.6K0
PM2源码分析
PM2 的项目结构算是比较简洁的了,主要的源码都在 lib 目录下, God 目录为核心功能多进程管理的实现,以及 API 目录则是提供了各种能力,包括 日志管理、面板查看系统信息以及各种辅助功能,最后就是 Sysinfo 目录下关于如何采集系统信息的实现了。
贾顺名
2020/08/31
1.2K0
记一下 pm2 常用配置及命令
PM2 是 node 进程管理工具,可以利用它来简化很多 node 应用管理的繁琐任务,如性能监控、自动重启、负载均衡等,而且使用非常简单。本文就 PM2 进行入门性的介绍,基本涵盖了 PM2 的常用的功能和配置。
ihoey
2018/10/31
5.1K0
Node之PM2 常用命令
引言:PM2 (github上的源码)是开源的基于Nodejs的进程管理器,包括守护进程,监控,日志的一整套完整的功能,基本是Nodejs应用程序不二的守护进程选择,事实上它并不仅仅可以启动Nodejs的程序,只要是一般的脚本的程序它同样可以胜任。
测试小兵
2019/11/20
8640
Node之PM2 常用命令
PM2 进程管理快速入门
PM2 是一个守护进程管理器,可帮助您管理和保持应用程序在线。开始使用 PM2 很简单,它以简单直观的 CLI 形式提供,可通过 NPM 安装。
buzzfrog
2023/09/26
5390
PM2 - 进程管理工具
PM2 是具有内置负载均衡器的 Node.js 应用程序的生产过程管理器。它允许您使应用程序永远保持活动状态,在不停机的情况下重新加载它们,并促进常见的系统管理任务。
崔哥
2023/10/23
4200
进程管理:通过PM2来管理Node、PHP CLI等应用的运行
PM2.js是一个Node.js应用程序的进程管理器,可以帮助开发人员在生产环境中管理和监控Node.js应用程序或其他程序的进程。它可以自动重启应用程序,监控应用程序的资源使用情况,以及提供实时日志记录和错误处理等功能。此外,PM2.js还可以通过集成的API和CLI工具来管理和监控多个Node.js应用程序。
房东的狗丶
2023/04/06
1.7K0
学习PM2,从这里开始!
查看 pm2 管理的 Node.js 进程,输出的日志信息(包括错误日志)。详情,看这里!
Learn-anything.cn
2021/11/26
5950
深入理解Node.js 进程与线程(8000长文彻底搞懂)
进程与 线程是一个程序员的必知概念,面试经常被问及,但是一些文章内容只是讲讲理论知识,可能一些小伙伴并没有真的理解,在实际开发中应用也比较少。本篇文章除了介绍概念,通过Node.js 的角度讲解 进程与 线程,并且讲解一些在项目中的实战的应用,让你不仅能迎战面试官还可以在实战中完美应用。
桃翁
2019/08/26
1.2K0
深入理解Node.js 进程与线程(8000长文彻底搞懂)
使用 pm2 守护你的 .NET Core 应用程序
守护进程,英文名:“daemon",也有守护神的意思。守护进程是一个在后台运行并且不受任何终端控制的进程,不会随着会话结束而退出。诸如 mysql、apache 等这类程序默认就提供了守护进程或者以守护进程的方式工作,我们熟悉的 “mysqld”、"httpd" 等其中的 d 就是 daemon 的意思。比如我们在 Linux 系统上以命令 dotnet xxx.dll 运行 .NET Core 应用程序时,如果我们结束会话,那么我们的程序将会结束运行。其原因是 Linux 系统中有一个信号机制,进程可以通过一系列信号进行通信,当用户结束会话时,会向当前会话的子进程发送一个 HUP 信号,一般情况下当前会话的子进程收到HUP信号以后就会退出自己。 这时我们就需要一个守护进程来管控我们的 .NET Core 应用程序进程。
晓晨
2018/10/12
1.5K0
使用 pm2 守护你的 .NET Core 应用程序
node运行 HTTP 服务
1.安装 PM2 npm install pm2 --global 2.PM2 来启动 HTTP 服务 pm2 start app.js 3.查看服务输出的日志 pm2 logs 4.重启服务 pm2 restart app 5.pm2 常用的命令 pm2 start app.js # 启动,守护进程和自动重启应用程序(Node) # 群集模式(仅限Node.js) pm2 start app.js -i 4 # 在群集模式下启动4个应用程序实例
用户1437675
2018/08/20
1.2K0
使用 PM2 在 Docker 上部署 Node.js Web 应用
作者:约克 原文地址:https://yorkyu.cn/pm2-deploy-nodejs-on-docker-1f8acea34fa4.html 文章版权归作者所有,转载请注明出处 背景 本文介绍 PM2 在 Docker 上部署 Node.js Web 应用。 PM2 是守护进程管理器,它将帮助您管理和保持 Nodejs 应用程序 24/7 在线。 Docker 是一个开放源代码软件,是一个开放平台,用于开发应用、交付(shipping)应用、运行应用。 Docker 允许用户将基础设施(Infras
Yorkyu
2022/03/22
3.8K0
使用 PM2 在 Docker 上部署 Node.js Web 应用
通过Node.js的Cluster模块源码,深入PM2原理
众所周知,Node.js中的JavaScript代码执行在单线程中,非常脆弱,一旦出现了未捕获的异常,那么整个应用就会崩溃。
Peter谭金杰
2020/05/09
3.1K1
通过Node.js的Cluster模块源码,深入PM2原理
使用pm2管理go应用进程
pm2是一个进程管理工具,可以用它来管理你的node进程,并查看node进程的状态,当然也支持性能监控,进程守护,负载均衡等功能,在前端和nodejs的世界中用的很多。
杨永贞
2020/08/11
3.9K0
使用pm2管理go应用进程
相关推荐
PM2用监控模式实时更新Node.js项目!
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验