使用 PM2 进行 Node.js 应用的自动化部署

在现代前端开发中,Node.js 已经成为了不可或缺的一部分,而随着项目体量的增大,项目部署也成了一个十分繁琐的问题。此时,一个自动化的部署方案就显得尤为重要,PM2 就是其中的一种解决方案。

什么是 PM2?

PM2 是一个用于管理 Node.js 进程的工具,它不仅可以帮助你简化部署和运维,还包括一些有用的特性,比如负载均衡、自动重启、应用监控、日志管理等等。

安装和配置

首先,我们需要在服务器上安装 PM2:

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

安装完成后,运行 pm2 命令,如果能够成功显示 PM2 的帮助信息,则证明安装成功。

接下来,为了让 PM2 管理我们的应用,我们需要在应用目录下创建一个 ecosystem.config.js 文件,内容如下:

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

其中,apps 数组中可以包含多个应用的配置,我们这里只配置了一个 my-app 应用,常用的配置项有:

  • name:应用名称,必填项。
  • script:启动脚本路径,必填项。
  • instances:实例数,默认为 1。
  • exec_mode:执行模式,forkcluster,默认为 fork
  • watch:是否监听文件变化,重新启动应用,默认为 false
  • env:所有环境变量的键值对。
  • env_production:指定 NODE_ENV=production 环境变量的键值对。

可参考官方文档了解更多信息。

部署应用

接下来,我们要把应用部署到服务器上,先把代码压缩成 .zip 文件,然后通过 ssh 登录到服务器:

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

上传代码并解压缩:

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

进入到应用目录并安装依赖:

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

使用 PM2 运行应用:

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

此时,PM2 会自动启动我们配置的两个实例,并将日志输出到标准输出流中。

如果需要查看当前运行的应用列表,可以使用 pm2 list 命令。

配置 Nginx 反向代理

为了能够直接通过域名访问我们的应用,需要在服务器上安装 Nginx,并配置反向代理。

首先,安装 Nginx:

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

然后,在 /etc/nginx/sites-available 目录下创建一个新的配置文件,比如 my-app,内容如下:

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

其中,server_name 指定了域名,proxy_pass 指定了代理到哪个地址。

接着,创建一个符号链接,启用这个配置文件:

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

现在,可以直接通过域名访问我们的应用了:http://example.com

自动化部署

如果我们经常需要部署新的代码,手动执行一遍部署步骤肯定是不可行的。想要实现自动化部署,可以使用如下方法:

  • 使用 Jenkins 等自动构建工具,将代码上传到服务器,然后执行部署脚本。
  • 使用 Git Hooks,在代码被 push 到远程仓库时,自动触发部署脚本。

这里提供第二种方法的示例,在服务器上创建一个 deploy.sh 脚本:

-----------

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

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

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

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

然后,在仓库中创建一个 post-receive Hook,内容如下:

-----------

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

这样,每次 push 代码到仓库时,都会自动触发部署操作。

总结

通过使用 PM2 进行 Node.js 应用的自动化部署,我们可以大大简化部署流程,减少出错的概率,提高开发效率。无论是管理单个项目,还是管理多个项目,PM2 都是一个不错的选择。

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


猜你喜欢

  • 使用 GraphQL 构建实时聊天应用

    本文将介绍如何使用 GraphQL 构建实时聊天应用。GraphQL 是一种新型的 API 查询语言,可以使前端应用可以更高效、更灵活地获取到所需的数据。实时聊天应用是一种典型的实时应用,通过 Gra...

    1 年前
  • 使用 Enzyme 解决 React 组件测试中遇到的问题

    在 React 开发中,组件测试是非常重要的一部分,可是在测试时会遇到一些困难。Enzyme 是 Facebook 开发的一个 React 组件测试工具,旨在帮助开发者更高效地测试 React 组件,...

    1 年前
  • Deno 中的缓存和数据预取技术

    前言 Deno 是一个旨在为现代 Web 应用程序提供更安全、更高效和更简洁的 JavaScript 和 TypeScript 运行环境的工具。它是一个基于 V8 引擎和 Rust 语言开发的运行时环...

    1 年前
  • TypeScript 项目中的代码重构

    TypeScript 项目中的代码重构 TypeScript 是一个能够将 JavaScript 代码转换为类型安全的代码的编程语言,它在构建大型复杂的应用程序时有很多优势。

    1 年前
  • CSS Grid 如何处理跨域问题?

    CSS Grid 是一个被广泛使用的前端技术,它使得对网页布局的调整变得轻松而高效。然而,当你使用 CSS Grid 排版元素时,你可能会遇到跨域问题。这种情况下,CSS Grid 不会按照预期的样式...

    1 年前
  • MongoDB 架构设计与运维经验总结

    简介 MongoDB是当前最流行的文档数据库之一,它以其高效的数据处理能力,可扩展性,易用性和充分的兼容性而广受开发者的欢迎。但是在实际应用中,由于MongoDB的不同于传统关系型数据的特性,需要考虑...

    1 年前
  • Jest 测试 React 组件,如何在运行时修改 props?

    前言 在 React 开发中,测试是非常重要的一环,Jest 作为前端测试框架,可以很好地测试 React 组件,通过单元测试和集成测试来保证代码质量。在测试组件时,有时需要在运行时修改组件的 pro...

    1 年前
  • Babel 7 详解及其重大更新

    前言 Babel 是一个 JavaScript 编译器,可以将现代 JavaScript 代码转换成在当前 Web 浏览器中可执行的代码。随着 Web 技术的不断发展,JavaScript 语言也不断...

    1 年前
  • 如何通过 Node.js 使用 Server-sent Events 更新数据?

    Server-sent Events(SSE)是一种服务器向客户端推送流数据的技术。SSE 不同于 WebSocket,它只支持单向数据流,而且只使用 HTTP 协议。

    1 年前
  • ESLint 枚举类型如何正确规范

    在前端开发中,ESLint 是一款被广泛使用的工具,可以帮助我们规范代码,避免错误,提高代码质量。其中枚举类型规范是一个重要的方面,本文将介绍如何正确规范枚举类型,并给出示例代码。

    1 年前
  • Docker 数据卷挂载方式的比较与选择

    在 Docker 中,数据卷是一个非常重要的概念,用于将主机中的目录或文件挂载到容器中,以便容器可以访问这些主机资源。在使用数据卷时,不同的挂载方式可能会对性能、可靠性和安全性等方面产生不同的影响,因...

    1 年前
  • 通过 Lambda 函数实现延迟队列

    前言 在前端开发中,常常需要处理一些需要延迟执行的任务,例如定时任务、发送邮件、发送短信等,这些任务往往需要在未来的一个特定时间点才能执行。传统的处理方法是使用定时器(setTimeout)或者 cr...

    1 年前
  • CSS Reset 在网站架构中的应用

    前言 在进行网站开发时,不同浏览器对 CSS 的支持程度不同,这可能会导致网站样式的不同步。为了解决这一问题,我们可以使用 CSS Reset 手段,彻底地将不同浏览器的默认样式重置,从而使不同浏览器...

    1 年前
  • RxJS 中的 switchMap 和 exhaustMap 的异同

    RxJS 是一种流式编程库,它提供了各种操作符,可以极大地简化异步编程。在 RxJS 中,switchMap 和 exhaustMap 是两个非常常用的操作符。本文将详细介绍它们的异同,以及在实际开发...

    1 年前
  • 实现无障碍性的 Web 开发流程

    在现代社会中,我们需要保证每个人都可以平等地访问 Web 网站和应用程序,这也包括那些有视觉、听觉、认知和运动障碍的人群。为了满足这些需要,我们需要关注无障碍性。 本篇文章将介绍如何实现无障碍性的 W...

    1 年前
  • 如何在 Chai.js 中进行集成测试

    如何在 Chai.js 中进行集成测试 Chai.js 是一个流行的 JavaScript 测试库,可以用它来编写单元测试和集成测试。而集成测试,是一种测试方法,可以确保应用程序的组件之间的协调工作正...

    1 年前
  • Mongoose 中使用 $pull 对数组操作时的详解及注意事项

    在使用 Mongoose 操作 MongoDB 数据库中的数组时,有时需要对数组进行删除元素的操作。在 Mongoose 中,可以使用 $pull 操作符来对数组进行删除元素的操作。

    1 年前
  • Socket.io 实现多人协作编辑的方式

    引言 随着互联网技术的发展,越来越多的应用需要多人协作实时编辑。例如,在一个团队开发项目时,多个成员需要在同一份代码上进行编辑与修改;在一个在线文档平台中,多个用户需要实时编辑同一份文档;在一个实时聊...

    1 年前
  • 使用 Express.js 和 Vue.js 构建 Web 应用程序

    前言: Web 应用程序的构建是一个相当复杂和繁琐的过程,但是借助于现在流行的前端和后端框架,可以很好地降低开发者的工作量。本篇文章是关于如何使用 Express.js 和 Vue.js 构建一个高质...

    1 年前
  • ECMAScript 2018 引入 Promise.finally,让 Promise 更加完美

    ECMAScript 2018 加入了 Promise.finally 方法,使得 Promise 更加完美。在之前的版本中,我们只能使用 then 方法或 catch 方法处理 Promise 的回...

    1 年前

相关推荐

    暂无文章