当应用从开发走向生产时,环境配置管理、部署自动化和运行稳定性成为关键挑战。本期我们实战 NestJS 生产环境部署方案,打造企业级发布体系。
一、配置管理:环境变量动态加载
1. @nestjs/config 模块应用
安装依赖:
npm install @nestjs/config基本配置:
// app.module.ts
import { ConfigModule } from '@nestjs/config';
@Module({
imports: [
ConfigModule.forRoot({
isGlobal: true, // 全局可用
envFilePath: ['.env'],
}),
],
})
export class AppModule {}2. 多环境策略实现
# 目录结构
config/
├── dev.env
├── stage.env
├── prod.env
└── config.ts动态环境加载:
// 根据NODE_ENV加载对应环境配置
ConfigModule.forRoot({
envFilePath: `.${process.env.NODE_ENV}.env`,
})3. 复杂配置结构处理
// src/config/db.config.ts
export default registerAs('database', () => ({
host: process.env.DB_HOST,
port: parseInt(process.env.DB_PORT, 10) || 3306,
username: process.env.DB_USER,
password: process.env.DB_PASSWORD,
}));
// 在模块中注入
import { ConfigType } from '@nestjs/config';
import databaseConfig from './config/db.config';
@Injectable()
export class DatabaseService {
constructor(
@Inject(databaseConfig.KEY)
private dbConfig: ConfigType<typeof databaseConfig>
) {
console.log(dbConfig.host);
}
}二、Docker 容器化实战
1. Dockerfile 最佳实践
# 阶段1:构建应用(使用Node.js镜像)
FROM node:18-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --omit=dev
COPY . .
RUN npm run build
# 阶段2:生产运行(使用更轻量的镜像)
FROM node:18-alpine AS runner
WORKDIR /app
# 复制构建产物和运行时依赖
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/dist ./dist
# 配置用户权限(增强安全性)
RUN addgroup -g 1001 -S appgroup && \
adduser -u 1001 -S appuser -G appgroup
USER appuser
EXPOSE 3000
CMD ["node", "dist/main.js"]2. 多阶段构建优化
# 阶段3:静态资源处理(可选)
FROM nginx:alpine AS assets
COPY --from=builder /app/public /usr/share/nginx/html3. docker-compose 编排方案
version: '3.8'
services:
app:
build:
context: .
target: runner
image: nest-app-prod
environment:
NODE_ENV: production
DATABASE_URL: postgres://user:pass@db:5432/nest
depends_on:
db:
condition: service_healthy
db:
image: postgres:15
volumes:
- pgdata:/var/lib/postgresql/data
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: pass
POSTGRES_DB: nest
healthcheck:
test: ["CMD-SHELL", "pg_isready -U user"]
interval: 10s
timeout: 5s
retries: 5
volumes:
pgdata:三、生产环境部署:Node.js 应用运行策略
1. PM2 集群模式(充分利用多核CPU)
npm install pm2 -g// ecosystem.config.js
module.exports = {
apps: [
{
name: 'nest-app',
script: './dist/main.js',
instances: 'max', // 根据CPU核心数量启动进程
autorestart: true,
watch: false,
exec_mode: 'cluster',
env: {
NODE_ENV: 'production',
},
max_memory_restart: '1G',
},
],
};2. 零宕机部署方案
# 优雅重启
pm2 reload ecosystem.config.js
# 部署脚本示例
cd /path/to/project
git pull origin master
npm ci --omit=dev
npm run build
pm2 reload ecosystem.config.js四、平台即服务(PaaS)部署方案
1. Heroku 部署
heroku create
heroku config:set NODE_ENV=production
git push heroku master2. AWS ECS 部署流程
graph TB
A[创建镜像仓库] --> B[构建并推送到ECR]
B --> C[配置ECS任务定义]
C --> D[创建ECS服务]
D --> E[配置ALB负载均衡]五、监控告警系统配置
1. Prometheus + Grafana 监控方案
// 安装采集指标器
npm install @nestjs/metrics prom-client
// main.ts 中启用
import { makeGaugeProvider } from '@willsoto/nestjs-prometheus';
@Module({
providers: [
makeGaugeProvider({
name: 'http_request_duration_seconds',
help: 'HTTP requests duration seconds',
}),
],
})
export class MetricsModule {}2. 告警规则配置
# prometheus.yml
alerting:
alertmanagers:
- static_configs:
- targets:
- 'alertmanager:9093'
rules:
- alert: HighCPU
expr: 100 * (1 - avg by (instance)(rate(node_cpu_seconds_total{mode="idle"}[5m]))) > 80
for: 10m
labels:
severity: critical
annotations:
summary: "高CPU使用率"六、自动化部署流程(CI/CD)
1. GitHub Actions 配置
name: Production Deploy
on:
push:
branches: [ master ]
jobs:
build-deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Node
uses: actions/setup-node@v3
with:
node-version: '18'
- name: Install Dependencies
run: npm ci --omit=dev
- name: Build Project
run: npm run build
- name: Push to ECR
uses: docker/build-push-action@v4
with:
push: true
tags: ${{ secrets.ECR_REPO }}:latest
- name: Update ECS
uses: deploy-ecs-action@v1
with:
service: nest-app
cluster: production
region: us-east-12. 关键环节安全检查
- name: Run Unit Tests
run: npm test
- name: Run Security Scan
uses: shiftleft/sast-scan@v2七、避坑指南:部署常见问题
❌ 问题1:内存溢出导致崩溃
解决方案:
# 修改Node内存限制
NODE_OPTIONS="--max-old-space-size=4096"❌ 问题2:迁移数据库失败
方案:每次启动检查数据库版本
// 启动时执行迁移
async function bootstrap() {
const app = await NestFactory.create(AppModule);
const dbService = app.get(DatabaseService);
await dbService.runMigrations();
await app.listen(3000);
}❌ 问题3:Docker时区配置错误
RUN apk add tzdata
ENV TZ=Asia/Shanghai八、下期预告:安全防护全面指南
《NestJS安全架构:抵御入侵的8重防护门》 将深入:
➠ HTTPS 全球加密
➠ JWT 深度防护策略
➠ XSS/CSRF 入侵阻断
➠ 速率限制与IP黑名单
➠ 实战:金融级安全方案
部署挑战:
✍️ 在你的云服务器部署 NestJS 项目并截图展示,分享你遇到的坑!
通过本期实战,你已掌握生产部署核心环节:
✅ 环境变量动态加载
✅ Docker容器化优化
✅ PM2集群模式配置
✅ Prometheus监控接入
✅ CI/CD自动化部署流水线
生产价值:这些部署技能可将个人项目转化为可商用服务,支撑从初创企业到百万级用户平台的不同规模应用。
相关推荐
- NestJS 从入门到精通 11:综合实战 - 构建知乎风格的全栈社区平台(下) 2025-06-24
- NestJS 从入门到精通 10:综合实战 - 构建知乎风格的全栈社区平台(上) 2025-06-24
- NestJS 从入门到精通 09:性能调优大师 - 百万并发下的极致优化策略 2025-06-24
- NestJS 从入门到精通 08:安全架构实战 - 构建金融级应用的8重防护门 2025-06-24
- NestJS 从入门到精通 06:GraphQL 现代 API 开发 - 解决 RESTful 之痛 2025-06-24
评论0
暂时没有评论