ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Node.js 限流实战:用 rate-limiter-flexible 与 express-rate-limit 限制并发请求

2026/10/4 5:20:47 拓冰建站 浏览量
Node.js 限流实战:用 rate-limiter-flexible 与 express-rate-limit 限制并发请求 文档教程后端【免费下载链接】nodebestpractices✅ The Node.js best practices list (July 2026)项目地址https://gitcode.com/GitHub_Trending/no/nodebestpractices点击查看免费下载导读本文基于 Node.js 最佳实践仓库nodebestpractices安全章节的《Limit concurrent requests》实践条目关联文档系统讲解如何在 Node.js 应用中实施请求速率限制Rate Limiting。文章将覆盖两种主流落地方式——纯 Node.js 场景下基于 Redis 的rate-limiter-flexible令牌桶限流以及 Express 场景下针对特定路由的express-rate-limit中间件限流并结合仓库内登录暴力破解防护等进阶案例帮助读者完整掌握从限流选型、参数调优到 429 响应处理的实战方案。为什么必须给 Node.js 应用限流nodebestpractices仓库在 README.md 的 6.2 条实践「Limit concurrent requests using a middleware」中将限流与OWASP 威胁分类中的 DoS拒绝服务攻击直接挂钩并给出 TL;DR 结论DoS 攻击非常流行且相对容易实施。应当使用外部服务云负载均衡器、云防火墙、nginx、rate-limiter-flexible包或对较小、非关键应用使用限速中间件如express-rate-limit来实施速率限制。如果不做限流后果原文 Otherwise 部分是应用可能遭受攻击导致拒绝服务真实用户会得到降级甚至完全不可用的服务。具体到 Node.js 场景风险点非常清晰单线程事件循环Node.js 处理高并发请求时一旦请求量超出处理能力CPU 与内存会被迅速耗尽响应延迟急剧升高形成雪崩成本放大每一次恶意请求都会触发数据库查询、第三方 API 调用等下游开销攻击者用极低成本即可拖垮昂贵的后端资源暴力破解入口/login、/admin等高权限路由若不做限流会成为密码字典攻击的靶子。因此限流的本质是为请求速率设置上限把流量控制在应用真实服务能力之内将超出上限的请求快速拒绝返回 HTTP 429。限流应放在哪一层外部服务优先中间件兜底nodebestpractices给出的建议是分层决策——优先把限流交给为它而生的专业服务中间件方案则用于规模较小、关键性较低的应用方案适用场景特点云负载均衡器 / 云防火墙大型生产应用在流量进入应用前拦截不消耗应用自身资源nginxlimit_req/limit_conn自有基础设施反向代理层限流支持按 IP 限速与并发连接限制rate-limiter-flexible需要精细策略、分布式存储的 Node.js 应用支持 Redis/Memory/PostgreSQL 等存储可精确到每秒点数express-rate-limitExpress 应用、特定路由快速加限流中间件形式一行挂载即可生效两者的选择并不互斥生产环境常见的组合是nginx/云防火墙做外层粗粒度防护 应用内中间件做路由级细粒度控制。方案一纯 Node.js 应用使用 rate-limiter-flexible 限流rate-limiter-flexible是一个不绑定 Web 框架的限流库通过独立的后端存储Redis、Memcached、PostgreSQL 等维护计数天然支持多实例/多进程间的分布式限流。以下代码示例取自 关联文档波兰语版与英文版 limitrequests.md 内容一致const http require(http); const redis require(redis); const { RateLimiterRedis } require(rate-limiter-flexible); const redisClient redis.createClient({ enable_offline_queue: false, }); // Maximum 20 requests per second const rateLimiter new RateLimiterRedis({ storeClient: redisClient, points: 20, duration: 1, blockDuration: 2, // block for 2 seconds if consumed more than 20 points per second }); http.createServer(async (req, res) { try { const rateLimiterRes await rateLimiter.consume(req.socket.remoteAddress); // Some app logic here res.writeHead(200); res.end(); } catch { res.writeHead(429); res.end(Too Many Requests); } }) .listen(3000);参数与行为拆解配置项示例值含义storeClientredisClient限流计数存储客户端rate-limiter-flexible支持 Redis、Memory、PostgreSQL、MySQL、MongoDB 等多种后端points20时间窗口内允许消耗的最大点数即最多 20 个请求duration1时间窗口长度秒与points组合即每秒 20 个请求blockDuration2点数耗尽后的额外阻塞时间秒即超限后拒绝新请求 2 秒关键调用链rateLimiter.consume(req.socket.remoteAddress)以客户端 IP 为键消耗一个点数。consume返回 Promise成功表示未超限继续执行业务逻辑超限处理当点数耗尽处于阻塞期时consume会 reject被catch捕获后返回HTTP 429Too Many Requests——这是限流场景下的标准状态码客户端与负载均衡器均可识别键的选择示例用req.socket.remoteAddress作为限流维度按 IP 限流。更精细的做法是按用户 ID、API Key 或 IP用户名的组合限流见下文登录防护案例。值得说明英文原版示例使用ioredis客户端new IoRedis({ enableOfflineQueue: false })波兰语版使用redis.createClient({ enable_offline_queue: false })。两者等价关键在于关闭离线队列enable_offline_queue: false/enableOfflineQueue: false——当 Redis 不可用时请求不要排队等待而是快速失败避免限流系统本身成为拖垮应用的瓶颈。从源码结构看RateLimiterRedis只依赖客户端暴露的incrby/expire/eval等基础命令因此任意实现该协议的 Redis 客户端均可接入。方案二Express 中间件对特定路由限流对于 Express 应用express-rate-limit提供了开箱即用的中间件式限流。以下示例同样取自 关联文档const RateLimit require(express-rate-limit); // important if behind a proxy to ensure client IP is passed to req.ip app.enable(trust proxy); const apiLimiter new RateLimit({ windowMs: 15*60*1000, // 15 minutes max: 100, }); // only apply to requests that begin with /user/ app.use(/user/, apiLimiter);配置要点windowMs时间窗口毫秒15*60*1000即 15 分钟max窗口内允许的最大请求数100即每 15 分钟最多 100 个请求app.enable(trust proxy)部署在代理nginx、云负载均衡器之后时必须开启。只有开启后Express 才会把代理透传的X-Forwarded-For头解析为真实客户端 IP 并写入req.ip否则所有请求会显示为代理的 IP限流将退化为全体用户共用一个额度app.use(/user/, apiLimiter)中间件按路径前缀挂载仅对/user/开头的路由生效。这种按路由差异化限流非常实用——例如登录接口限额收紧、静态资源不限额、开放 API 限额适中。进阶登录端点暴力破解防护仓库同主题案例限流不止用于防 DDoS。仓库中同属安全章节的 login-rate-limit.md 展示了如何用rate-limiter-flexible把限流策略做得更精细——防止对/login、/admin等高权限路由的暴力破解。其核心思路是同时建立两个限速器按「用户名 IP」组合计数连续失败次数最多允许 10 次连续失败之后阻塞 1 小时按 IP 计数每日失败总数一天内累计 100 次失败则将该 IP 阻塞 24 小时。const maxWrongAttemptsByIPperDay 100; const maxConsecutiveFailsByUsernameAndIP 10; const limiterSlowBruteByIP new RateLimiterRedis({ storeClient: redisClient, keyPrefix: login_fail_ip_per_day, points: maxWrongAttemptsByIPperDay, duration: 60 * 60 * 24, blockDuration: 60 * 60 * 24, // Block for 1 day, if 100 wrong attempts per day }); const limiterConsecutiveFailsByUsernameAndIP new RateLimiterRedis({ storeClient: redisClient, keyPrefix: login_fail_consecutive_username_and_ip, points: maxConsecutiveFailsByUsernameAndIP, duration: 60 * 60 * 24 * 90, // Store number for 90 days since first fail blockDuration: 60 * 60, // Block for 1 hour });这一案例带来的三个设计启发keyPrefix为不同限流策略设置独立前缀多个限速器可共用同一个 Redis 实例互不干扰限流维度要与攻击向量对齐纯按 IP 限流会被攻击者轮换 IP 绕过加入「用户名」维度后即使换 IP同一账户的连续失败仍会被计数窗口与阻塞时长分层短窗口1 小时应对即时攻击长窗口90 天计数 24 小时封禁应对分布式慢速攻击。仓库的 commonsecuritybestpractices.md 在 OWASP A2认证失效条目中亦明确要求在Y时间段内认证类接口含密码找回等不允许超过X次尝试与本案例互为印证。来自 NGINX 博客的观点关联文档 在「其他博客观点」一节引用了 NGINX 官方博客对限流的定位这段话精准概括了限流的三大价值Rate limiting can be used for security purposes, for example to slow down brute-force password-guessing attacks. It can help protect against DDoS attacks by limiting the incoming request rate to a value typical for real users, and (with logging) identify the targeted URLs. More generally, it is used to protect upstream application servers from being overwhelmed by too many user requests at the same time.即限流服务于安全防护拖慢暴力破解、抗 DDoS将请求速率限制在真实用户典型水平并借助日志识别被攻击的 URL以及保护上游应用服务器避免被过量请求淹没三个目标。落地清单综合仓库文档与实践实施限流时建议依次确认以下事项分层部署优先在 nginx / 云负载均衡器 / 云防火墙层做整体限流应用层做路由级精细化限流选型纯 Node.js 或需要分布式一致性选rate-limiter-flexibleRedis 存储Express 应用快速接入选express-rate-limit配置代理Express 中间件方案务必app.enable(trust proxy)否则限流维度失效维度选择一般流量按 IP登录、支付等高敏感路由按「用户名 IP」组合必要时叠加每日总量上限超限响应统一返回 HTTP 429并配合日志记录超限来源与目标 URL便于溯源对应 smartlogging.md 的日志实践存储容错限流存储如 Redis不可用时快速失败关闭离线队列不要让限流组件自身成为新的故障点。延伸阅读英文原版实践条目sections/security/limitrequests.md主仓库对应章节含 TL;DR 与 OWASP 标注README.md登录暴力破解防护同主题进阶案例sections/security/login-rate-limit.mdOWASP 通用安全实践认证限流建议sections/security/commonsecuritybestpractices.md赞分享文档教程后端【免费下载链接】nodebestpractices✅ The Node.js best practices list (July 2026)项目地址https://gitcode.com/GitHub_Trending/no/nodebestpractices点击查看免费下载相关推荐Node.js 限流实战用 rate-limiter-flexible 与 express-rate-limit 保护应用免遭请求洪峰nodebestpractices 安全实践 6.2Node.js 限流实战用 rate limiter flexible 与 express rate limit 保护应用免遭请求洪峰nodebestpra文档教程后端Node.js灵活限流器node-rate-limiter-flexible使用指南Node.js灵活限流器node rate limiter flexible使用指南 本指南旨在帮助您快速了解并开始使用 animir/node rate l后端应用安全开发工具Node.js限流器Rate Limiter实战指南基于jhurliman/node-rate-limiterNode.js限流器Rate Limiter实战指南基于jhurliman/node rate limiter 欢迎来到本教程我们将深入探索 jhurl后端创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考