日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Nginx >内容正文

Nginx

Nginx流量限制

發布時間:2023/12/20 Nginx 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Nginx流量限制 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Nginx流量限制可以有效防止DDOS攻擊,降低服務器負載,緩解硬件和網絡壓力,功能依賴于limit_req模塊,這個模塊現版本都是默認集成的,所以不用單獨編譯安裝。

轉載資料:

關于limit_req和limit_conn的區別:https://www.cnblogs.com/zhoulujun/p/12183179.html

Nginx限制訪問速率和最大并發連接數模塊說明:https://www.cnblogs.com/wjoyxt/p/6128183.html

Nginx下limit_req模塊burst參數超詳細解析:https://blog.csdn.net/hellow__world/article/details/78658041

關于limit_req和limit_conn的區別
what is the difference between connection and request?

Nginx限流配置–limit_req和limit_conn (防范DDOS攻擊)
https://www.cnblogs.com/andrew-303/p/12272099.html

connection是連接,即常說的tcp連接,通過三次握手而建立的一個完整狀態機。建立一個連接,必須得要三次握手。
request是指請求,即http請求,tcp連接是有狀態的,而構建在tcp之上的http卻是無狀態的協議
通過打開一個網頁,然后通過wareshark可以看到,一個連接建立后(即三次握手后),在這個連接斷開之前(即四次揮手之前),會有很多的http request,這就是他們的區別:即一個連接的生命周期中,會存在一個或者多個請求,這是為了加快效率,避免每次請求都要三次握手建立連接,現在的HTTP/1.1協議都支持這種特性,叫做keepalive。

limit_conn_zone $binanry_remote_addr zone=conn_zone:1m;limit_conn conn_zone 1;

這樣的配配置,表明以ip為key,來限制每個ip訪問lmit.html文件時候,最多只能有一個在線,否則其余的都要返回不可用。

這種情況就是一個靜止狀態的計數可以實現,而無關乎多長時間。

舉個例子,如果你的這個連接一直不釋放,即使你通過這一個連接發送出再多的request請求,只要我能夠應付,那么我就幫你處理。

但是,如果你只需要處理2個請求,但是這兩個請求是分別用兩個連接同時發送過來的,那么,我就只能處理其中一個,另外一個就不行。這就是他的區別。

limit_req_zone $binary_remtoe_addr zone=req_zone:1m rate=1r/s; #這里需要為共享內存配置一個速率rate,limit_conn zone=req_zone;

表明:對于每個ip來說,處理請求的速度不超過每秒1個請求。

可以看到這是個速度量(而上面的那個是數字量,速度和個數還是有直觀的區別的吧。。)

是同時發送出100個請求(不管是通過100個連接還是1個連接),只要你請求到底的速度超過每秒1個,那么我就會拒絕你。

對于與 burst,推薦閱讀:Nginx下limit_req模塊burst參數超詳細解析 https://blog.csdn.net/hellow__world/article/details/78658041

這里把其總結摘錄如下:

limit_req zone=req_zone;
嚴格依照在limti_req_zone中配置的rate來處理請求
超過rate處理能力范圍的,直接drop
表現為對收到的請求無延時

limit_req zone=req_zone burst=5;
依照在limti_req_zone中配置的rate來處理請求
同時設置了一個大小為5的緩沖隊列,在緩沖隊列中的請求會等待慢慢處理
超過了burst緩沖隊列長度和rate處理能力的請求被直接丟棄
表現為對收到的請求有延時

limit_req zone=req_zone burst=5 nodelay;
依照在limti_req_zone中配置的rate來處理請求
同時設置了一個大小為5的緩沖隊列,當請求到來時,會爆發出一個峰值處理能力,對于峰值處理數量之外的請求,直接丟棄
在完成峰值請求之后,緩沖隊列不能再放入請求。如果rate=10r/m,且這段時間內沒有請求再到來,則每6 s 緩沖隊列就能回復一個緩沖請求的能力,直到回復到能緩沖5個請求位置。

小伙伴對這個zone估計還是有一些疑問,有疑問可以在下面評論,大家一起討論,比如,有人可能會問,一個客服端占用5個,那么327680只能容納65536個客服端,那么第65537個客服端就會返回503錯誤

limit_conn_zone
語法:

Syntax: limit_conn_zone key zone=name:size;
Default: —
Context: http
看上面的語法,limit_conn_zone只能用在http段,例如:

http { limit_conn_zone $binary_remote_addr zone=addr:10m; server { listen 80; server_name www.tomener.com tomener.com; location / { root /var/www/tomener; index index.php index.html index.htm; limit_conn addr 5; #是限制每個IP只能發起5個連接 limit_rate 100k; #限速為 100KB/秒 } } }

對于關系:
key => $binary_remote_addr #二進制的IP地址
name => addr #隨便取的一個名字,比如,你可以取成abc
size => 10m #空間大小,這里是10兆
一個二進制的ip地址在32位機器上占用32個字節,在64位機器上占用63個字節,那么10M可以存放多少呢,計算一下,10x1024x1024/32 = 327680,意思就是可以存放326780個ip地址(32位),64位可以存放163840個ip

1、key:鍵,可以說是一個規則,就是對客戶端連接的一個標識,比如上面用的是IP地址,比如我們可以用$query_string,例如:/index.php?mp=138944093953,那我們就可以根據mp的值來限制連接數,更多的nginx內置變量請查看http://nginx.org/en/docs/varindex.html

2、zone:共享內存空間,作用:保存每個key對應的連接數

3、size:共享內存空間大小,如1M、10M、100K
當共享內存空間被耗盡,服務器將會對后續所有的請求返回 503 (Service Temporarily Unavailable) 錯誤

limit_conn_log_level指令
Syntax: limit_conn_log_level info | notice | warn | error;
Default: limit_conn_log_level error;
Context: http, server, location
說明:當達到最大限制連接數后,記錄日志的等級。

limit_conn_status指令
Syntax: limit_conn_status code;
Default: limit_conn_status 503;
Context: http, server, location
說明:當超過限制后,返回的響應狀態碼,默認是503,現在你就知道上面為什么會返回503(Service Temporarily Unavailable)服務暫時不可用

例子:

1、同時限制ip和虛擬主機最大并發連接

http { limit_conn_zone binaryremoteaddrzone=perip:10m;limitconnzonebinaryremoteaddrzone=perip:10m;limitconnzoneserver_name zone=perserver:10m; server { location / { limit_conn perip 10; limit_conn perserver 1000; } } }

最后放一個在公司遇到的需求,有個項目是請求服務器上的一個服務接口,但是程序請求的太頻繁了,導致服務這邊請求過快,被第三方偵測為惡意爬取而導致了封號。按說應該修改一下程序,降低請求速率,但是恰巧開發程序的人聯系不到了,那只能下策,修改咱們Nginx代理的接口這邊的流量限制,從而達到降低請求頻率的目的。

Nginx修改的位置只有兩處
主配置文件:

vim nginx.conf http {include mime.types;default_type application/octet-stream;limit_req_zone $binary_remote_addr zone=one:10m rate=2r/m;

虛擬服務器的配置文件:

location /xxx {limit_req zone=one burst=30 nodelay;proxy_pass http://127.0.0.1:8090;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}

做好后寫個驗證腳本

/bin/bash while : do echo 開始執行調用 curl -s -w '%{http_code}' "http://xxx.xxx.cn/xxx/xxx echo 睡眠10秒后再次請求 sleep 10 done

跑一下,因為咱們設定的是30秒接受一次請求,緩存池是5次,也就是說跑這個腳本時是跑到第7次時出現503返回值,然后每兩次503一次200的頻率,就驗證成功了

總結

以上是生活随笔為你收集整理的Nginx流量限制的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。