nginx 限速之limit_conn的使用
在工作中經(jīng)常會遇到用戶大量請求某個接口和一些大流量的惡意攻擊,可以通過nginx對同一個ip的連接數(shù),請求,進行限制.
通過nginx我們有三種限速方式分別是: 限制請求數(shù)(request),限制連接數(shù)(connection),限制響應(yīng)速度(rate),分別對應(yīng)nginx的limit_req,limit_conn和limit_rate三個模塊,limit_conn和limit_req模塊類似,有許多指令組成一個大的模塊,兩個模塊之間很多指令的命名方式和用法大同小異.
ngx_http_limit_conn_module 模塊主要是用于根據(jù)特定的key來限制連接的數(shù)量,如根據(jù)ip地址來限制連接數(shù).需注意的是并不是所有的連接都會被算入其中,只有當(dāng)一個連接的整個請求頭被讀取并且已經(jīng)被nginx服務(wù)器處理的時候才會被算入限制中.
1. ngx_http_limit_conn_module模塊
1. limit_conn_zone 指令
#語法配置 Syntax: limit_conn_zone key zone=name:size; Defaule: - Context: http #作用域 limit_conn_zone $binary_remote_addr zone=${name}:10m #示例
說明:
- limit_conn_zone: 只能夠在http塊用使用
- key: 可以設(shè)置為$variable使用Nginx內(nèi)置變量作為鍵(一般經(jīng)常使用客戶端ip地址作為鍵:$remote_addr變量的長度為7字節(jié)到15字節(jié),而存儲狀態(tài)在32位平臺中占用32字節(jié)或64字節(jié),在64位平臺中占用64字節(jié)。)$binary_remote_addr變量的長度是固定的4字節(jié),存儲狀態(tài)在32位平臺中占用32字節(jié)或64字節(jié),在64位平臺中占用64字節(jié)。1M共享空間可以保存3.2萬個32位的狀態(tài),1.6萬個64位的狀態(tài))。zone=name定義區(qū)域名稱(名稱隨意起,在limit_conn配置項中調(diào)用時對應(yīng)就好),size定義各個鍵共享內(nèi)存空間大小。如果共享內(nèi)存空間被耗盡,服務(wù)器將會對后續(xù)所有的請求返回 503 (Service Temporarily Unavailable) 錯誤。
- name: 就是這個zone的命名,name需要全局唯一,limit_conn 命令根據(jù)name來查找對應(yīng)zone進行相應(yīng)限制規(guī)則的匹配.
- size: 定義這個zone的大小,也就是nginx會在內(nèi)存中開辟多大的空間來存儲這個zone的相應(yīng)信息,主要和前面定義的key的大小有關(guān)系,需要注意的是當(dāng)內(nèi)存帶下耗盡的時候,nginx會直接返回錯誤碼limit_conn_status給后續(xù)的請求(If the zone storage is exhausted, the server will return the error to all further requests.)
2. limit_conn指令
Syntax: limit_conn zone number; #語法 Default: Context: http,server,location #作用域
說明:
- limit_conn: 使用由limit_conn_zone定義的攔截規(guī)則,并設(shè)置具體的限制連接數(shù)量,當(dāng)超過這個數(shù)字時返回503(server)的錯誤.定義的存儲區(qū)域key對應(yīng)的總的網(wǎng)絡(luò)連接數(shù)進行限流??梢园凑誌P來限制IP維度的總連接數(shù),或者按照服務(wù)域名來限制某個域名的總的連接數(shù)(只有那些被nginx處理的且已經(jīng)讀取了整個請求頭的請求連接才會被計數(shù)器統(tǒng)計,在http,server,location三個塊中使用,但是要搭配limit_conn_zone使用
- zone: 是在limit_conn_zone中的name變量,對應(yīng)這全局唯一的zone,負責(zé)確定限制連接數(shù)的依據(jù)
- number: 限制的連接數(shù),zone和number組合就可以完成連接數(shù)的限定功能,注意number必須是數(shù)字而不能使用變量.
示例:
limit_conn_zone $binary_remote_addr zone=addr:10m; ? server { location /download/ { limit_conn addr 1; }
3. limit_conn_log_level指令
Syntax: limit_conn_log_level info|notice|warn|error #語法 Default: limit_conn_log_level error; #默認 Context: http, server, location #作用域
功能: 當(dāng)達到最大限制規(guī)則的連接數(shù)后,記錄日志的等級。會輸出到error.log中而不是access.log,調(diào)成info的話會有較多的日志輸出,需要額外注意硬盤容量等相關(guān)問題。
4.limit_conn_status指令
Syntax: limit_conn_status code Context: http, server, location Default: limit_conn_status 503
功能:當(dāng)超過限制規(guī)則后,返回的響應(yīng)狀態(tài)碼,默認是503,如果是一些有特殊需求的場景,可以手動調(diào)整為403之類的狀態(tài)碼,需要注意的是并不是所有的狀態(tài)碼都可以使用,nginx官方限定狀態(tài)碼必須在400到599之間。
5.limit_conn_dry_run指令
Syntax: limit_conn_dry_run on | off; Default: limit_conn_dry_run off; Context: http, server, location This directive appeared in version 1.17.6.
功能: dry_run模式的意義在于試運行而不對線上業(yè)務(wù)造成影響。設(shè)置為on之后,前面的limit_conn指令
并不會真正生效,但是limit_conn_zone指令
會生效,nginx會在內(nèi)存中存儲計算相關(guān)的數(shù)據(jù).
到此這篇關(guān)于nginx 限速之limit_conn的使用的文章就介紹到這了,更多相關(guān)nginx limit_conn內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于nginx獲取代理服務(wù)ip以及客戶端真實ip詳解
最近在研究nginx中如何獲取真實客戶端IP的方法,下面這篇文章主要給大家介紹了基于nginx獲取代理服務(wù)ip以及客戶端真實ip的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2022-07-07Ubuntu環(huán)境下安裝部署Nginx詳細步驟(有網(wǎng))
Nginx是一個開源的?HTTP?網(wǎng)絡(luò)服務(wù)器,下面這篇文章主要給大家介紹了關(guān)于Ubuntu環(huán)境下安裝部署Nginx(有網(wǎng))的相關(guān)資料,文中通過圖文介紹的非常詳細,需要的朋友可以參考下2024-01-01nginx http響應(yīng)限速的具體實現(xiàn)
本文主要介紹了nginx http響應(yīng)限速的具體實現(xiàn),可以使用limite_rate和limit_rate_after來限制HTTP響應(yīng)的速度,具有一定的參考價值,感興趣的可以了解一下2024-05-05nginx+tomcat實現(xiàn)Windows系統(tǒng)下的負載均衡搭建教程
下面小編就為大家分享一篇nginx+tomcat實現(xiàn)Windows系統(tǒng)下的負載均衡搭建教程,具有很好的參考價值,希望對大家有所幫助2017-12-12Linux中Nginx的防盜鏈和優(yōu)化的實現(xiàn)代碼
今天是周末小編在值班哈,很開森,工作使我快樂,本文重點給大家介紹Linux中Nginx的防盜鏈和優(yōu)化問題及實現(xiàn)代碼,需要的朋友跟隨小編一起看看吧2021-06-06