1. 程式人生 > >nginx對ip限流的操作

nginx對ip限流的操作

一.背景

  我們經常遇到這種情況,客戶使用生產環境進行了壓力測試,大量的請求,導致其他客戶的請求未能響應。

  伺服器資源有限,但是客戶端來的請求在不斷的上漲, 為了保證一部分的請求能夠正常相應, 不得不放棄一些客戶端來的請求, 這個時候我們會選擇行的進行一些NGINX的限流操作, 這種操作可以很大程度上緩解伺服器的壓力, 使其他正常的請求能夠得到正常響應.

二.使用nginx模組

  •   1. ngx_http_limit_conn_module模組

     說明:此模組用來限制單IP的連線數

     配置方式:

     1.在nginx配置檔案中的http配置模組新增: limit_conn_zone key zone=name:size;

         說明:開闢一個記憶體空間,為不同的key值儲存狀態,狀態屬性裡面有當前來的連線數。key可以為變數,這裡的key為$binary_remote_addr,即遠端伺服器的地址。name為該空間的命名,size為大小。

         PS:  64位系統上,$binary_remote_addr儲存佔用64 bytes記憶體空間,狀態儲存佔用64bytes記憶體空間,1M的size能存8192個不同$binary_remote_addr的狀態。

      2. 再在http->server->location配置模組中新增:limit_conn zone number;

          說明:在當前location下,命名為zonekey值對應的連線數不能超過number,如果超過了,就會返回503錯誤

     配置例項:

http {
# 定義一個key為$binary_remote_addr、名字為addr、空間大小為10M的limit_conn_zone
limit_conn_zone $binary_remote_addr zone=addr:10m;
    ...
    server {
        ...
        location /download/ {
            # 定義當前location下$binary_remote_addr對應的連線數不能超過1
            limit_conn addr 1;
        }
     }
  }
  •  ngx_http_limit_req_module模組

     說明:此模組用來限制單IP的請求頻率

     配置方式:

     1.在nginx配置檔案中的http配置模組新增: limit_req_zone key zone=name:size rate[rate];

         說明:開闢一個記憶體空間,為不同的key值儲存狀態,狀態屬性裡面有當前來的次數數。key可以為變數,這裡的key為$binary_remote_addr,即遠端伺服器的地址。name為該空間的命名,size為大小,rate為限制的頻率。

         PS:  64位系統上,$binary_remote_addr儲存佔用64 bytes記憶體空間,狀態儲存佔用64bytes記憶體空間,1M的size能存8192個不同$binary_remote_addr的狀態。

      2. 再在http->server->location配置模組中新增:limit_req_zone=name [brust=number] [nodelay];

          說明:當前location受zone名為name的limit_req_zone限制,burst為可配引數,該配置可以理解為允許速率超過正常的請求個數(實際上比這個複雜的多),數量為number個,如果超過了,可配引數nodelay配置了就會返回503錯誤,沒有配置超過的請求就會排隊等待。

      配置示例:
http {
# 定義一個key為$binary_remote_addr、名字為one、空間大小為10M、速度限制為1次每秒的limit_req_zone
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
    ...
    server {
        ...
        location /search/ {
            # 定義當前location請求受名為one的limit_req_zone限制,令牌數為5,請求溢位後直接報錯
            limit_req zone=one burst=5 nodelay;
        }
    }
}
    

  附錄:

     可能存在有些IP我們是不想被限制的,則可利用nginx_http_geo_module 和 ngx_http_map_module模組

   具體配置示例:

  http {

    # 定義名為$whiteiplist的geo,會根據client IP 對映成不同的值,預設值為1,白名單ip的值為0 

geo $whiteiplist  {

default 1;    #IP預設對映為1,根據geo的優先順序,優先匹配完整IP。

192.168.1.10 0;  #將192,168.10.0對映為0

192.168.1.11 0;

}

        # 定義名為$limit變數,$limit變數的值是由$whiteiplist的值決定的,當$whiteiplist為1時,$limit的值為$binary_remote_addr;當$whiteiplist為0時,$limit的值為空

map $whiteiplist $limit {

     1 $binary_remote_addr;

     0 "" ;

}

# 定義一個key為$limit、名字為one、空間大小為10M、速度限制為1次每秒的limit_req_zone
limit_req_zone $limit zone=one:10m rate=1r/s;

……

    server {
        ...
location /search/ {
            # 定義當前location請求受名為one的limit_req_zone限制,令牌數為5,請求溢位後直接報錯
            limit_req zone=one burst=5 nodelay;
        }

}

         }


PS:特別要感謝我們公司的無忌大哥,出自他手,我只是一個過客。