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;D
efault:    —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配置的朋友的一些說明、具體能夠搜索一下。spa

看上面的語法,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地址,htm

好比咱們能夠用$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) 錯誤

limit_conn指令

Syntax:    limit_conn zone number;D

efault:    —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;D

efault:    limit_conn_log_level error;Context:    http, server, location

說明:當達到最大限制鏈接數後,記錄日誌的等級。

limit_conn_status指令

Syntax:    limit_conn_status code;Default:    limit_conn_status 503;Co

ntext:    http, server, location

說明:當超過限制後,返回的響應狀態碼,默認是503,如今你就知道上面爲何會返回503(Service Temporarily Unavailable)服務暫時不可用

例子:

1.同時限制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;

        }
    }
}

2.根據請求參數來限制

#請求: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;

    }
}
相關文章
相關標籤/搜索