秒杀入口流量防护方案-Nginx + NestJS + Redis 三层限流

[复制链接]
发表于 2025-9-22 04:25:19 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
提示:文章写完后,目次可以主动生成,怎样生成可参考右边的帮助文档
  


前言

Nginx + NestJS + Redis 三层限流

🎯 秒杀接口大流量防护最佳实践

三层限流防护思绪:

条理技能限定粒度重要目标Nginx限流层Nginx模块IP级别限流、防CC攻击哀求在到达应用层之前拦截NestJS应用层@Throttle装饰器用户级别/API接口级限流风雅控制每个接口访问频率Redis分布式层ThrottlerStorageRedis分布式情况下同一限流包管多实例限流同等
🛠 1. Nginx 限流配置(入口最前端)

✅ 编辑你的 nginx.conf,在对应 server 区块添加:
  1. http {
  2.   # 定义限流zone(IP维度)
  3.   limit_req_zone $binary_remote_addr zone=seckill_limit:10m rate=100r/s;
  4.   server {
  5.     listen 80;
  6.     location /seckill/ {
  7.       # 应用IP限流
  8.       limit_req zone=seckill_limit burst=200 nodelay;
  9.       proxy_pass http://your-nestjs-service:3000;
  10.       proxy_set_header Host $host;
  11.     }
  12.   }
  13. }
复制代码
参数寄义limit_req_zone界说限流地区,内存巨细10MB,速率100 requests/secondlimit_req现实应用到 /seckill/ 路径,刹时突发答应200个排队,超出直接429✅ 这样做,连入口都打不爆,Nginx直接抗住绝大部分恶意流量。

🛠 2. NestJS 应用内局部限流(你的 Throttle)

你的做法已经正确了,只须要调整一下参数,好比:
  1. @Throttle({ short: { limit: 5000, ttl: 1000 } })
复制代码


  • 5000次/秒限流
  • 包管单个用户/接口级频控
  • 防止内部服务被突刺流量打死

🛠 3. Redis 分布式限流(防多节点失效)

如果以后你有NestJS多实例摆设(好比k8s、docker swarm集群),内存限流是失效的,须要基于 Redis来同一限流。
✅ 须要安装:
  1. pnpm add @nestjs/throttler-storage-redis ioredis
复制代码
✅ 配置到 AppModule:
  1. import { ThrottlerModule } from '@nestjs/throttler';
  2. import { ThrottlerStorageRedisService } from '@nestjs/throttler-storage-redis';
  3. @Module({
  4.   imports: [
  5.     ThrottlerModule.forRootAsync({
  6.       useFactory: () => ({
  7.         ttl: 1,          // 1秒
  8.         limit: 5000,     // 5000次
  9.         storage: new ThrottlerStorageRedisService('redis://127.0.0.1:6379'),
  10.       }),
  11.     }),
  12.   ],
  13. })
  14. export class AppModule {}
复制代码
✅ 主动切换到 Redis 来统计流量!
纵然有10台NestJS副本,流量统计都是同一的,防止穿透。

📈 完备流量拦截链路图

  1. [ 外部请求 ]
  2.     ↓
  3. [ Nginx IP限流: 100r/s 每IP ]
  4.     ↓
  5. [ NestJS 局部接口限流: 5000r/s每接口 ]
  6.     ↓
  7. [ Redis 分布式限流: 统一计数 ]
  8.     ↓
  9. [ 业务逻辑(扣库存、投递Kafka) ]
复制代码
真正做到:


  • 外层防CC
  • 中层防刷接口
  • 内层防击穿Redis、Kafka
  • 多副本摆设不串限流

🧠 小总结

层级特点Nginx开始拦截,防洪流NestJS细粒度接口/用户限频Redis集群情况同一限流✅ 这样你的秒杀接口就能抗住几十万QPS的大流量打击,而且还能细粒度控制

回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表