如何部署 Express.js 应用程序?

How to Deploy a ExpressJS Application_
How to Deploy a ExpressJS Application_

选择正确的部署选项对于确保您的应用程序能够随着增长而轻松扩展至关重要。本文将探讨 Express.js 应用程序的不同部署选项。具体来说,它将重点介绍如何将 Express.js 应用程序部署到 Back4app 容器。

什么是 Express.js?

Express 是一个建立在 Node.js 基础上的轻量级框架,它简化了复杂的网络和移动应用程序接口的构建过程。

它提供了一个简单的路由系统,可帮助你轻松定义 API 路由的端点,并将它们映射到处理函数。

它还支持中间件,可以在请求-响应循环中添加日志记录、身份验证和错误处理等功能。

使用 Express.js 的优势

使用 Express 的一些优势如下

  • 极简,简单易用:Express.js 抽象了一些 Node.js 功能(如路由)的复杂性。它提供了一种处理 API 请求和响应的简单方法。
  • 高度可扩展:Express.js 拥有一个庞大的社区,形成了广泛的 NPM 软件包和扩展生态系统,您可以轻松地将其集成到应用程序中。
  • 高性能:由于采用了最小化设计,并利用了 Node 的非阻塞、事件驱动架构,Express 具有很高的性能。
  • 强大的社区支持:Express.js 自 2010 年开始使用。在此期间,许多开发人员都采用了它。因此,一个庞大的 Express 社区正在形成,如果您遇到问题,它可以为您提供帮助。此外,还有大量的文章、教程和精心编写的文档来解释 Express 如何工作。

Express.js 的缺点

以下是 Express.js 的一些缺点:

  • 无主见:与 Nest.js 等框架相比,Express.js 非常缺乏主见。缺乏主见意味着你需要对项目结构和组织做出决定,这可能会很乏味,尤其是当你有多种做事方法时。
  • 缺乏内置功能:Express.js 没有预配置,对于大多数高级功能(如日志),你需要安装额外的依赖项。

Express.js 部署选项

基础设施即服务(IaaS)

基础设施即服务是一种云计算服务,通过互联网按需提供计算、网络和存储资源。

使用 IaaS,您负责为应用程序调配和配置资源,而 IaaS 提供商负责维护底层物理基础设施。例如,如果您想部署 Express 应用程序,您可以在您选择的 IaaS 提供商上创建和配置虚拟机。

在虚拟机上,你需要安装必要的依赖项,如 Node 和 npm,然后将 Express 代码添加到虚拟机上。然后,您就可以在虚拟机上启动 Express 应用程序,并通过互联网访问它。

IaaS 的主要优势之一是它提供的控制水平。您可以自定义虚拟机的 CPU、内存和存储资源,以满足您的应用需求

不过,考虑到这种方法的一些缺点也很重要。

随着应用程序的扩展和需求的变化,管理基础设施和资源可能会变得复杂而耗时。

一些流行的 IaaS 提供商包括

  • Microsoft Azure
  • Amazon Web Services (AWS)
  • Google Cloud Platform (GCP)

容器即服务(CaaS)

容器即服务(CaaS)是一种云服务模块,它抽象了底层基础设施,使您可以快速部署和运行容器化应用程序。

要将 Express 应用程序部署到 CaaS 提供商,需要使用 Docker 等容器化工具将代码、依赖项和运行时打包,以便在容器中运行应用程序。创建容器后,就可以进行部署。CaaS 提供商为您提供并管理运行容器所需的基础设施。

使用 CaaS 的主要好处是,高度抽象化简化了部署,因为您无需担心配置底层基础设施。您可以专注于构建应用程序的逻辑。此外,容器化还能确保您的应用程序在多个环境中始终如一地运行。

一些流行的 CaaS 提供商包括

  • Back4app Containers
  • Amazon Elastic Container Service (ECS)
  • Google Kubernetes Engine (GKE)

如何在 Back4app 容器中部署 Express 应用程序

先决条件

要学习本教程,请确保您具备以下条件:

  • 您的计算机上安装了 Node.js。
  • 一个 GitHub 账户。
  • 机器上安装了 Docker。如果没有,请访问 Docker 网站并安装 Docker 桌面
  • 掌握 Express.js 的工作知识。

Back4app 容器概述

Back4app 容器是一个通过为您管理服务器端基础设施实现自动化部署的平台。

Back4app 容器的部分功能如下:

  • GitHub 集成:您可以将 GitHub 资源库连接到 Back4app,以便在代码库发生变化时自动部署应用程序。
  • Docker 部署:您可以使用流行的容器化工具 Docker 将应用程序代码打包到容器中。这可确保您的应用程序在不同环境下以可预测的方式运行。
  • 自动部署:将 GitHub 仓库连接到 Back4app 后,每次向默认分支推送代码都会触发部署。
  • 实时部署跟踪:您可以查看部署的状态和进度。
  • 实时应用程序监控
  • 零停机更新

项目介绍

在本指南中,我们将介绍如何将 Express 应用程序部署到 Back4app。首先,我们将创建一个带有单个端点的简单 ExpressREST API ,使用 Docker 将其坞化,然后推送到 GitHub。然后,我们将把它部署到 Back4app 容器中。

创建简单的 Express API

请按照以下步骤创建 Express 应用程序:

  1. 在终端中运行以下命令,初始化一个新的 Node.js 项目。
npm init

该命令将提示您输入应用程序的详细信息,如软件包名称、版本、描述、入口点、作者和许可证。回复后,它将创建一个包含这些配置的 package.json 文件。

要使用默认配置,请使用-y标志,如下所示:

npm init -y
  • 运行此命令,将 Express 作为依赖项安装。
npm install express
  • 在项目文件夹根目录下创建一个 index.js 文件。如果您为入口点文件指定了其他名称,请使用该名称。
  • 打开 index.js 文件,创建 Express 应用程序的实例。
const express = require('express');
const app = express();
  • 添加路由处理程序,处理对”/”端点的 GET 请求。
app.get("/", (req, res) => {
  res.json({
    message: "Success",
  });
});

该端点发送 JSON 消息作为响应。

  • 定义端口号,并监听指定端口上的传入请求。
const port = process.env.PORT || 3000;
app.listen(port, () => {
  console.log(`App listening at <http://localhost>:${port}`);
});

请注意,process.env.PORT指的是名为 PORT 的环境变量。如果 .env 文件中没有定义该值,应用程序将使用值 3000。

  • 运行以下命令启动 Express 服务器。
node index.js

如果您在浏览器上访问 http://localhost:3000/api,您应该会收到以下回复。

{
  "message": "Success!"
}

这是 Express API 的一个非常基本的示例,实际应用会更加复杂,需要更多的端点、外部数据和中间件等。

就本文而言,这足以演示如何部署 docker 化的 Express 应用程序。

将 Express 应用程序 Docker 化

对 Express.js 应用程序进行 Docker 化是指为其创建一个 Docker 容器,使其更容易在不同环境中运行。

什么是 Docker?

Docker 是一种开源工具,可让您将应用程序、其运行时、库和依赖项打包到一个隔离和可移植的容器环境中。

通过将应用程序封装在该容器中,Docker 为应用程序提供了一致的运行环境,而不受底层主机系统的影响。

这就解决了 “在我的机器上也能运行 “的问题。您可以在本地环境中开发 Express 应用程序,将其容器化并部署到多个环境中,而不必担心兼容性问题。

安装 Docker

Docker 可在多个平台上运行,包括 macOS、Windows 和 Linux。你可以从官方网站为你的操作系统下载和安装 Docker

如何 Docker 化 Express.js 应用程序

安装好 Docker 后,就需要对应用程序进行 dockerize,即把它打包到 Docker 容器中。

请按照以下步骤操作:

  • 在项目根目录下创建一个名为Dockerfile的文件。该文件包含为 Express 应用程序构建 Docker 映像的说明。
  • 通常,在创建 Dockerfile 时,首先要指定一个基础镜像。基础镜像是预构建的镜像,它是应用程序镜像的起点,通常包含运行应用程序的最基本指令。
  • 在 Dockerfile 中,你可以提供在该镜像上运行的说明和配置。你可以创建自己的自定义基础镜像,但在大多数情况下,Docker 提供的官方镜像已经足够。
  • 在本指南中,我们将使用节点基础镜像,特别是体积较小的高山变体。让我们在 Dockerfile 中添加以下内容,指定该基础镜像。
FROM node:20-alpine

在这里,node:20-alpine预装了 Node.js 版本 20。

  • 添加以下一行以设置容器内的工作目录
WORKDIR /usr/src/app
  • 将 package.json 和 package-lock.json 复制到工作目录。这将列出 Docker 需要安装的所有依赖项。
# A wildcard ensures package.json AND package-lock.json are copied
COPY package*.json ./
  • 添加安装依赖项的命令。
RUN npm install
  • 将其余代码复制到容器中的工作目录。
COPY . .
  • 显示 Express 应用程序监听的端口号。本例中为 3000 端口。
expose 3000
  • 添加启动应用程序的命令。
CMD["node", "index.js"]

总的来说,你的 DockerFile 应该是这样的:

FROM node:20-alpine

WORKDIR /usr/src/app

COPY package*.json  ./

RUN npm install

COPY . .

EXPOSE 3000

CMD [ "node", "index.js" ]

添加 .dockerignore 文件

.dockerignore 文件指定了 Docker 应该忽略的文件。通过忽略不必要的文件,它可以帮助你减小 Docker 镜像的大小。它还能帮助你隐藏映像中的敏感文件。

要将其添加到项目中,请在项目的底部创建一个文件,并将其命名为.dockerignore。添加以下内容。

.git
.gitignore
.env
README.md
Dockerfile
node_modules/
.github
.vscode
npm-debug.log
npm-debug.log.*

上述文件可防止 git 文件、节点模块、日志和环境变量被复制到 Docker 镜像中。

在本地构建 Docker 映像

在项目目录中,运行以下命令来构建 Docker 映像。

docker build -t docker-express-api .

-t标志代表标签(tag),允许你给Docker镜像取一个有意义的名字。末尾的点(.)告诉 Docker 在当前目录中查找 Dockerfile,并运行其中的指令。

在本地运行 Docker 映像

构建好 Docker 镜像后,使用以下命令运行 Express 应用程序:

docker run -p 3000:3000 docker-express-api

这里的-p 3000:3000将本地主机的端口 3000 映射到容器中的端口 3000。您应该可以通过浏览器访问 http://localhost:3000 来访问应用程序。

要查看正在运行的 Docker 实例,请使用以下命令:

docker ps

要停止实例,请运行

docker stop docker-express-api

在 Back4app 容器中部署 Docker 化的 Express 应用程序

现在,我们已经确保 Docker 映像在本地运行,我们需要将其部署到 Back4app。

将 Express 应用程序推送到 GitHub

Backapp 通过GitHub 部署应用程序。因此,您需要按照以下步骤将应用程序仓库推送到 GitHub:

  • 导航至 GitHub 网站并登录您的账户。
  • 登录后,找到页面右上角的 “+”图标并点击。从下拉菜单中选择 “新建存储库”。
  • 在 “创建新版本库 “页面,为版本库命名。在本指南中,我们将使用 “express-api”。点击 “创建版本库名称 “按钮。在下一页记住仓库的 URL,因为将本地仓库推送到 GitHub 时会用到它。

在本地计算机上,导航到项目文件夹,然后运行以下命令将应用程序推送到 GitHub 上的远程仓库。

git remote add origin <https://github.com/remigathoni/express-api.git>
git branch -M main
git push -u origin main

您应该可以在 GitHub 仓库中查看应用程序的文件。

部署快速应用程序

请按照以下步骤将应用程序部署到 Back4app:

  • 访问 Back4app 并注册账户。如果您已有账户,请登录。通过身份验证后,Back4app 会将您重定向到控制面板。
  • 在仪表板上,单击 “构建新应用程序“按钮。您将看到两个选项–后端即服务和容器即服务。BaaS 代您处理后端,而 CaaS 允许您在容器环境中部署应用程序。鉴于我们只想部署应用程序,请单击 “容器服务“。
创建新容器作为服务应用程序
  • 根据提示,授予 Back4app 访问 GitHub 账户的权限,并选择 Express 仓库。
选择 dockerized Express 应用程序
  • 为部署的应用程序命名。在本指南中,我们使用的是 “Deployed Express API”。您还可以设置其他部署选项,如默认分支、根目录、自动部署状态(是或否)以及环境变量。
将 Express.js 应用程序部署到
  • 单击 “创建应用程序“按钮,完成部署过程。

现在,您已将您的 Express 应用程序免费部署到 Back4app。

如何优化 Docker 映像

出于以下原因,优化 docker 镜像的大小至关重要:

  • 提高性能:小图像不会包含需要执行的不必要图层。因此启动时间更快。
  • 部署更快:更小的映像部署速度更快。
  • 更低的资源消耗:更小的图像在运行时消耗更少的磁盘空间和内存。
  • 增强安全性:通过排除不必要的库和依赖项,较小的图像可减少应用程序的攻击面。

为了优化 Express.js Docker 映像,我们可以使用多阶段构建。

多阶段构建允许您将构建环境与运行环境分开。您可以在构建阶段构建应用程序,然后只将必要的文件复制到最终的生产阶段。

回到 Express 应用程序,我们可以定义两个阶段–安装依赖项的构建阶段和创建运行时映像的生产页面。

创建 “构建 “阶段

请按照以下说明定义构建阶段:

  • 删除 Dockerfile 中的所有内容,并从基础镜像中定义构建阶段。
FROM node:20-alpine AS build

在 FROM 指令中附加AS-stage 名称即可命名一个阶段。还请注意,高山基地图像比节点:图像小得多。

  • 定义工作目录
WORKDIR /usr/src/app
  • 将 package.json 和 package-lock.json 文件复制到容器中。
COPY package*.json ./
  • 安装开发依赖项
RUN npm install --only=development
  • 将应用程序代码复制到构建阶段。
COPY . .
  • 运行应用程序。
CMD ["node", "index.js"]

在此运行的命令取决于您的项目。例如,如果使用 TypeScript 构建应用程序,则可能需要转译应用程序。

创建生产阶段

在第二阶段,您只需从构建阶段复制已构建的应用程序文件。请按照以下步骤操作:

  • 添加 Node.js 基本映像并将其命名为生产。
# Production Stage
FROM node:20-alpine AS production
  • 设置工作目录
WORKDIR /usr/src/app
  • COPY指令中指定--from=build,从 “构建阶段 “复制必要的文件。由于没有编译命令,我们直接复制所有文件。
COPY --from=build /usr/src/app .
  • 显示 Express 应用程序监听的端口。
EXPOSE 3000
  • 启动 Express 应用程序。
CMD ["node", "index.js"]

创建 Dockerfile 后,将更改推送到 GitHub,Back4app 将自动重新部署应用程序。

如果您想查看本文的代码,请访问应用程序的 GitHub 代码库

结论

Express.js 是一个轻量级、无观点的 Node.js 框架。它可以帮助开发人员为网络和移动应用程序构建快速、简约的 API。

在部署 Express 应用程序时,您有多种选择,包括基础设施即服务(IaaS)和容器即服务(CaaS)平台。

IaaS 平台更适合需要对底层服务器基础架构进行最大程度控制的情况,而 CaaS 则是需要快速从开发转向生产而无需手动管理基础架构的理想选择。

最好的 CaaS 提供商之一是 Back4app 容器。Back4app 代表您管理和监控应用程序的部署,让您可以专注于实际构建应用程序的功能。

在本指南中,您将学习如何对 Express.js 应用程序进行 docker 化,并将其部署到 Back4app 容器中。要了解更多信息,请访问Back4app 容器文档

常见问题

什麼是 Express.js?

Express 是一個建構於 Node.js 之上的輕量級框架,不具強制性,可簡化建立複雜的網頁與行動 API 的流程。

Express.js 應用程式有哪些部署選項?

– 基礎設施即服務(IaaS):AWS、GCP、Azure
– 容器即服務(CaaS):Back4app Containers、AWS ECS、Google Kubernetes Engine (GKE)

如何將 Express.js 應用程式部署到 Back4app 容器?

建立一個 Express.js 應用程式。
將 Express.js 應用程式容器化(Dockerize)。
將容器化的應用程式推送至 GitHub。
建立一個 Back4app 帳號。
建立一個 Back4app 容器。
授權 Back4app 存取你的 GitHub。
選取 Express.js 儲存庫並部署你的應用程式。


Leave a reply

Your email address will not be published.