<menu id="guoca"></menu>
<nav id="guoca"></nav><xmp id="guoca">
  • <xmp id="guoca">
  • <nav id="guoca"><code id="guoca"></code></nav>
  • <nav id="guoca"><code id="guoca"></code></nav>

    Nginx 中如何限制某個 IP 同一時間段的訪問次數


    發現錯別字 2年前 提問
    回答
    1
    瀏覽
    479
    請勿發布不友善或者負能量的內容。與人為善,比聰明更重要!
    回答數量: 1
    CISO 高級信息系統項目管理師 PMP

    nginx可以通過ngx_http_limit_conn_modulengx_http_limit_req_module配置來限制ip在同一時間段的訪問次數。

    ngx_http_limit_conn_module:該模塊用于限制每個定義的密鑰的連接數,特別是單個IP地址的連接數.使用limit_conn_zone和limit_conn指令。

    ngx_http_limit_req_module:用于限制每一個定義的密鑰的請求的處理速率,特別是從一個單一的IP地址的請求的處理速率。使用“泄漏桶”方法進行限制.指令:limit_req_zone和limit_req。

    ngx_http_limit_conn_module:限制單個IP的連接數

    示例:

    http { 
      limit_conn_zone $binary_remote_addr zone=addr:10m; 
       #定義一個名為addr的limit_req_zone用來存儲session,大小是10M內存,
      #以$binary_remote_addr 為key,
      #nginx 1.18以后用limit_conn_zone替換了limit_conn,
      #且只能放在http{}代碼段.
      ... 
      server { 
        ... 
        location /download/ { 
          limit_conn addr 1;   #連接數限制
          #設置給定鍵值的共享內存區域和允許的最大連接數。超出此限制時,服務器將返回503(服務臨時不可用)錯誤.
           #如果區域存儲空間不足,服務器將返回503(服務臨時不可用)錯誤
        }

    可能有幾個limit_conn指令,以下配置將限制每個客戶端IP與服務器的連接數,同時限制與虛擬服務器的總連接數:

    http {
    
    limit_conn_zone $binary_remote_addr zone=perip:10m;
    
    limit_conn_zone $server_name zone=perserver:10m
    
    ...
    
    server {
    
    ...
    
    limit_conn perip 10;` `#單個客戶端ip與服務器的連接數.
    
    limit_conn perserver 100;  #限制與服務器的總連接數
    
    }

    ngx_http_limit_req_module:限制某一時間內,單一IP的請求數.

    示例:

    http {
      limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
      ...
      #定義一個名為one的limit_req_zone用來存儲session,大小是10M內存,  
      #以$binary_remote_addr 為key,限制平均每秒的請求為1個,
      #1M能存儲16000個狀態,rete的值必須為整數,
    
      server {
        ...
        location /search/ {
          limit_req zone=one burst=5;
    
            #限制每ip每秒不超過1個請求,漏桶數burst為5,也就是隊列.
            #nodelay,如果不設置該選項,嚴格使用平均速率限制請求數,超過的請求被延時處理.
            #舉個栗子:
            #設置rate=20r/s每秒請求數為20個,漏桶數burst為5個,
            #brust的意思就是,如果第1秒、2,3,4秒請求為19個,第5秒的請求為25個是被允許的,可以理解為20+5
            #但是如果你第1秒就25個請求,第2秒超過20的請求返回503錯誤.
            #如果區域存儲空間不足,服務器將返回503(服務臨時不可用)錯誤 
            #速率在每秒請求中指定(r/s)。如果需要每秒少于一個請求的速率,則以每分鐘的請求(r/m)指定。 
    
        }

    還可以限制來自單個IP地址的請求的處理速率,同時限制虛擬服務器的請求處理速率:

    http {
      limit_req_zone $binary_remote_addr zone=perip:10m rate=1r/s;
      limit_req_zone $server_name zone=perserver:10m rate=10r/s;
      ...
      server {
        ...
          limit_req zone=perip burst=5 nodelay;  #漏桶數為5個.也就是隊列數.nodelay:不啟用延遲.
          limit_req zone=perserver burst=10;    #限制nginx的處理速率為每秒10}

    回答所涉及的環境:聯想天逸510S、Windows 10。

    2年前 / 評論
    亚洲 欧美 自拍 唯美 另类