秒殺、搶購併發限制、隊列緩衝php
下載帶寬限制html
防止攻擊nginx
說明:nginx有不少模塊、模塊下面又分不少指令,下面就說說limit_conn_zone和limit_conn兩指令
語法:服務器
Syntax: limit_conn_zone key zone=name:size; Default: — Context: http
nginx配置分爲三個段:http、server、location,大概格式以下:併發
http { server { listen 80; server_name www.tomener.com tomener.com; location / { root /var/www/tomener; index index.php index.html index.htm; set $limit_key $binary_remote_addr; set $limit_number 10; } } }
nginx配置中能夠設置變量,例如上面的$limit_key和$limit_number連個變量,後面是變量的值,好了這些都是對不太瞭解nginx配置的朋友的一些說明、具體能夠搜索一下。.net
看上面的語法,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/秒 } } }
分析:
Syntax: limit_conn_zone key zone=name:size;code
對於關係:
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個ipserver
一、key:鍵,能夠說是一個規則,就是對客服端鏈接的一個標識,好比上面用的是IP地址,好比咱們能夠用$query_string,例如:/index.php?mp=138944093953,那咱們就能夠根據mp的值來限制鏈接數,更多的nginx內置變量請查看http://nginx.org/en/docs/varindex.html 二、zone:共享內存空間,做用:保存每一個key對應的鏈接數 三、size:共享內存空間大小,如1M、10M、100K
當共享內存空間被耗盡,服務器將會對後續全部的請求返回 503 (Service Temporarily Unavailable) 錯誤htm
Syntax: limit_conn zone number; Default: — Context: http, server, location
限制每一個name對應客服端的鏈接數,好比上面的limit_conn addr 5;意思就是如今addr這個name對應的客服端的鏈接數,好比name對應的是45.168.68.202這個ip地址,那麼這個ip最多有5個併發鏈接,那什麼併發呢?像這樣的鏈接,請求到達並已經讀取了請求頭信息到響應頭信息發送完畢,在這個過程當中的鏈接,當一個客服端的併發鏈接達到咱們設置的5個以上時,會返回503 (Service Temporarily Unavailable) 錯誤
這裏,小夥伴對這個zone估計仍是有一些疑問,有疑問能夠在下面評論,你們一塊兒討論,好比,有人可能會問,一個客服端佔用5個,那麼327680只能容納65536個客服端,那麼第65537個客服端就會返回503錯誤
Syntax: limit_conn_log_level info | notice | warn | error; Default: limit_conn_log_level error; Context: http, server, location
說明:當達到最大限制鏈接數後,記錄日誌的等級。
Syntax: limit_conn_status code; Default: limit_conn_status 503; Context: http, server, location
說明:當超過限制後,返回的響應狀態碼,默認是503,如今你就知道上面爲何會返回503(Service Temporarily Unavailable)服務暫時不可用
例子:
一、同時限制ip和虛擬主機最大併發鏈接
http { limit_conn_zone $binary_remote_addr zone=perip:10m; limit_conn_zone $server_name zone=perserver:10m; server { location / { limit_conn perip 10; limit_conn perserver 1000; } } }
二、根據請求參數來限制
#請求:http://www.tomener.com/item.html?mp=1967464354&id=43566929485 limit_conn_zone $mp_limit_key zone=mp:10m; server { set $mp_limit_key $binary_remote_addr; #key設置默認值 if ( $query_string ~ .*mp=(\d+).* ) { set $mp_limit_key $1; } location / { limit_conn mp 10; } }
Syntax: limit_req_zone key zone=name:size rate=rate; Default: — Context: http
ngx_http_limit_req_module模塊的使用和ngx_http_limit_conn_module模塊差很少,這裏暫時不在講述,可查看官方文檔:
http://nginx.org/en/docs/http/ngx_http_limit_req_module.html
參考文檔:
https://www.ttlsa.com/nginx/nginx-limited-connection-number-ngx_http_limit_conn_module-module/
https://www.ttlsa.com/nginx/nginx-limiting-the-number-of-requests-ngx_http_limit_req_module-module/