NestJS节流配置:仅限流用户请求 跳过前端及getServerSideProps请求
核心结论
默认配置下的NestJS Throttler模块必然会误拦截Node.js前端服务、getServerSideProps发起的请求。该模块默认以请求来源IP作为节流计数的唯一维度,不会自动区分请求发起方是普通终端用户还是你的前端服务端进程。
两种部署场景的实际表现
1. 前后端部署在同一台服务器、共用IP
- 所有前端服务端、getServerSideProps发起的请求,来源IP都会被识别为服务器本机回环地址(127.0.0.1)或服务器自身的公网出口IP,所有这类请求会被合并到同一个IP维度下累计计数。
- 只要每分钟这类服务端请求累计达到你配置的20次阈值,后续所有前端服务端发起的请求都会被直接拦截返回429状态码:按你描述的场景,每分钟只要有21个用户访问触发SSR页面渲染,第21个用户的页面请求就会因为前端服务端调用后端接口被限流而渲染失败,远到不了每分钟100访客的量级。
- 该场景下普通终端用户直接发起的客户端请求,会按用户各自的公网IP独立计数,和服务端请求的计数池隔离,但只要站点存在SSR渲染逻辑,服务端请求会先一步打满限流阈值。
2. 前后端部署在不同服务器、使用独立IP
- 所有前端服务端发起的请求,来源IP都会被识别为前端服务器的固定公网IP,同样会被归为单一IP维度累计计数。
- 限流触发逻辑和同机部署完全一致:只要每分钟前端服务器发起的接口请求数超过20次,后续SSR渲染相关的接口请求就会被拦截。按每分钟100访客的量级,第21个访客访问时就会触发429错误导致页面渲染失败,故障表现和同机部署没有本质区别,仅被计数的IP从本机地址换成了前端服务器的公网IP。
可落地的解决方法
不需要调整部署架构,直接通过Throttler模块自带的自定义规则就能实现「仅拦截普通终端用户、跳过前端服务端请求」的需求:
- 前端服务端所有发往后端的请求,统一在服务端代码里加自定义内部请求头,比如
x-internal-auth: 你的自定义内部密钥,注意这个密钥绝对不能下发到浏览器端,仅在前后端服务端通信时携带。 - 在NestJS的Throttler模块配置中添加跳过判定逻辑,示例代码:
// app.module.ts 中的ThrottlerModule配置 ThrottlerModule.forRoot({ ttl: 60, // 计数窗口60秒 limit: 20, // 单IP窗口内最大请求数20 skipIf: (executionContext) => { const req = executionContext.switchToHttp().getRequest(); // 识别到是内部前端服务发起的请求,直接跳过节流规则 return req.headers['x-internal-auth'] === '你的自定义内部密钥'; } })
- 额外配置注意:如果后端服务前挂载了Nginx等反向代理,一定要在NestJS入口文件中添加
app.set('trust proxy', true),否则Throttler会将反向代理的IP作为请求来源IP,导致普通用户的请求被合并计数引发误拦截。
内容的提问来源于stack exchange,提问作者Mostafa Safarian
相关产品推荐
相关产品推荐

