Nginx限制並發連接和並發請求數配置
by:授客 QQ:1033553122
測試環境
nginx-1.10.0
配置介紹
查看是否內置模塊
# pwd
/mnt/nginx-1.10.0
# ./configure --help | grep http_limit_
--without-http_limit_conn_module disable ngx_http_limit_conn_module
--without-http_limit_req_module disable ngx_http_limit_req_module
如上可見,ngx_http_limit_req_module和http_limit_req_module都是nginx內置模塊。
ngx_http_limit_req_module模塊用於限制每個預定義鍵的請求處理速率
例.
http {
limit_req_zone $binary_remote_addr zone=one:10m rate=2r/s;
...
server {
...
location /search/ {
limit_req zone=one burst=5;
}
指令:
語法:limit_req_zone key zone=name:size rate=rate;
Context:http
說明:
key 要限制請求處理速度的鍵,可以是文本,變量,或者兩者的混合體(1.7.6版本之前只能是變量)。未攜帶指定key的請求不被統計在內。
name:size 分別設置共享內存的名稱和大小,用於保存各種key的狀態 - 通常為當前超過限定數量的請求數。
rate 平均請求處理速率,單位為r/s,即每秒請求數,也可以按分鍾:r/m,即每分鍾請求數
例.
limit_req_zone $binary_remote_addr zone=one:10m rate=2r/s;
例中,定義了一個名為one,大小為10m的共享內存用於存放$binary_remote_addr變量值(每個客戶端IP地址視為一個key)的state。平均請求處理速率不能超過2個請求/秒,即每秒請求數不能超過2個。
注意,對於IPv4來說,$binary_remote_addr變量大小總是4個字節, 而對IPv6來說則是16字節。存儲的state,在32位平台上總是占64字節,而64位平台上則總是占128字節。1MB zone可以存放大於16,000個64-byte的state,8000個 128-byte的state
如果zone存儲區域用完,則最近使用的state將被移除。如果這樣之后,還是不能創建新的state,請求將被中斷,並報錯。
limit_req zone=name [burst=number] [nodelay];
使用范圍: http, server, location
說明:
zone=name 指定共享內存區域。如果請求速率超過為某個zone設置的rate,超過限制的請求將被延遲處理,以保持預先定義的請求處理速率。注意,在未達到burst最大值之前,超出的請求將被延遲處理,否則將按出錯的方式中斷。
burst 設置burst的最大值。默認值為0
nodelay 設置不延遲處理超過限制的請求
例.
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
server {
location /search/ {
limit_req zone=one burst=5;
}
以上,設置允許每秒多余1個請求,但burst不能超過5個請求。如果不想延遲處理超過限制的請求,可以加nodelay。如下:
limit_req zone=one burst=5 nodelay;
可以同時存在多條limit_req指令,如下,限制來自同個ip地址的請求速率,同時也限制同個虛擬服務器的請求處理速率:
limit_req_zone $binary_remote_addr zone=perip:10m rate=1r/s;
limit_req_zone $server_name zone=perserver:10m rate=10r/s;
server {
...
limit_req zone=perip burst=5 nodelay;
limit_req zone=perserver burst=10;
}
注: 虛擬服務器名稱的定義位於server節點下,如下
server {
listen 8080;
server_name localhost;
...
參考連接:
http://nginx.org/en/docs/http/ngx_http_limit_req_module.html
類似的,還有ngx_http_limit_conn_module模塊。ngx_http_limit_conn_module模塊用於限制每個預定義key的連接數量,通常的來自某個ip地址的連接數量。注意,並不會統計所有的連接。當且僅當其某個請求被服務器處理,且讀取了整個請求頭,才會統計其所在的連接。
例.
http {
limit_conn_zone $binary_remote_addr zone=addr:10m;
...
server {
...
location /download/ {
limit_conn addr 1;
}
指令:
語法:limit_conn_zone key zone=name:size;
Context:http
例.
limit_conn_zone $binary_remote_addr zone=addr:10m;
針對32位系統來說,存儲的每個state總是占32、64字節,而針對64位系統來說則總是占64字節。1MB大致可保存32-byte的state,16個64-byte的state。如果zone區域用光,則返回錯誤給后續請求。
語法:limit_conn zone number;
Context:http, server, location
說明:
zone 設置針對某個key值,共享內存區允許的最大連接數。如果超過限制,則服務器會返回請求錯誤。
例.
limit_conn_zone $binary_remote_addr zone=addr:10m;
server {
location /download/ {
limit_conn addr 1;
}
例中設置針對同一個ip,同時僅允許一個並發連接。
HTTP/2 和SPDY協議中,當前的每個請求視為一個獨立的連接。
可以同時存在幾個limit_conn。如下:
limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn_zone $server_name zone=perserver:10m;
server {
...
limit_conn perip 10;
limit_conn perserver 100;
}
參考鏈接:
http://nginx.org/en/docs/http/ngx_http_limit_conn_module.html#example
實際測試結果
注:實際測試中,為了驗證配置是否起作用,get請求單個頁面,請求好幾個都沒被統計在被內,而post則基本一試就起作用了~~