基於Nginx的分佈式限流

# 根據IP地址進行限流
# 1) 第一個參數 $binary_remote_addr
#    binary_目的是縮小內存佔用,remote_addr表示經過ip地址來限流
# 2) 第二個參數 zone=iplimit:20m
#    iplimit是一塊內存區域(記錄訪問頻率信息),20m表示這塊內存區域的大小
# 3) 第三個參數 rate=1r/s
#    好比rate=100r/m,表示訪問的限流頻率
limit_req_zone $binary_remote_addr zone=iplimit:20m rate=10r/s;

# 根據服務器級別進行限流
limit_req_zone $server_name zone=severlimit:10m rate=100r/s;

# 基於鏈接數的配置
limit_conn_zone $binary_remote_addr zone=perip:20m;
limit_conn_zone $server_name zone=perserver:20m;

server {
        server_name www.nginx-limit.com;
        location /access-limit/ {
                proxy_pass http://172.16.50.2:8888/;

                # 基於IP地址的限制
                # 1) 第一個參數 zone=iplimit -> 引用limit_req_zone中的zone變量
                # 2) 第二個參數 burst=2 -> 設置一個大小爲2的緩衝區域,等大量請求到來
                #    請求數量超過限流頻率時,將其放入緩衝區域
                # 3) 第三個參數 nodelay->緩衝區域滿了之後返回503錯誤
                limit_req zone=iplimit burst=2 nodelay;

                # 基於服務器級別的限制
                # 一般狀況下,server級別的限制速率是最大的
                limit_req zone=serverlimit burst=100 nodelay;

                # 每一個server最多保持100個鏈接
                limit_conn perserver 100;
                # 每一個ip最多保持1個鏈接
                limit_conn perip 1;

                #異常狀況返回504(默認返回503)
                limit_req_status 504;
                limit_conn_status 504;
        }
# 限制下載速度
location /download/ {
    # 下載完100m後開始限制  
    limit_rate_after 100m;
    # 限制下載的速度
    limit_rate 256k;
}
相關文章
相關標籤/搜索