在很多大流量高并发的场景,如果用户并发量很高就会出现宕机的局面,所以这个时候都会涉及到限流@mikechen
高并发限流
限流是一种流量控制机制,用于限制客户端对服务器的请求速率、或并发连接数。
通过限流,可以保护服务器免受过多请求的影响,防止因请求过载而导致系统性能下降、或崩溃。
限流能过滤掉恶意请求、和非正常流量,防止瞬时流量激增对后端应用或数据库造成冲击,确保系统整体稳定性。
比如:防止拒绝服务攻击(DoS)限流机制,可以有效缓解 DoS 攻击和暴力破解尝试,在攻击初期就控制请求量,为运维提供响应时间和缓解措施。
Nginx 限流
Nginx 限流指的是利用 Nginx 自身提供的模块,对进入服务的请求进行速率控制,从而防止流量激增时服务被压垮。
通过限流机制,Nginx 可以对某个 IP、接口或用户维度的访问频率进行限制,从而防止服务过载、恶意攻击或资源滥用。
主要有两个核心模块:
limit_req
基于请求速率的限流模块,通过设置请求的单位时间内允许的最大请求数来平滑流量。
ngx_http_limit_req_module
:限制请求速率(QPS)。
limit_conn
限制单个客户端或连接的同时并发数,防止单个用户消耗过多资源。
ngx_http_limit_conn_module
:限制并发连接数。
Nginx限流原理
Nginx 的限流:主要依赖于令牌桶算法(Token Bucket)。
如下图所示:
+--------------+ | 令牌桶 | <--- 定时添加令牌 +--------------+ | 请求到达 → 判断令牌:有令牌则通过,无令牌则拒绝(或延时)
该算法工作的基本思路如下:
- 令牌生成系统以固定速率在一个“令牌桶”中不断添加令牌,令牌桶有一个上限容量。
- 令牌消耗当有请求到来时,需要从令牌桶中取走一个或多个令牌才能被允许执行。如果令牌不够,则请求会被拒绝或延时处理。
- 允许突发配置中可以设置一个突发(burst)值,这样在短时间内允许超过限速的请求积攒一定额度,适应瞬时流量波动。
通过这样的机制,Nginx 能够对请求进行即时判断,从而实现“速率平滑”的效果,在整个流量峰值期间保护后端服务的稳定性。
Nginx 限流配置
每个 IP 每秒最多 5 个请求,最多允许 10 个突发请求(瞬时爆发)。
如下所示:
http { # 定义限流区域 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; proxy_pass http://backend_api; } } }
适用于防止单个 IP 在短时间内频繁请求 API 接口。
基于并发连接数的限流配置,假设我们要限制每个 IP 最多建立 10 个并发连接。
如下所示:
http { # 定义连接限制区域,基于客户端 IP,分配 10MB 内存 limit_conn_zone $binary_remote_addr zone=conn_limit:10m; server { listen 80; server_name example.com; location / { # 限制每个 IP 的最大并发连接数为 10 limit_conn zone=conn_limit 10; root /var/www/html; index index.html; } } }
limit_conn_zone:定义连接限制区域。
limit_conn:设置每个 IP 的最大并发连接数为 10,超出限制的请求将被拒绝。
总之,Nginx 限流是一种高效的流量管理手段,能够帮助开发者应对高并发、恶意攻击和资源滥用等问题。
mikechen
mikechen睿哥,10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!

后台回复【架构】即可获取《阿里架构师进阶专题全部合集》,后台回复【面试】即可获取《史上最全阿里Java面试题总结》