准备好将你的 NestJS 应用投入生产环境了吗?本指南将为你详细介绍部署过程中的关键步骤和最佳实践,帮助你确保应用在生产环境中高效、稳定地运行。
在部署 NestJS 应用前,需确保已满足以下条件:
如果你正在寻找一种简单高效的云部署方式,可以考虑我们官方推出的 AWS 云部署平台 Mau。通过 Mau,只需几次点击和一条命令即可完成部署:
npm install -g @nestjs/mau
mau deploy部署完成后,你的 NestJS 应用将在数秒内启动并运行于 AWS 平台上,极大简化了部署流程。
构建 NestJS 应用,指的是将 TypeScript 源码编译为可执行的 JavaScript 文件。编译完成后,项目根目录下会生成一个 dist 目录,用于存放这些文件。
你可以通过以下命令构建项目:
npm run build该命令通常会调用 nest build,它在封装 TypeScript 编译器(tsc)的同时,还负责复制资源文件等额外操作。当然,你也可以根据需求自定义构建脚本。
如果项目采用 Monorepo 模式,构建时需要指定项目名称,例如:
npm run build my-app编译成功后,dist 目录下将包含编译后的文件,默认的入口文件通常是 main.js。需要注意的是,如果项目根目录存在 .ts 文件,并且在 tsconfig.json 中被包含到编译范围,这些文件也会被复制到 dist 目录中。这可能导致编译结果结构的变化,例如入口文件路径变为 dist/src/main.js。配置服务器或部署脚本时,请务必确认最终的入口文件路径。
生产环境是指应用实际面向最终用户运行的环境,通常部署在云平台(如 AWS 的 EC2、ECS,Azure,或 Google Cloud)上,也可以选择自主管理的私有服务器(如 Hetzner)。
为了简化部署流程并减少手动运维,可以使用专用的部署平台,例如官方推出的 Mau,这是一个面向 AWS 的自动化部署工具。
使用云平台或 Mau 等平台的优势包括:
需要注意的是,云服务通常成本较高,且对底层基础设施的控制权有限。如果你具备相关运维和安全管理能力,也可以选择基于 VPS 的自托管方案,通常成本更低,但需要自行负责服务器配置、维护、安全加固和数据备份等工作。
虽然在技术层面上,Node.js 和 NestJS 本身并不会严格区分开发环境和生产环境,但在实际部署到生产环境时,强烈建议将 NODE_ENV 环境变量设置为 production。这是因为许多第三方库会根据该变量调整运行模式,例如关闭调试日志、启用性能优化等。
你可以通过以下命令在启动应用时设置该变量:
NODE_ENV=production node dist/main.js此外,如果你使用云服务平台或 Mau 等部署工具,也可以在管理面板中直接配置 NODE_ENV 环境变量。
在生产环境中,可以通过以下命令启动 NestJS 应用:
node dist/main.js # 根据实际的入口文件路径进行调整该命令会启动应用,并监听在代码中配置的端口(默认端口为 3000)。
此外,也可以使用官方提供的命令 nest start。与直接运行 node dist/main.js 不同,nest start 会在启动前自动执行一次 nest build,省去了手动构建的步骤,更适合开发与部署流程。
健康检查是保障 NestJS 应用在生产环境中稳定运行的重要手段。通过设置健康检查端点,可以持续监测应用状态,并在出现异常时及时采取措施。
NestJS 官方提供了 @nestjs/terminus 包,可用于快速实现健康检查功能。该工具集不仅支持检测数据库连接和外部服务状态,还允许根据需求添加自定义检查项。
你可以参考这篇指南,了解如何在 NestJS 项目中集成健康检查,确保应用始终处于可监控、可响应的状态。
日志记录是生产级应用中不可或缺的部分,它能够帮助开发者追踪错误、监控应用运行状态,并高效排查问题。 在 NestJS 中,可以使用内置的日志记录器来满足基础需求,也可以根据实际场景集成更强大的第三方日志库。
以下是一些日志记录的最佳实践:
info、warn、error)。同时,在生产环境中通常会禁用 debug 或 verbose 级别的日志,以避免产生过多无用信息。如果你的应用运行在 AWS(无论通过 Mau 还是直接部署),推荐使用 JSON 格式的日志输出,便于后续通过机器进行解析和数据分析。
对于分布式系统,强烈建议接入集中式日志平台,如 ElasticSearch、Loggly 或 Datadog。这些工具支持日志聚合、检索与可视化分析,能大幅提升运维效率,并更好地洞察应用的运行情况。
要让 NestJS 应用在流量增长时依然保持高性能,合理设计扩展策略至关重要。常见的扩展方式主要分为两类:垂直扩展(Vertical Scaling)和水平扩展(Horizontal Scaling)。理解两者的差异,有助于根据实际需求选择最合适的方案。
垂直扩展(也称「向上扩展」,Scale-up)指通过为单台服务器增加更多资源(如 CPU、内存或存储空间)来提升处理能力。其特点包括:
例如,当 NestJS 应用部署在虚拟机上且高峰期性能不足时,可以直接将该虚拟机升级为更高规格的实例,只需在云服务控制台中调整配置即可。
水平扩展(也称「向外扩展」,Scale-out)则是通过增加服务器实例数量来分担负载,是目前云原生架构中更常用的做法。其优势包括:
例如,当 NestJS 应用面临突发流量时,可以在云环境中快速启动更多实例,并通过负载均衡器将用户请求均匀分配,避免任何一个实例过载。
同时,结合 Docker 容器化和 Kubernetes 编排平台,可以进一步简化水平扩展和运维工作。此外,也可以使用云厂商的负载均衡服务(如 AWS Elastic Load Balancing 或 Azure Load Balancer)来实现自动流量分发。
Mau 已内置对 AWS 水平扩展的支持,可帮助你轻松部署并管理多个 NestJS 实例。
在实际部署 NestJS 应用时,还应关注以下方面:
Docker 是一款基于容器化(containerization)技术的平台,能将应用及其所有依赖打包成一个标准化的单元 —— 容器(container)。容器具有轻量级、可移植、隔离性强等特点,非常适合从开发、测试到生产环境的全流程应用部署。
将 NestJS 应用容器化的优势主要体现在以下几个方面:
首先,请参考官方安装指南安装 Docker。安装完成后,在 NestJS 项目根目录下新建一个名为 Dockerfile 的文件,用于定义镜像的构建流程。
Dockerfile是一个文本文件,包含了构建 Docker 镜像所需的全部指令。
为了让镜像更小、更高效,我们推荐使用多阶段构建(multi-stage build)。以下是一个经过优化的示例:
# ---- Base Stage ----
# 使用官方 Node.js 镜像作为基础,并设置工作目录
FROM node:20 AS base
WORKDIR /usr/src/app
# 复制依赖描述文件
COPY package*.json ./
# ---- Dependencies Stage ----
# 安装生产环境依赖
FROM base AS dependencies
RUN npm ci --only=production
# ---- Build Stage ----
# 安装全部依赖并进行构建
FROM base AS build
RUN npm install
COPY . .
RUN npm run build
# ---- Release Stage ----
# 使用更轻量的 Alpine 镜像作为最终镜像
FROM node:20-alpine AS release
WORKDIR /usr/src/app
# 仅复制生产依赖
COPY --from=dependencies /usr/src/app/node_modules ./node_modules
# 复制构建后的产物
COPY --from=build /usr/src/app/dist ./dist
# 暴露应用端口
EXPOSE 3000
# 启动应用
CMD ["node", "dist/main"]请根据实际情况,将 node:20 替换为你项目所需的 Node.js 版本。 可在 Docker
Hub 官方仓库 中查看可用版本。
package.json 改变时才会重新安装依赖,从而加快后续构建速度。.dockerignore 文件为了避免无关文件被复制进镜像,需要在项目根目录下创建 .dockerignore 文件。例如:
node_modules
dist
*.log
*.md
.git该文件可以确保无关文件和目录不会被复制到构建上下文中,从而避免它们被不必要地打包进镜像,有助于减小镜像体积。
准备好 Dockerfile 和 .dockerignore 后,在项目根目录打开终端,执行以下命令构建镜像:
docker build -t my-nestjs-app .命令参数说明:
-t my-nestjs-app:为构建的镜像指定名称。.:表示 Docker 的构建上下文为当前目录。镜像构建成功后,即可通过以下命令运行容器:
docker run -p 3000:3000 my-nestjs-app命令参数说明:
-p 3000:3000:将主机的 3000 端口映射到容器的 3000 端口。my-nestjs-app:指定要运行的镜像。此时,你的 NestJS 应用已在 Docker 容器中成功运行。
如果需要在云端部署或分享镜像,可将其推送到 Docker 镜像仓库,例如 Docker Hub、AWS ECR 或 Google Container Registry 等。
以 Docker Hub 为例,流程如下:
docker login # 登录 Docker 仓库
docker tag my-nestjs-app your-dockerhub-username/my-nestjs-app # 给镜像打上包含用户名的标签
docker push your-dockerhub-username/my-nestjs-app # 推送镜像请将
your-dockerhub-username替换为你的 Docker Hub 用户名或组织名。
成功推送后,其他人即可从仓库拉取并运行该镜像。
目前主流云服务商(如 AWS、Azure、Google Cloud 等)都提供了托管容器服务,例如:
这些服务通常具备自动扩缩容、负载均衡和监控等功能,可以帮助你轻松将 NestJS 容器化应用稳定、高效地部署到生产环境。
Mau 是 NestJS 官方推出的一款基于 AWS 的应用部署平台,专为希望节省部署时间或不想手动管理底层基础设施的开发者而设计。
Mau 的核心理念是降低基础设施配置和运维的复杂度,让你能够专注于业务开发,而无需深入掌握底层云平台的细节。Mau 在底层集成了 AWS 的强大能力,同时通过简洁直观的界面,帮你屏蔽繁琐的配置,让部署过程更加高效省心。
无论是初创团队还是大型企业,只要希望快速上线产品、减少基础设施管理成本,Mau 都是理想的选择。其上手门槛低,仅需几分钟即可完成环境准备,让开发者轻松享受 AWS 的稳定与可扩展性,而无需被其复杂度困扰。

通过 Mau,你可以轻松完成以下任务:
要通过 Mau 部署 NestJS 应用,只需执行以下命令:
npm install -g @nestjs/mau
mau deploy立即注册并开始使用 Mau,只需几分钟,让你的 NestJS 应用稳定运行在 AWS 云上。