【Nginx】第八節 請求限制

      網友投稿 751 2025-04-08

      author:咔咔


      wechat:fangkangfk

      這里我就復制一份別人寫的不錯的總結,我就簡單說一下$binary_remote_addr這個參數,這個參數跟remoto_addr都是客戶端ip的參數,但是$binary_remote_addr這個在存儲的時候會比remote_addr少10來個字節,就這一個注意點

      使用場景:

      我們經常會遇到這種情況,服務器流量異常,負載過大等等。對于大流量惡意的攻擊訪問,會帶來帶寬的浪費,服務器壓力,影響業務,往往考慮對同一個ip的連接數,并發數進行限制。http_limit_conn_module 模塊來實現。該模塊可以根據定義的鍵來限制每個鍵值的連接數,如同一個IP來源的連接數。并不是所有的連接都會被該模塊計數,只有那些正在被處理的請求(這些請求的頭信息已被完全讀入)所在的連接才會被計數。http_limit_req_module 模塊來實現,該模塊可以通過定義的 鍵值來限制請求處理的頻率。特別的,可以限制來自單個IP地址的請求處理頻率。 限制的方法如同漏斗,每秒固定處理請求數,推遲過多請求。

      二,配置語法

      1,http_limit_conn_module指令解釋

      limit_conn_zone

      語法: limit_conn_zone $variable zone=name:size;

      默認值: none

      配置段: http

      該指令描述會話狀態存儲區域。鍵的狀態中保存了當前連接數,鍵的值可以是特定變量的任何非空值(空值將不會被考慮)。$variable定義鍵,zone=name定義區域名稱,后面的limit_conn指令會用到的。size定義各個鍵共享內存空間大小。如:

      limit_conn_zone $binary_remote_addr zone=addr:10m;

      注釋:客戶端的IP地址作為鍵。注意,這里使用的是$binary_remote_addr變量,而不是$remote_addr變量。

      $remote_addr變量的長度為7字節到15字節,而存儲狀態在32位平臺中占用32字節或64字節,在64位平臺中占用64字節。

      $binary_remote_addr變量的長度是固定的4字節,存儲狀態在32位平臺中占用32字節或64字節,在64位平臺中占用64字節。

      1M共享空間可以保存3.2萬個32位的狀態,1.6萬個64位的狀態。

      如果共享內存空間被耗盡,服務器將會對后續所有的請求返回 503 (Service Temporarily Unavailable) 錯誤。

      limit_zone 指令和limit_conn_zone指令同等意思,已經被棄用,就不再做說明了。

      limit_conn_log_level

      語法:limit_conn_log_level info | notice | warn | error

      默認值:error

      【Nginx】第八節 請求限制

      配置段:http, server, location

      當達到最大限制連接數后,記錄日志的等級。

      limit_conn

      語法:limit_conn zone_name number

      默認值:none

      配置段:http, server, location

      指定每個給定鍵值的最大同時連接數,當超過這個數字時被返回503 (Service Temporarily Unavailable)錯誤。如:

      limit_conn_zone $binary_remote_addrzone=addr:10m;

      server{

      location /www.baidu.com/{

      limit_conn addr 1;

      }

      }

      同一IP同一時間只允許有一個連接。

      當多個 limit_conn 指令被配置時,所有的連接數限制都會生效。比如,下面配置不僅會限制單一IP來源的連接數,同時也會限制單一虛擬服務器的總連接數:

      limit_conn_zone $binary_remote_addr zone=perip:10m;

      limit_conn_zone $server_name zone=perserver:10m;

      server {

      limit_conn perip 10;

      limit_conn perserver 100;

      }

      [warning]limit_conn指令可以從上級繼承下來。[/warning]

      limit_conn_status

      語法: limit_conn_status code;

      默認值: limit_conn_status 503;

      配置段: http, server, location

      該指定在1.3.15版本引入的。指定當超過限制時,返回的狀態碼。默認是503。

      limit_rate

      語法:limit_rate rate

      默認值:0

      配置段:http, server, location, if in location

      對每個連接的速率限制。參數rate的單位是字節/秒,設置為0將關閉限速。 按連接限速而不是按IP限制,因此如果某個客戶端同時開啟了兩個連接,那么客戶端的整體速率是這條指令設置值的2倍。

      完整實例配置

      http{

      limit_conn_zone$binary_remote_addrzone=limit:10m;

      limit_conn_log_level info;

      server{

      location??^~/download/{

      limit_conn limit 4;

      limit_rate 200k;

      /data/www.baidu.com/download/;

      }

      }

      }

      使用注意事項

      事務都具有兩面性的。http_limit_conn_module 模塊雖說可以解決當前面臨的并發問題,但是會引入另外一些問題的。如前端如果有做LVS或反代,而我們后端啟用了該模塊功能,那不是非常多503錯誤了?這樣的話,可以在前端啟用該模塊,要么就是設置白名單,白名單設置參見后續的文檔。

      2,ngx_http_limit_req_module模塊指令

      limit_req_zone

      語法: limit_req_zone $variable zone=name:size rate=rate;

      默認值: none

      配置段: http

      設置一塊共享內存限制域用來保存鍵值的狀態參數。 特別是保存了當前超出請求的數量。 鍵的值就是指定的變量(空值不會被計算)。如

      limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;

      說明:區域名稱為one,大小為10m,平均處理的請求頻率不能超過每秒一次。

      鍵值是客戶端IP。

      使用$binary_remote_addr變量, 可以將每條狀態記錄的大小減少到64個字節,這樣1M的內存可以保存大約1萬6千個64字節的記錄。

      如果限制域的存儲空間耗盡了,對于后續所有請求,服務器都會返回 503 (Service Temporarily Unavailable)錯誤。

      速度可以設置為每秒處理請求數和每分鐘處理請求數,其值必須是整數,所以如果你需要指定每秒處理少于1個的請求,2秒處理一個請求,可以使用 “30r/m”。

      limit_req_log_level

      語法: limit_req_log_level info | notice | warn | error;

      默認值: limit_req_log_level error;

      配置段: http, server, location

      設置你所希望的日志級別,當服務器因為頻率過高拒絕或者延遲處理請求時可以記下相應級別的日志。 延遲記錄的日志級別比拒絕的低一個級別;比如, 如果設置“limit_req_log_level notice”, 延遲的日志就是info級別。

      limit_req_status

      語法: limit_req_status code;

      默認值: limit_req_status 503;

      配置段: http, server, location

      該指令在1.3.15版本引入。設置拒絕請求的響應狀態碼。

      limit_req

      語法: limit_req zone=name [burst=number] [nodelay];

      默認值: —

      配置段: http, server, location

      設置對應的共享內存限制域和允許被處理的最大請求數閾值。 如果請求的頻率超過了限制域配置的值,請求處理會被延遲,所以所有的請求都是以定義的頻率被處理的。 超過頻率限制的請求會被延遲,直到被延遲的請求數超過了定義的閾值,這時,這個請求會被終止,并返回503 (Service Temporarily Unavailable) 錯誤。這個閾值的默認值為0。如:

      limit_req_zone $binary_remote_addr zone=creq:10 mrate=1r/s;

      server{

      location /www.baidu.com/{

      limit_req zone=creq burst=5;

      }

      }

      限制平均每秒不超過一個請求,同時允許超過頻率限制的請求數不多于5個。

      如果不希望超過的請求被延遲,可以用nodelay參數,如:

      limit_req zone=ttlsa_com burst=5 nodelay;

      完整實例配置

      http{

      limit_req_zone $binary_remote_addr zone=creq:10m rate=1r/s;

      server{

      location??^~/download/{

      limit_req zone=creq burst=5;

      data/www.baidu.com/download/;

      }

      }

      }

      可能要對某些IP不做限制,需要使用到白名單。

      nginx

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:WPS的表格軟件,為什么批注會無緣無故不見了,重新添加進去保存再次打開表格后又不見了,是什么原因呢?
      下一篇:如何在wps文本目錄中鍵入省略號
      相關文章
      久久久久亚洲AV无码专区首JN| 亚洲精品乱码久久久久66| 久久精品国产亚洲夜色AV网站| 国产综合精品久久亚洲| 亚洲精品无码久久不卡| 亚洲成A人片在线观看中文| 国产午夜亚洲精品不卡| 日本亚洲欧美色视频在线播放| 亚洲人成网站免费播放| 亚洲精品乱码久久久久久V| 亚洲区日韩精品中文字幕| 日韩亚洲不卡在线视频中文字幕在线观看| 亚洲第一香蕉视频| 亚洲人成在线中文字幕| 色婷五月综激情亚洲综合| 亚洲中文字幕无码亚洲成A人片| 成人亚洲国产va天堂| 亚洲爆乳无码专区www| 国产精品亚洲AV三区| 亚洲国产综合精品一区在线播放| 亚洲国产激情一区二区三区| 国产成人亚洲综合| 久久亚洲综合色一区二区三区 | 亚洲午夜精品久久久久久app| 亚洲综合久久精品无码色欲| 亚洲精品永久在线观看| 在线亚洲精品视频| 中文字幕无码精品亚洲资源网| 亚洲真人无码永久在线| 亚洲妇熟XXXX妇色黄| 亚洲情a成黄在线观看动漫尤物| 亚洲精品视频观看| 亚洲中文字幕久久无码| 小说专区亚洲春色校园| 亚洲中文字幕无码一区二区三区| 亚洲AV无码一区二区三区系列 | 亚洲毛片无码专区亚洲乱| 中文字幕乱码亚洲无线三区 | 四虎精品亚洲一区二区三区| 久久精品亚洲乱码伦伦中文| 亚洲Av永久无码精品三区在线|