Nginx 服務(wù)器可幫助我們實(shí)現(xiàn)對(duì)單個(gè)ip的請(qǐng)求速率限制
具體實(shí)現(xiàn)如下
http{
? ? ? ? limit_req_zone $binary_remote_addr? zone=one:10m? rate=10r/s;
? ? ? ? ?...
? ? ? ?server{
? ? ? ? ? location/search/{
? ? ? ? ? ? ?limit_req zone=one burst=5;
? ? ? ? ? ? ?}
? ? ? ? limit_req_zone?$session_variable?zone=name_of_zone:size??rate=rate 這句是設(shè)置存儲(chǔ)session的區(qū)域 大小 并設(shè)置速率限制
? ? ? ?$session_variable 意思是攝者session存儲(chǔ)的值key值? 我們以$binary_remote_addr(用戶ip)為key
? ? ? ?zone 意思是設(shè)置存儲(chǔ)key的區(qū)域名稱
? ? ? ?size 意思是區(qū)域大小 此處設(shè)置是10MB ,1 MB區(qū)域可容納大約16000個(gè)此大小的狀態(tài)。
? ? ? ?rate 意思是設(shè)置限制的速率? ? 1r/s => 是1秒 一個(gè)請(qǐng)求? ?2r/s=> 兩秒一個(gè)? 2r/m=>一分鐘兩個(gè)(具體看自己需求)
? ? ? ?設(shè)置好之后在server區(qū)域的location中? ?開(kāi)啟當(dāng)前命中區(qū)域的限制? ? limit_req? ?zone=one ;? 如此即可實(shí)現(xiàn)
? ? ? ?#限制每ip每秒不超過(guò)10個(gè)請(qǐng)求,爆發(fā)數(shù)burst為5#brust的意思就是,如果第1秒、2,3,4秒請(qǐng)求為9個(gè),
? ? ? ?#第5秒的請(qǐng)求為15個(gè)是被允許的。
? ? ? ?# 但是如果你第1秒就15個(gè)請(qǐng)求,第2秒超過(guò)10的請(qǐng)求返回503錯(cuò)誤。
? ? ? ? #nodelay,如果不設(shè)置該選項(xiàng),嚴(yán)格使用平均速率限制請(qǐng)求數(shù),#第1秒5個(gè)請(qǐng)求時(shí),5個(gè)請(qǐng)求放到第2秒執(zhí)行,
? ? ? ?#設(shè)置nodelay,15個(gè)請(qǐng)求將在第1秒執(zhí)行。
? ?