Nginx限速方案

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

本文链接:

https://coolhu.com/Nginx_speed.html

你必须登录后才能发表评论

1 评论
mufeng Windows
2021.03.10 17:10
有用!