☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜

在现代互联网系统中,“限流”已经是一个绕不开的话题。随着用户规模增长、业务场景复杂化、恶意流量与突发流量不断出现,限流成为保障系统稳定性的关键手段。而作为最广泛使用的 web 服务器和反向代理组件,nginx 在限流方面能力强、性能高、部署简单,是大多数系统流量治理的第一道防线。
本文将从限流背景、Nginx 限流原理、能够做到的能力边界、典型应用场景,并配合多个完整配置示例进行深入讲解。
限流的核心目标是:
防止突发或恶意流量把系统压垮,保持服务稳定可用。
在实际业务中,限流解决的问题包括:
如爬虫、DDOS、小脚本不停访问同一个接口,导致服务不可用。
后端数据库、RPC 服务、第三方接口通常都是“贵重资源”,并发能力有限。
如果没有限流,有突发高峰时 CPU、内存、连接数可能飙升,引发雪崩。
如开放平台、企业 API 必须限制用户每秒调用次数。
一些接口耗时长或资源占用大,需要限流避免过载。
在这些问题面前,Nginx 的限流往往作为第一道“入口级”防线,成本低、效果好,部署灵活。
Nginx 内置两套限流机制,对应两类场景。
limit_req 的请求速率限流(令牌桶)例如:
<code class="javascript">1 秒只允许 1 次访问,多余的就被 503 拒绝</code>
<code class="javascript">2) 基于 limit_conn 的连接数限流</code>
很多人关心 Nginx 限流到底能做到多强,下面是能力范围:
适合作为高性能入口网关限流。
可按:
IPCookieHeaderURL 维度自定义 user key(如 userId)但不能做到:
分布式限流(需要 Redis + Lua 或 gateway)多维度复杂策略(如组合规则)动态策略(配置变更需 reload)Nginx 能实现:
硬限流(超过拒绝)软限流(burst + nodelay)阈值分段控制慢速拒绝延迟(“雨露均沾”策略)但不能做到:
按响应状态反馈流量按服务后端负载自动调整这些通常需要服务网关或自研流控系统。
如登录接口、短信接口、下单接口。
特别是活动、营销场景。
比如免费 API 每秒 1 次,付费用户每秒 10 次。
阻挡下载服务、流媒体服务的恶意并发。
比把限流逻辑放在业务更高效。
下面通过多个典型实战示例深入解释。
同一个 IP 每秒只能访问 5 次,多余的请求直接拒绝。
<code class="javascript">http { # 限流区域:10MB 共享内存,大概可存 160,000 个 IP 状态 limit_req_zone $binary_remote_addr zone=req_limit_per_ip:10m rate=5r/s; server { location /api/ { limit_req zone=req_limit_per_ip burst=10 nodelay; } }}</code><code class="javascript">说明:</code>
rate=5r/s:每秒允许 5 次burst=10:允许瞬间突发 10 次(缓冲区)nodelay:超过 5 次立即消费 burst,不排队<code class="javascript">limit_req_zone $binary_remote_addr zone=login_limit:5m rate=3r/m;limit_req_zone $binary_remote_addr zone=sms_limit:5m rate=1r/10m;server { location /login { limit_req zone=login_limit burst=5; } location /sendSms { limit_req zone=sms_limit burst=1; }}</code><code class="javascript">说明:</code>
精细化限流非常常见于业务风控系统。
按 userId 限流,而不是按 IP。
假设客户端请求 header 中有:X-User-ID: 123
<code class="javascript">limit_req_zone $http_x_user_id zone=user_limit:10m rate=10r/s;server { location /api/ { limit_req zone=user_limit burst=20 nodelay; }}</code><code class="javascript">说明:</code>
通过 $http_x_user_id 实现业务维度限流,这种方式:
单个 IP 最多 2 个并发请求连接。
<code class="javascript">limit_conn_zone $binary_remote_addr zone=conn_ip_limit:10m;server { location /download/ { limit_conn conn_ip_limit 2; }}</code><code class="javascript">用于:</code>
很多实际场景要同时满足多个限流规则:
<code class="javascript">limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s;limit_conn_zone $binary_remote_addr zone=conn_limit:10m;server { location / { # 限 QPS limit_req zone=req_limit burst=20; # 限并发连接 limit_conn conn_limit 5; }}</code><code class="javascript">这是线上最常见的组合策略。</code>
为了让内容更贴近实际场景,这里补充一些经验:
限流不是越严越好,需要:
了解接口 QPS 上限结合业务峰值场景区分高频接口 vs 低频接口区分用户群如果不用 burst,限流会太“硬”,容易误伤正常用户。
建议:
高风险接口(验证码、短信) →burst=1~2普通接口 → burst=5~20高流量接口 → burst=20~100如果要全网统一限流,需要:
nginx + lua + redisgateway(Spring Cloud Gateway)service mesh自研限流平台Nginx 单机限流粒度是每个 worker 都在共享内存上判断,性能很高。
如:
<code class="javascript">10MB 可存 ~160,000 个 key 状态</code>
如果用户多,内存要适当调大。
限流永远不是“限制用户”,而是“保护系统”。
Nginx 的限流优点是:
高性能简单配置灵活 key 维度成本低是入口被打爆前最有效的保护在流量不可控、攻击频发、业务增长迅速的时代,确保入口层限流合理,是每一个系统架构设计必须考虑的内容。
以上就是深入理解 Nginx 限流:背景、原理、能力边界与实战示例的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号