Nginx 限制並發連接和並發請求數配置


Nginx限制並發連接和並發請求數配置

 

by:授客  QQ1033553122

 

測試環境

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_modulehttp_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;

Contexthttp

說明:

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,00064-bytestate8000 128-bytestate

 

如果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總是占3264字節,而針對64位系統來說則總是占64字節。1MB大致可保存32-bytestate1664-bytestate。如果zone區域用光,則返回錯誤給后續請求。

 

 

語法:limit_conn zone number;

Contexthttp, 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則基本一試就起作用了~~

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM