部署 NestJS 应用
企业级 Angular 风格 Node 框架,含 DI、模块和装饰器,部署为 Node 服务器或 serverless。
平台高级
为什么
NestJS 将企业架构(依赖注入、模块、装饰器)带入 Node.js,使大型后端可维护。Angular 启发的结构可扩展到大团队和复杂领域。
何时使用
大型企业后端、复杂领域、多团队和长期维护用 NestJS。小 API 避免 — 开销不值。
如何做
1. 构建 — nest build 生成 dist/ 含编译 JS
2. Node — node dist/main.js,底层运行 Express/Fastify
3. Docker — 多阶段构建,node:20-alpine 运行时
4. Serverless — @nestjs/serverless 或 serverless.yml 配 Lambda
5. PM2 — pm2 start dist/main.js -i max 集群
6. Swagger — 配 SwaggerModule 则 /api 自动生成文档
7. 微服务 — @nestjs/microservices TCP/Redis/RabbitMQ 传输
示例
// src/main.ts — NestJS 启动
import { NestFactory } from "@nestjs/core";
import { AppModule } from "./app.module";
async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.enableShutdownHooks(); // 优雅关闭
await app.listen(process.env.PORT ?? 3000);
}
bootstrap();
// Dockerfile
FROM node:20-alpine AS build
WORKDIR /app
COPY . .
RUN npm ci && npm run build
FROM node:20-alpine
WORKDIR /app
COPY --from=build /app/dist ./dist
COPY --from=build /app/node_modules ./node_modules
EXPOSE 3000
CMD ["node", "dist/main.js"]
// serverless.yml — Lambda 部署
functions:
api:
handler: dist/main.handler
events:
- http: { path: /{proxy+}, method: ANY }
常见问题
- ⚠DI 循环依赖 — 两个 provider 互相注入,用 forwardRef() 打破循环
- ⚠生产找不到模块 — dist/ 缺文件,检查 nest-cli.json assets 和 webpack
- ⚠Serverless 冷启动 5+ 秒 — NestJS 冷启动引导所有模块,用懒模块
最佳实践
- ✓用 enableShutdownHooks() — 确保容器化部署 SIGTERM 优雅关闭
- ✓模块小且按特性划分 — 全局模块产生耦合和慢冷启动
- ✓设置健康检查和优雅关闭 — 处理 SIGTERM 以在退出前排空进行中的请求