漏桶算法
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;
}
}