nginx的自带模块ngx_http_limit_req_module可以直接支持网站限流。
nginx的限速算法使用漏桶算法,可以结合burst实现类似令牌桶的可允许瞬间超限的限速效果。
从实际应用场景来讲,主要有两个方面:
1,入口处基于IP限速。
基于IP的限速往往还要跟IP白名单匹配使用。白名单功能则还需要ngx_http_geo_module模块支持。以下是代码实例。
http{
# 对IP限速:设置白名单
geo $whiteiplist {
default 1;
#下面补充白名单IP 值要为0
127.0.0.1 0;
}
map $whiteiplist $limit_ip {
1 $binary_remote_addr;
0 "";
}
# 对IP限速:设置限速缓存大小和速率
limit_req_zone $limit_ip zone=limit_ip_zone:10m rate=6r/s;
# 对IP限速:设置具体的限速策略 以下可以放到任意位置,包括http、server和location,根据自己业务自由决定。
# burst表示限速的缓存队列,超限请求先放到队列中,队列满的情况下直接丢弃
# nodelay表示缓存队列中的请求是否直接执行。注意,即使执行了,队列也不会立刻清理,可以认为是按照指定的rate来恢复队列
# limit_req_status指定超速的请求返回的http code
limit_req zone=limit_ip_zone burst=50 nodelay;
limit_req_status 599;
}
2,具体业务限速。
这种情况不是为了防止某个IP狂打请求,是根据业务能承受的极限吞吐量,设置访问该业务的请求QPS极限。
比如,接口根据请求url的type字段区分不同业务。接口a能承受每分钟6个请求,接口b能承受每分钟30个,配置如下:
http{
# 自定义限速 只能放到http段
limit_req_zone $ta zone=limit_ta:1m rate=6r/m;
limit_req_zone $tb zone=limit_tb:1m rate=30r/m;
# 具体限速方案,可在任何位置设置(http server location)
limit_req zone=limit_ta burst=1 nodelay;
limit_req zone=limit_tb burst=2 nodelay;
if ($arg_type = 'a') {
set $ta $arg_type;
}
if ($arg_type = 'b') {
set $tb $arg_type;
}
limit_req_status 597;
}
Nginx