Nginx鏈接數、請求數限制應用詳解

需求

  1. 秒殺、搶購併發限制、隊列緩衝php

  2. 下載帶寬限制html

  3. 防止攻擊nginx

nginx鏈接數限制模塊

說明:nginx有不少模塊、模塊下面又分不少指令,下面就說說limit_conn_zone和limit_conn兩指令

一、limit_conn_zone

語法:服務器

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

limit_conn指令

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錯誤

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)服務暫時不可用

例子:

一、同時限制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;
    }
}

ngx_http_limit_req_module

limit_req_zone

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/

http://blog.csdn.net/shootyou/article/details/46813967

相關文章
相關標籤/搜索