模塊: ngx_http_limit_req_modulenode
做用: 限制客戶端請求頻率,防止惡意攻擊nginx
配置示例:api
http { limit_req_zone $binary_remote_addr zone=req_perip:50m rate=10r/s; ... server { ... location /api/ { limit_req zone=req_perip burst=50 nodelay; limit_req_status 503; } } }
說明: 示例中定義的區域名稱爲req_perip(zone=req_perip),分配內存大小爲50m(若是限制域的存儲空間耗盡了,對於後續全部請求,服務器都會返回 503),同一個ip($binary_remote_addr)平均處理的請求頻率不能超過每秒10次(rate=10r/s); 若是超過每秒10次但超過的請求數量小於等於50(burst=50)時,會延遲請求。若是超過每秒10次的請求數超過50,則當即返回503(limit_req_status 503)給客戶端bash
limit_req_zone服務器
limit_reqspa
limit_req_status 日誌
limit_req_log_level code
limit_req_zone
語法: limit_req_zone key zone=name:size rate=rate; (可理解爲該指令用來定義限制請求頻率)
可配置區域: http
key: 必選項;取值範圍: 1,text(文本); 2,nginx變量;3,text和nginx變量的組合; 注: 1.7.6版本以前取值只能是nginx變量
name: 必選項;自定義字符串
size: 必選項;分配內存大小,用來保存鍵值的狀態參數
rate: 必選項;每秒可請求的頻率(r/s), 或每分鐘可請求的頻率(r/m)
limit_req
語法: limit_req zone=name [burst=number] [nodelay]; (可理解爲使用定義的限制請求頻率,必定是先定義後使用!也就是必定要有limit_req_zone指令的配置後才能使用該配置)
可配置區域: http, server, location
name: 必選項;自定義字符串, 名字必須與limit_req_zone中zone=name這個名字一致
number: 必選項;正整數數字, 平均每秒容許不超過limit_req_zone指令中rate規定的請求數,而且不會超過該值所指定數量的請求, 可延遲請求的數量
nodelay: 可選配置, 表示請求頻率超過rate規定值後又超過burst規定值後當即返回客戶端503(可設置返回code)
limit_req_status 語法: limit_req_status code; 默認值: 503 可配置區域: http, server, location 表示超出limit_req配置的請求數量後返回給客戶端的錯誤碼
使用該指令最低版本 1.3.15
limit_req_log_level
語法: limit_req_log_level info | notice | warn | error;
默認值: limit_req_log_level error;
可配置區域: http, server, location
當服務器拒絕處理因爲速率超過或延遲請求處理而拒絕處理請求時,設置所需的日誌記錄級別。
最低版本: 0.8.18
常見錯誤:server
nginx: [emerg] zero size shared memory zone "oneip"blog
出現此錯誤都是由於在未指定limit_req_zone指定就使用了limit_req指令的緣由(或者limit_req中的name值和limit_req_zone中定義的name值不一致)