系统设计时一般会预估负载,当系统暴露在公网中时,恶意攻击或正常突发流量等都可能导致系统被压垮,而限流就是保护措施之一。限流即控制流量,本文将记录 Nginx 的二种限流设置。
生活中的 “限流”?
限流并非新鲜事,在生活中亦无处不在,下面例举一二:
- 博物馆:限制每天参观总人数以保护文物
- 高铁安检:有若干安检口,旅客依次排队,工作人员根据安检快慢决定是否放人进去。遇到节假日,可以增加安检口来提高处理能力(横向拓展),同时增加排队等待区长度(缓存待处理任务)。
- 办理银行业务:所有人先领号,各窗口叫号处理。每个窗口处理速度根据客户具体业务而定,所有人排队等待叫号即可。若快下班时,告知客户明日再来(拒绝流量)。
- 水坝泄洪:水坝可以通过闸门控制泄洪速度(控制处理速度)。
以上”限流”例子,可以让服务提供者稳定的服务客户。
Nginx 限流
Nginx 提供两种限流方式,一是控制速率,二是控制并发连接数。
控制速率
正常限流
ngx_http_limit_req_module 模块提供限制请求处理速率能力,使用了漏桶算法(leaky bucket)。下面例子使用 nginx limit_req_zone 和 limit_req 两个指令,限制单个IP的请求处理速率。