Nginx 對(duì)訪問量的控制

目的

了解 nginx 的 ngx_http_limit_conn_module 和 ngx_http_limit_req_module 模塊,對(duì)請(qǐng)求訪問量進(jìn)行控制。

推薦教程:nginx教程

Nginx 模塊化

nginx 的內(nèi)部結(jié)構(gòu)是由核心模塊和一系列的功能模塊所組成。模塊化架構(gòu)使得每個(gè)模塊的功能相對(duì)簡(jiǎn)單,實(shí)現(xiàn)高內(nèi)聚,同時(shí)也便于對(duì) Nginx 進(jìn)行功能擴(kuò)展。

針對(duì) web 請(qǐng)求,Nginx 所有開啟的模塊會(huì)組成一條鏈,類似于闖關(guān)游戲中的一道道關(guān)卡,每個(gè)模塊負(fù)責(zé)特定的功能,例如實(shí)現(xiàn)壓縮的 ngx_http_gzip_module 模塊,實(shí)現(xiàn)驗(yàn)證的 ngx_http_auth_basic_module 模塊和實(shí)現(xiàn)代理的 ngx_http_proxy_module 模塊等。連接到服務(wù)器的請(qǐng)求,會(huì)依次經(jīng)過 Nginx 各個(gè)模塊的處理,只有通過這些模塊處理之后的請(qǐng)求才會(huì)真正的傳遞給后臺(tái)程序代碼進(jìn)行處理。

Nginx 并發(fā)訪問控制

對(duì)于 web 服務(wù)器而言,當(dāng)遇到網(wǎng)絡(luò)爬蟲,或者惡意大流量攻擊訪問時(shí),會(huì)造成服務(wù)器內(nèi)存和 CPU 爆滿,帶寬也會(huì)跑滿,所以作為成熟的服務(wù)器代理軟件,需要可以對(duì)這些情況進(jìn)行控制。

Nginx 控制并發(fā)的方法有兩種,一種是通過 IP 或者其他參數(shù)控制其并發(fā)量;另外一種是控制單位時(shí)間內(nèi)總的請(qǐng)求處理量。即對(duì)并發(fā)和并行的控制,這兩個(gè)功能分別由 ngx_http_limit_conn_module 和 ngx_http_limit_req_module 模塊負(fù)責(zé)實(shí)現(xiàn)。

ngx_http_limit_conn_module 模塊

說明

該模塊主要用于對(duì)請(qǐng)求并發(fā)量進(jìn)行控制。

參數(shù)配置

●?limit_conn_zone

指令配置 limit_conn_zone key zone=name:size

配置的上下文:http

說明:key 是 Nginx 中的變量,通常為 $binary_remote_addr | $server_name;name 為共享內(nèi)存的名稱,size 為該共享內(nèi)存的大??;此配置會(huì)申請(qǐng)一塊共享內(nèi)存空間 name,并且保存 key 的訪問情況

●?limit_conn_log_level

語(yǔ)法:limit_conn_log_level info|notice|warn|error

默認(rèn)值:error

配置上下文:http,server,location

說明:當(dāng)訪問達(dá)到最大限制之后,會(huì)將訪問情況記錄在日志中

●?limit_conn

語(yǔ)法:limit_conn zone_name number

配置上下文:http,server,location

說明:使用 zone_name 進(jìn)行訪問并發(fā)控制,當(dāng)超過 number 時(shí)返回對(duì)應(yīng)的錯(cuò)誤碼

●?limit_conn_status

語(yǔ)法:limit_conn_status code

默認(rèn)值:503

配置上下文:http,server,location

說明:當(dāng)訪問超過限制 number 時(shí),給客戶端返回的錯(cuò)誤碼,此錯(cuò)誤碼可以配合 error_page 等參數(shù),在訪問超量時(shí)給客戶返回友好的錯(cuò)誤頁(yè)面

●?limit_rate

語(yǔ)法:limit_rate rate

默認(rèn)值:0

配置上下文:http,server,location

說明:對(duì)每個(gè)鏈接的速率進(jìn)行限制,rate 表示每秒的下載速度;

●?limit_rate_after

語(yǔ)法:limit_rate_after size

配置上下文:http,server,location

說明:此命令和 limit_rate 配合,當(dāng)流量超過 size 之后,limit_rate 才開始生效

簡(jiǎn)單配置示例

limit_conn_zone?$binary_remote_addr?zone=addr:10m; server?{ ????listen???????80; ????server_name??www.domain.com; ????root???/path/; ????index??index.html?index.htm; ????location?/ip?{ ??????limit_conn_status?503;?#?超限制后返回的狀態(tài)碼; ??????limit_conn_log_level?warn;?#?日志記錄級(jí)別 ??????limit_rate?50;?#?帶寬限制 ??????limit_conn?addr?1;?#?控制并發(fā)訪問 ????} ????#?當(dāng)超過并發(fā)訪問限制時(shí),返回503錯(cuò)誤頁(yè)面 ????error_page?503??/503.html; }

ngx_http_limit_req_module 模塊

說明

該模塊主要控制單位時(shí)間內(nèi)的請(qǐng)求數(shù)。使用 “l(fā)eaky bucket” (漏斗) 算法進(jìn)行過濾,在設(shè)置好限制 rate 之后,當(dāng)單位時(shí)間內(nèi)請(qǐng)求數(shù)超過 rate 時(shí),模塊會(huì)檢測(cè) burst 值,如果值為 0,則請(qǐng)求會(huì)依據(jù) delay|nodelay 配置返回錯(cuò)誤或者進(jìn)行等待;如果 burst 大于 0 時(shí),當(dāng)請(qǐng)求數(shù)大于 rate 但小于 burst 時(shí),請(qǐng)求進(jìn)入等待隊(duì)列進(jìn)行處理。

參數(shù)配置

●?limit_req_zone

語(yǔ)法:limit_req_zone key zone=name:size rate=rate

配置上下文:http

說明:key 是 Nginx 中的變量,通常為 $binary_remote_addr | $server_name;name 為共享內(nèi)存的名稱,size 為該共享內(nèi)存的大?。籸ate 為訪問頻率,單位為 r/s 、r/m 。此配置會(huì)申請(qǐng)一塊共享內(nèi)存空間 name,并且保存 $key 的訪問情況;

● limit_req

語(yǔ)法: limit_rate zone=name [burst=number] [nodelay|delay=number]

配置上下文:http,server,location

說明:開啟限制,burst 設(shè)置最多容量,nodelay 決定當(dāng)請(qǐng)求超量是,是等待處理還是返回錯(cuò)誤碼;

limit_req_log_level 和 limit_req_status 配置參數(shù)左右與 ngx_http_limit_conn_module 模塊一致;

簡(jiǎn)單配置示例

limit_req_zone?$binary_remote_addr?zone=req:10m?rate=2r/m; server?{ ????listen???????80; ????server_name??www.domain.com; ????root???/path/; ????index??index.html?index.htm; ????location?/limit?{ ??????limit_req?zone=req?burst=3?nodelay; ????} ????#?當(dāng)超過并發(fā)訪問限制時(shí),返回503錯(cuò)誤頁(yè)面 ????error_page?503??/503.html; }

注意

這兩種訪問控制都需要申請(qǐng)內(nèi)存空間,既然有內(nèi)存空間,當(dāng)然會(huì)存在內(nèi)存耗盡的情況,這時(shí)新的請(qǐng)求都會(huì)被返回錯(cuò)誤,所以當(dāng)開啟訪問量限制時(shí),需要通過監(jiān)控防止此類情況發(fā)生。

小結(jié)

通過對(duì) Nginx 模塊化架構(gòu)的簡(jiǎn)單介紹,重點(diǎn)了解 ngx_http_limit_conn_module 和 ngx_http_limit_req_module 模塊的功能和配置參數(shù),實(shí)現(xiàn) Nginx 對(duì)請(qǐng)求的并發(fā)控制。如有不對(duì),還請(qǐng)指教

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊13 分享