nginx控制連接數(shù)及訪問速率的實現(xiàn)
連接數(shù)控制
ngx_http_limit_conn_module 模塊用來限制每個定義的key對應的連接數(shù)。
不是所有的連接都會被計數(shù),當一個連接請求被服務端處理并且這個請求頭被讀取時候,這個連接被算作一個連接。
limit_conn_zone key zone=name:size;
limit_conn_zone 用來定義在 http 塊中定義一個共享內(nèi)存區(qū)域,存儲客戶端的連接數(shù)。key用來區(qū)分不同的客戶端連接。name用來指定區(qū)域的名稱,size指定內(nèi)存大小。key可以是文本或變量,如果一個請求的key是空不會進行請求計數(shù)。這里實際就是維護了一個內(nèi)存map區(qū)域(key,count)。
如下:
limit_conn_zone $binary_remote_addr zone=addr:10m;
開辟一個10m的內(nèi)存區(qū)域,名稱為addr,key為b i n a r y r e m o t e a d d r 。 binary_remote_addr。binaryr?emotea?ddr。binary_remote_addr表示按客戶端 IP 地址進行計數(shù)。zone定義完成后主要是為了limit_conn 指令限連接數(shù)使用。
limit_conn zone number;
limit_conn指令用于限制同一客戶端的最大連接數(shù)。要與 limit_conn_zone 配合使用。這里的zone就是引用的limit_conn_zone 定義的區(qū)域名稱,number是限制最大連接數(shù)。當超過最大連接數(shù)時,會返回特定的錯誤。默認是503.可以通過limit_conn_status code; 來指定特定的錯誤碼。
limit_conn_zone $binary_remote_addr zone=addr:10m; limit_conn_status 429; server { location /download/ { limit_conn addr 2; }
上面表示開辟一個10M的內(nèi)存區(qū)域名為addr,用來統(tǒng)計每個客戶端IP($binary_remote_addr)的請求數(shù)量,限制每個IP最多只能有2個并發(fā)連接。如果超過并發(fā)數(shù),則返回429錯誤。
limit_conn指令可以重復出現(xiàn)
limit_conn_zone $binary_remote_addr zone=perip:10m; limit_conn_zone $server_name zone=perserver:10m; server { ... limit_conn perip 5; limit_conn perserver 100; }
如上表示限制每個客戶端最大并發(fā)數(shù)是5,一個server同時最大支持連接是100.
https://nginx.org/en/docs/http/ngx_http_limit_conn_module.html
請求速率控制
處理限制客戶端連接數(shù)外,還可以通過ngx_http_limit_req_module模塊來限制客戶端的請求速率。指令和限制連接數(shù)差不多。
limit_req_zone key zone=name:size rate=rate ;
limit_req_zone 指令用來定義請求速率限制內(nèi)存區(qū)域,key同limit_zone指令,用來標識計算速率的key值,name是內(nèi)存區(qū)域名稱,size是內(nèi)存大小,rate是速率,單位 每秒是(r/s),沒分鐘是 (r/m)。該指令只能在http塊使用。
limit_req_zone $binary_remote_addr zone=limitbyaddr:10m rate=3r/s;
上面配置表示使用客戶端IP為key,統(tǒng)計客戶端請求速率,內(nèi)存大小為10m。1M的內(nèi)存大約可存儲16000個IP的統(tǒng)計信息,所以10M大概可以統(tǒng)計16萬個IP。 內(nèi)存區(qū)域名稱為limitbyaddr,控制客戶端請求速率為每秒3個請求。
limit_req指令限制速率
limit_req zone=name [burst=number] [nodelay | delay=number];
limit_req用來設置請求速率,zone指定使用的limit_req_zone 設定的區(qū)域名稱。這樣nginx會安裝zone指定的速率來控制客戶端請求。對應超過給定速率的請求,nginx 會進行拒絕處理。防止過多的請求對服務器造成壓力。
如果zone的內(nèi)存耗盡后,nginx會移除最早的key。如果此時空間還不夠存儲新的請求記錄,則nginx或返回503錯誤。
然而對應一個網(wǎng)站或應用來說,訪問流量起始不是平順的,存在波動,如果波動超過速率就進行拒絕其實這也不是我們想要的,影響應用整體穩(wěn)定性。這個時候可以使用burst參數(shù)來處理突發(fā)流量。burst 參數(shù)允許請求數(shù)量短時間內(nèi)超過正常的速率限制,最多可達到指定的 burst 值。
配合burst使用還有一個 delay和nodelay參數(shù)。nodelay 表示在處理突發(fā)請求時,不會延遲這些突發(fā)請求的處理。如果沒有這個參數(shù),突發(fā)的請求會被排隊并延遲,直到可以按照速率限制處理為止。
limit_req_zone $binary_remote_addr zone=limitbyaddr:10m rate=3r/s; server { location / { limit_req zone=limitbyaddr burst=12 delay=9; } }
上面配置正常每秒鐘限制3個請求 ,允許最大峰值波動請求是12個,第9個超過速率的請求會放入隊列延遲處理。
超過限制速率被拒絕的請求,也可以自動義狀態(tài)碼,通過limit_req_status 指令設置。
到此這篇關于nginx控制連接數(shù)及訪問速率的實現(xiàn)的文章就介紹到這了,更多相關nginx控制連接數(shù)及訪問速率內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
linux安裝nginx和前端部署vue項目全過程(實測react項目也可)
這篇文章主要介紹了如何將前端項目打包并部署到服務器上,包括使用nginx進行配置和啟動等步驟,文中通過代碼以及圖文介紹的非常詳細,需要的朋友可以參考下2024-11-11Linux系統(tǒng)下nginx日志每天定時切割的腳本寫法
本篇文章給大家分享使用Linux系統(tǒng)自帶的命令logrotate對Nginx日志進行切割的方法,對nginx日志切割腳本感興趣的朋友一起學習吧2016-11-11nginx中狀態(tài)統(tǒng)計的實現(xiàn)
本文主要介紹了nginx中狀態(tài)統(tǒng)計的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-04-04Ubuntu+Nginx+Mysql+Php+Zend+eaccelerator安裝配置文字版
把我架設lnmp網(wǎng)站的過程寫出來,希望對想架設網(wǎng)站的朋友有所幫助,如有更好的辦法請?zhí)岢鰜?/div> 2012-02-02瀏覽器控制臺報錯Failed to load module script:解決方
這篇文章主要為大家介紹了瀏覽器控制臺報錯Failed to load module script:解決方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-11-11最新評論