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;

    }
}
相关文章
相关标签/搜索