使用 PM2 部署多个 Node.js 应用的经验

在当今互联网发展的快速背景下,Node.js成为了前端领域的不可或缺的一部分,特别是在实时性和高并发需求较高的领域,如Web应用程序、REST APIs、websocket服务、实时数据更新等,Node.js的优势尤为明显。

然而,在部署Node.js应用程序时,我们往往面临着一些挑战和问题,比如稳定性不够、性能瓶颈、负载均衡等,这些问题不仅会影响到应用程序的使用和体验,甚至还会直接影响到我们的业务进展。因此,如何解决这些问题,让Node.js应用程序健康稳定地运行,是我们很需要探索和学习的。

PM2是一个成熟的Node.js进程管理工具,它可以让我们更加方便的管理多个Node.js进程,并且可以自动化一些常见的任务,如负载均衡、服务器监控、高可用性等。本文将结合实例,分享一下如何使用 PM2 部署多个 Node.js 应用,然后通过它们来学习高可用、稳定性和负载均衡这些重要概念。

安装 PM2

首先,为了学习本文的内容,你需要安装Node.js和PM2。如果你已经安装好了Node.js,可以直接通过npm安装PM2:

--- ------- --- --

安装完成后,你可以使用pm2命令行工具来操作和管理进程了。

创建第一个Node.js应用程序

假设我们要创建一个Node.js的Web应用程序,这个应用程序只需响应客户端的HTTP请求并返回一些静态的文本内容。这个应用程序的代码很简单,只需要在当前目录下创建一个index.js文件,然后把下面的代码拷贝到文件中:

--- ---- - ----------------
--- ---- - ---------------- -- -----

------------------------------- ---- -
  ---------------------
  ------------------ ---------------- ---------------
  --------------- -----------
--------------- ---------- -
  ------------------- ------- -- ------------------ - ------
---

运行这个应用程序的命令是:

---- --------

现在可以使用浏览器或者curl等HTTP客户端请求这个应用程序,它会返回一个简单的“Hello, world!”文本。到此,我们已经创建好了我们的第一个Node.js应用程序了。

使用 PM2 启动应用程序

接下来,我们使用PM2来操作Node.js应用程序,并且让应用程序在PM2下自动化管理。打开终端,切换到应用程序所在的目录,然后运行下面的命令来启动应用程序:

--- ----- -------- ------ ---------

这个命令会让PM2启动我们的应用程序,并且给它起一个名字first-app,这个名字将作为PM2管理这个进程的唯一标识。

通过使用下面的命令,可以查看此时PM2正在管理的进程:

--- --

输出应该如下所示:

-----------------------------------------------------------
- --  - ----     - -------  - ----  - ---     - ------    -
-----------------------------------------------------------
- -   - --------- - -----    - ----  - -----   - ------    -
-----------------------------------------------------------

可以看到,PM2已经成功地启动我们的应用程序,并且把它标识为first-app,当前它正在运行。访问http://localhost:3000/应该可以看到这个应用程序的响应。

现在,我们创建了第一个Node.js应用程序,并且通过PM2对它进行了管理。

启动多个应用程序

接下来,我们创建第二个Node.js应用程序,然后分别使用PM2来管理这两个应用程序。

假设我们要创建的第二个应用程序与第一个应用程序类似,但是监听的是另一个端口,index.js文件可以更改为:

--- ---- - ----------------
--- ---- - ---------------- -- -----

------------------------------- ---- -
  ---------------------
  ------------------ ---------------- ---------------
  --------------- -------------
--------------- ---------- -
  ------------------- ------- -- ------------------ - ------
---

现在,我们需要使用PM2来启动这个应用程序。运行下面的命令:

--- ----- -------- ------ ----------

注意,我们为这个应用程序设置了另一个名字second-app,并且这个应用程序监听的端口也不同。

此时,再次运行pm2 ls命令,我们可以看到两个应用程序,一个叫first-app,另一个叫second-app

-------------------------------------------------------------
- --  - ----       - -------  - ----  - ---     - ------    -
-------------------------------------------------------------
- -   - ---------  - -----    - ----  - -----   - ------    -
- -   - ---------- - -----    - ----  - -----   - ------    -
-------------------------------------------------------------

现在,我们已经使用PM2启动了两个Node.js应用程序,它们分别监听不同的端口。那么,我们如何访问它们呢?实际上,我们使用PM2默认开启的pm2-web应用程序就可以访问到它们了。

打开浏览器,访问http://localhost:9615/,你可以看到一个简单的Web界面,它展示了当前PM2正在管理的Node.js进程的详细信息,包括进程ID,名称和状态等等。

点击菜单项Applications,你可以看到两个应用程序。鼠标悬浮在应用程序上方,就可以看到它所监听的端口。如果想访问第一个应用程序,可以在浏览器中输入http://localhost:3000,而要访问第二个应用程序,则输入http://localhost:3001即可。

实现进程自动重启

有时候,我们的Node.js应用程序可能会因为一些问题而退出,比如程序运行出错、内存溢出、系统故障等等。这时,我们通常需要手动重启这个应用程序,这显然不够健壮和自动化。

PM2可以帮助我们实现进程自动重启,保持程序的健壮性和可用性。比如,我们可以通过下面的命令来让PM2自动重启我们的应用程序:

--- ----- -------- ------ --------- -------------------- ---------------

这个命令的意思是:启动我们的应用程序,并且给它起一个名字first-app,如果这个应用程序因为某些原因退出了,那么PM2会在1秒钟后自动重启它,最多重启3次,如果仍然不行,则会放弃重启。

接下来,我们可以通过模拟Node.js进程因为错误而退出的情况,来测试进程自动重启的功能。比如,我们可以稍微修改一下我们的应用程序代码:

--- ---- - ----------------
--- ---- - ---------------- -- -----

------------------------------- ---- -
  ---------------------
  -- -------- --- --------- -
    ----------------------- -- -----------
    ----- --- ---------------- ---------
  -
  ------------------ ---------------- ---------------
  --------------- -------------
--------------- ---------- -
  ------------------- ------- -- ------------------ - ------
---

这段代码在接收到/error请求时,会抛出一个错误,这样我们可以模拟应用程序因为错误而退出的情况。

接下来,我们使用PM2来重启这个应用程序:

--- ----- -------- ------ --------- -------------------- ---------------

然后,访问http://localhost:3001/error,你会看到应用程序因为未捕获的异常而退出了,但是过一秒钟后,它又自动重启了。

这样,我们就可以使用PM2来实现进程自动重启,并且可以保证我们的应用程序在遇到错误时不会长时间的处于失效状态。

实现进程负载均衡

最后一个问题是,我们如何调度多个Node.js进程,来实现负载均衡和高可用性呢?PM2可以帮助我们自动实现这个功能。

PM2的负载均衡工具可以在多个Node.js进程之间自动分配负载,并且能够动态调整进程数量以适应流量的变化。

要启动进程负载均衡功能,只需要稍作修改原来的启动命令即可:

--- ----- -------- ------ --------- -- --- -------

这个命令的意思是:启动我们的应用程序,并且使用最大数量的进程来执行它(这个数量根据CPU核心数而定),同时,监听文件变化,当文件被修改时自动重启进程。此外,PM2会自动管理进程负载,并且会动态调整进程数量以达到负载均衡的效果。

通过pm2 ls命令,我们可以看到PM2启动了多个进程,并且通过端口号进行了负载均衡,比如:

-----------------------------------------------------------
- --  - ----     - -------  - ----  - ---     - ------    -
-----------------------------------------------------------
- -   - ---------- -----    - ----  - -----   - ------    -
- -   - ---------- -----    - ----  - -----   - ------    -
- -   - ---------- -----    - ----  - -----   - ------    -
-----------------------------------------------------------

现在,我们已经实现了进程负载均衡,并且可以通过监控每个进程的状态来保证服务的高可用性和稳定性。

结论

在本文中,我们通过使用PM2来部署和管理多个Node.js应用程序,然后学习了负载均衡、高可用性和进程重启等重要概念。PM2并不是Node.js的唯一进程管理工具,但是它确实是Node.js进程管理方面的一个不可忽视的工具,值得我们深入利用和学习。

当然,Node.js的世界是丰富多彩的,并且不断地发生着变化,我们需要时刻保持敏锐的触觉,不断学习和探索新的技术。愿我们能够不断提升自己的技术水平,创造出更好的软件和服务!

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/6715029aad1e889fe2169e34


猜你喜欢

  • Go 性能优化:提升应用程序性能的几种方法

    在编写应用程序时,性能永远是一个关键因素。Go 作为一种快速、高效的编程语言,帮助开发者构建高性能应用程序的能力非常强大。然而,在实际开发中,对于应用程序的性能优化仍需要专业性的指导与方法。

    3 天前
  • 使用 ES10 中的 Array.prototype.sort() 方法按属性对对象数组进行排序

    在开发前端应用程序时,JavaScript 中的数组常常用来存储和处理大量的数据,解决了数据的组织和存储的问题。当然,在开发过程中,我们要了解如何对数组中的数据进行排序,避免不必要的错误和混乱。

    3 天前
  • enzyme 如何测试在 React 组件中的基于元素的动画

    随着 React 技术的日益成熟,动画在前端领域的应用越来越广泛。但是,在编写动画时,如何确保其正确性、流畅性和可维护性,以及如何进行自动化测试,则是一个挑战。在测试 React 组件的动画效果时,e...

    3 天前
  • 在 React 中实现自定义组件

    React 是一种流行的 JavaScript 库,用于构建动态用户界面。它提供了一个可复用的组件系统,使开发人员可以在应用程序中创建自定义组件。在本文中,我们将介绍如何在 React 中实现自定义组...

    3 天前
  • Cypress 报错解决:refused to connect to [::1]:9222

    Cypress 是一个快速、易用且可靠的前端端到端测试工具。但是,在使用 Cypress 进行测试的过程中,可能会遇到一些报错。其中比较常见的一个报错就是 "refused to connect to...

    3 天前
  • Koa 异步 I/O 的性能瓶颈与解决方案

    Koa 是一个基于 Node.js 平台开发的下一代 web 框架,具有轻量、简洁、可扩展等优点,同时支持异步 I/O 和 async/await 等语法,让编写异步代码更加简单和优雅。

    3 天前
  • 用 CSS3 实现响应式 SVG 背景图的调整效果

    引言 在现代的网页设计中,响应式设计已经成为必不可少的一部分。响应式设计要求网页页面能够适应不同的设备屏幕大小,从而更好地适配不同的设备。在这种情况下,SVG(Scalable Vector Grap...

    3 天前
  • Sass 函数库的开发和优化方法

    作为一名前端工程师,我们经常需要编写一些重复的 CSS 代码,从而造成了代码的臃肿和难以维护。Sass 函数库可以帮助我们编写可重用、易维护的代码,提高开发效率。本文将介绍 Sass 函数库的开发方法...

    3 天前
  • 踩坑记录:Webpack 导致无法引入依赖包

    在前端项目中,我们通常会使用 Webpack 来进行代码的打包。然而,在使用 Webpack 的过程中,有时会遇到一些琐碎的问题。本篇文章将讨论一种常见的问题:Webpack 导致无法引入依赖包。

    3 天前
  • Material Design 与响应式设计的结合实践

    简介 Material Design 是由 Google 推广的一种设计风格,它具有直观、自然和有层次感的特点,使得网站和应用看起来更美观和易用。响应式设计是指一个网站能够根据不同设备的屏幕大小和分辨...

    3 天前
  • 解析 ECMAScript 2017 (ES8) 中的 Shared Memory 和 Atomics

    前言 Shared Memory 和 Atomics 是 ECMAScript 2017 (ES8) 中新增的特性,这些特性主要为 Web Worker 和 JavaScript 线程之间的通信提供...

    3 天前
  • 如何使用 Node.js 管理和部署 Web 应用程序

    Node.js 已经成为了前端开发的重要工具之一,它可以帮助我们创建和管理各种 Web 应用程序。本文将介绍如何使用 Node.js 来管理和部署 Web 应用程序,包括如何搭建环境、如何使用 npm...

    3 天前
  • 在 Web Components 中使用 React 的技巧

    简介 Web Components 是一种用于开发 Web 应用程序的新技术。它通过将组件化的概念引入 Web 开发中,使得 Web 开发者可以创建可重用的自定义元素,并通过 JavaScript 组...

    3 天前
  • 如何在 Jest 中使用 Babel 转换 ES6

    随着 JavaScript 语言的不断发展,ECMAScript 新版本的发布,前端项目中使用 ES6 已经成为了一种趋势和标配。然而,不同的浏览器可能不支持 ES6 中的一些新特性,这就需要通过 B...

    3 天前
  • 为什么你的网站需要无障碍性?

    随着互联网的发展,网站已经成为人们获取信息、交流、社交和购物的主要途径之一。但是,在网站的设计和开发过程中,我们是否考虑过“无障碍性”这个因素呢? 无障碍性是指设计和开发可以让所有人都可访问的网站,包...

    3 天前
  • JavaScript 性能优化:提升前端性能

    随着互联网的发展,前端技术也越来越复杂。然而,这意味着我们需要在处理更多数据的同时保持网站速度。 前端性能优化是提高用户体验和访问速度的最佳方法。 在这篇文章中,我们将讨论几种可以提高前端性能的 Ja...

    3 天前
  • 使用 Serverless Framework 创建 Node.js 服务

    在前端开发中,随着云计算和微服务的兴起,Serverless 架构已经成为一种受欢迎的解决方案。相比传统的服务部署模式,Serverless 架构具有更高的弹性和可扩展性,能够更好地满足业务需求。

    3 天前
  • GraphQL 中的错误处理详解

    GraphQL 是一种面向客户端的查询语言和 API 标准,可以让客户端自定义需要获取的数据,无需后端开发人员预先定义好接口。但在实际开发中,错误处理是不可避免的一环。

    3 天前
  • React 应用中的容错处理技巧

    React 应用中的容错处理技巧 React 是一款流行的前端框架,能够帮助开发者更快地创建用户界面。在 React 应用中,容错处理是非常重要的。如果我们不正确地处理错误,应用程序可能会崩溃或导致不...

    3 天前
  • ES10 中的标准 JSON 的可选字符支持

    在 ES10 中,标准 JSON 的可选字符支持被引入了。这些可选字符不仅可以使用在字符串中,还可以使用在属性名中。 什么是标准 JSON JSON(JavaScript Object Notatio...

    3 天前

相关推荐

    暂无文章