詳解Nginx 對訪問量的控制
目的
了解 Nginx 的 ngx_http_limit_conn_module 和 ngx_http_limit_req_module 模塊,對請求訪問量進(jìn)行控制。
Nginx 模塊化
nginx 的內(nèi)部結(jié)構(gòu)是由核心模塊和一系列的功能模塊所組成。模塊化架構(gòu)使得每個模塊的功能相對簡單,實現(xiàn)高內(nèi)聚,同時也便于對 Nginx 進(jìn)行功能擴展。
針對 web 請求,Nginx 所有開啟的模塊會組成一條鏈,類似于闖關(guān)游戲中的一道道關(guān)卡,每個模塊負(fù)責(zé)特定的功能,例如實現(xiàn)壓縮的 ngx_http_gzip_module 模塊,實現(xiàn)驗證的 ngx_http_auth_basic_module 模塊和實現(xiàn)代理的 ngx_http_proxy_module 模塊等。連接到服務(wù)器的請求,會依次經(jīng)過Nginx各個模塊的處理,只有通過這些模塊處理之后的請求才會真正的傳遞給后臺程序代碼進(jìn)行處理。
Nginx 并發(fā)訪問控制
對于 web 服務(wù)器而言,當(dāng)遇到網(wǎng)絡(luò)爬蟲,或者惡意大流量攻擊訪問時,會造成服務(wù)器內(nèi)存和 CPU 爆滿,帶寬也會跑滿,所以作為成熟的服務(wù)器代理軟件,需要可以對這些情況進(jìn)行控制。
Nginx 控制并發(fā)的方法有兩種,一種是通過IP或者其他參數(shù)控制其并發(fā)量;另外一種是控制單位時間內(nèi)總的請求處理量。即對并發(fā)和并行的控制,這兩個功能分別由 ngx_http_limit_conn_module 和 ngx_http_limit_req_module 模塊負(fù)責(zé)實現(xiàn)。
ngx_http_limit_conn_module 模塊
說明
該模塊主要用于對請求并發(fā)量進(jìn)行控制。
參數(shù)配置
limit_conn_zone
指令配置 limit_conn_zone key zone=name:size
配置的上下文:http
說明:key 是 Nginx 中的變量,通常為 binaryremoteaddr|server_name;name 為共享內(nèi)存的名稱,size 為該共享內(nèi)存的大小;此配置會申請一塊共享內(nèi)存空間 name,并且保存 key 的訪問情況
limit_conn_log_level
語法:limit_conn_log_level info|notice|warn|error
默認(rèn)值:error
配置上下文:http,server,location
說明:當(dāng)訪問達(dá)到最大限制之后,會將訪問情況記錄在日志中
limit_conn
語法:limit_conn zone_name number
配置上下文:http,server,location
說明:使用 zone_name 進(jìn)行訪問并發(fā)控制,當(dāng)超過 number 時返回對應(yīng)的錯誤碼
limit_conn_status
語法:limit_conn_status code
默認(rèn)值:503
配置上下文:http,server,location
說明:當(dāng)訪問超過限制 number 時,給客戶端返回的錯誤碼,此錯誤碼可以配合 error_page 等參數(shù),在訪問超量時給客戶返回友好的錯誤頁面
limit_rate
語法:limit_rate rate
默認(rèn)值:0
配置上下文:http,server,location
說明:對每個鏈接的速率進(jìn)行限制,rate 表示每秒的下載速度;
limit_rate_after
語法:limit_rate_after size
配置上下文:http,server,location
說明:此命令和 limit_rate 配合,當(dāng)流量超過 size 之后,limit_rate 才開始生效
簡單配置示例
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; # 日志記錄級別 limit_rate 50; # 帶寬限制 limit_conn addr 1; # 控制并發(fā)訪問 } # 當(dāng)超過并發(fā)訪問限制時,返回503錯誤頁面 error_page 503 /503.html; }
ngx_http_limit_req_module 模塊
說明
該模塊主要控制單位時間內(nèi)的請求數(shù)。使用 “l(fā)eaky bucket” (漏斗)算法進(jìn)行過濾,在設(shè)置好限制 rate 之后,當(dāng)單位時間內(nèi)請求數(shù)超過 rate 時,模塊會檢測 burst 值,如果值為0,則請求會依據(jù) delay|nodelay 配置返回錯誤或者進(jìn)行等待;如果 burst 大于0時,當(dāng)請求數(shù)大于 rate 但小于 burst 時,請求進(jìn)入等待隊列進(jìn)行處理。
參數(shù)配置
limit_req_zone
語法:limit_req_zone key zone=name:size rate=rate
配置上下文:http
說明:key 是 Nginx 中的變量,通常為 binaryremoteaddr|server_name;name 為共享內(nèi)存的名稱,size 為該共享內(nèi)存的大?。籸ate 為訪問頻率,單位為 r/s 、r/m 。此配置會申請一塊共享內(nèi)存空間 name,并且保存 $key 的訪問情況;
limit_req
語法: limit_rate zone=name [burst=number] [nodelay|delay=number]
配置上下文:http,server,location
說明:開啟限制,burst設(shè)置最多容量,nodelay決定當(dāng)請求超量是,是等待處理還是返回錯誤碼;
limit_req_log_level 和 limit_req_status 配置參數(shù)左右與ngx_http_limit_conn_module模塊一致;
簡單配置示例
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ā)訪問限制時,返回503錯誤頁面 error_page 503 /503.html; }
注意
這兩種訪問控制都需要申請內(nèi)存空間,既然有內(nèi)存空間,當(dāng)然會存在內(nèi)存耗盡的情況,這時新的請求都會被返回錯誤,所以當(dāng)開啟訪問量限制時,需要通過監(jiān)控防止此類情況發(fā)生。
小結(jié)
通過對 Nginx 模塊化架構(gòu)的簡單介紹,重點了解 ngx_http_limit_conn_module 和 ngx_http_limit_req_module 模塊的功能和配置參數(shù),實現(xiàn) Nginx 對請求的并發(fā)控制。如有不對,還請指教
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Nginx 實現(xiàn)灰度發(fā)布的三種方法總結(jié)
- 詳解Asp.Net Core 發(fā)布和部署( MacOS + Linux + Nginx )
- 淺析nginx剛剛發(fā)布的JavaScript能力nginScript
- 使用nginx設(shè)置代理服務(wù)器
- Docker容器化部署嘗試——多容器通信(node+mongoDB+nginx)
- Nginx之proxy_redirect使用詳解
- nginx安裝到指定目錄的方法示例
- Linux系統(tǒng)下Nginx支持ipv6配置的方法
- 詳解基于Vue,Nginx的前后端不分離部署教程
- 使用nginx模擬進(jìn)行金絲雀發(fā)布的方式
相關(guān)文章
Nginx?403?forbidden錯誤的原因以及解決方法
yum安裝nginx,安裝一切正常,但是訪問時報403 forbidden,下面這篇文章主要給大家介紹了關(guān)于Nginx?403?forbidden錯誤的原因以及解決方法,需要的朋友可以參考下2022-08-08nginx快速部署一個網(wǎng)站服務(wù)(多域名+多端口)
本文主要介紹了nginx快速部署一個網(wǎng)站服務(wù),并實現(xiàn)多域名和多端口,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-10-10使用referer指令配置Nginx服務(wù)器來防止圖片盜鏈
這篇文章主要介紹了使用referer指令配置Nginx服務(wù)器來防止圖片盜鏈的方法,文中也簡單介紹了referer指令的一些語法和常用參數(shù),需要的朋友可以參考下2015-12-12nginx rewrite 偽靜態(tài)配置參數(shù)詳細(xì)說明
nginx rewrite 偽靜態(tài)配置參數(shù)和使用例子 附正則使用說明2010-05-05nginx?添加http_stub_status_module模塊
本文主要介紹了nginx?添加http_stub_status_module模塊,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05