Skip to content

Nginx限流

Published: at 05:08 AM

漏桶算法

Nginx按请求速率限速的模块使用的是漏桶算法, 这个算法的核心思路是设置一个单位时间内处理请求的数量上限,过多的请求直接放弃,可以返回自己设置的http状态码。漏桶算法也有应对突发的方式,可以设置一个burst,在”桶”溢出后,可以将一定数量的请求先缓存起来,稍后再处理,直到缓存也溢出时丢弃请求。

参数配置

limit_req_zone

参数语义:

Syntax:	limit_req zone=name [burst=number] [nodelay];
Default:	—
Context:  http, server, location

limit_req_zone 用来限制单位时间内的请求数,即速率限制,采用的漏桶算法

limit_req_zone $binary_remote_addr zone=one:10m rate=5r/s;

zone=one:10m表示生成一个大小为10M,名字为one的内存区域用来存储访问的频次信息
rate=5r/s表示限制的频率是每秒5次,如果是60r/m即每分钟60次
nodelay:超过访问频次而且缓冲区也满了的时候就会直接返回503,如果没有设置,则所有请求会等待排队。

limit_conn

限制单个IP的请求数(只计数服务器已处理请求并读取了请求头的连接)

Syntax:	limit_conn zone number;
Default:	—
Context:	http, server, location

limit_conn_log_level

限制连接数时,日志的记录级别

Syntax:	limit_conn_log_level info | notice | warn | error;
Default:  limit_conn_log_level error;
Context:  http, server, location

limit_conn_status

设置拒绝请求时返回的状态码

Syntax:	limit_conn_status code;
Default:
limit_conn_status 503;
Context:	http, server, location

示例

limit_req_zone $binary_remote_addr zone=one:10m rate=5r/s;

server {
	location / {
		limit_req zone=one burst=5;
		limit_req_status 429;
		limit_conn_log_level notice;
	}
}