码迷,mamicode.com
首页 > 其他好文 > 详细

nginx 连接限制新语法

时间:2015-08-06 18:47:12      阅读:175      评论:0      收藏:0      [点我收藏+]

标签:nginx 限制

如何设置能限制某个IP某一时间段的访问次数是一个让人头疼的问题,特别面对恶意的ddos攻击的时候。其中CC攻击(Challenge Collapsar)是DDOS(分布式拒绝服务)的一种,也是一种常见的网站攻击方法,攻击者通过代理服务器或者肉鸡向向受害主机不停地发大量数据包,造成对方服务器资源耗尽,一直到宕机崩溃。

cc攻击一般就是使用有限的ip数对服务器频繁发送数据来达到攻击的目的,nginx可以通过HttpLimitReqModul和HttpLimitZoneModule配置来限制ip在同一时间段的访问次数来防cc攻击。


HttpLimitReqModul用来限制连单位时间内连接数的模块,使用limit_req_zone和limit_req指令配合使用来达到限制。一旦并发连接超过指定数量,就会返回503错误。

HttpLimitConnModul用来限制单个ip的并发连接数,使用limit_zone和limit_conn指令


这两个模块的区别前一个是对一段时间内的连接数限制,后者是对同一时刻的连接数限制


HttpLimitReqModul 限制某一段时间内同一ip访问数实例

http {

    .....

    #定义一个名为allips的limit_req_zone用来存储session,大小是10M内存,

    #以$binary_remote_addr 为key,限制平均每秒的请求为1个,

    #1M能存储16000个状态,rete的值必须为整数,

    #如果限制两秒钟一个请求,可以设置成60r/m

    limit_req_zone $binary_remote_addr zone=allips:10m rate=60r/m;

    #limit_conn_zone $binary_remote_addr zone=one:10m;


    ## Log Format ###

    log_format  main  ‘$remote_addr $host $remote_user [$time_local] "$request" ‘

                      ‘$status $body_bytes_sent "$http_referer" "$http_user_agent" "$gzip_ratio"‘;

    server {

        listen       80;

        server_name  ckl.zab.com;


        location / {

            root   /opt/wwwroot/zabbix;

            index  index.html index.php index.htm test.php;

        }


        location ~ \.php$ {

            root           /opt/wwwroot/zabbix;

            fastcgi_pass   127.0.0.1:9000;

            fastcgi_index  index.php;

            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;

            include        fastcgi_params;

   #限制每ip每秒不超过20个请求,漏桶数burst为5

            #brust的意思就是,如果第1秒、2,3,4秒请求为19个,

            #第5秒的请求为25个是被允许的。

            #但是如果你第1秒就25个请求,第2秒超过20的请求返回503错误。

            #nodelay,如果不设置该选项,严格使用平均速率限制请求数,

            #第1秒25个请求时,5个请求放到第2秒执行,

            #设置nodelay,25个请求将在第1秒执行。

            limit_req zone=allips burst=5 nodelay;

       }


    }


 测试:

 /opt/abtmp/usr/bin/ab -n 10 -c 10 http://127.0.0.1/test.php

127.0.0.1 - - [27/Dec/2014:23:10:29 +0800] "GET /test.php HTTP/1.0" 200 11 "-" "ApacheBench/2.3"

127.0.0.1 - - [27/Dec/2014:23:10:29 +0800] "GET /test.php HTTP/1.0" 503 206 "-" "ApacheBench/2.3"

127.0.0.1 - - [27/Dec/2014:23:10:29 +0800] "GET /test.php HTTP/1.0" 503 206 "-" "ApacheBench/2.3"

127.0.0.1 - - [27/Dec/2014:23:10:29 +0800] "GET /test.php HTTP/1.0" 503 206 "-" "ApacheBench/2.3"

127.0.0.1 - - [27/Dec/2014:23:10:29 +0800] "GET /test.php HTTP/1.0" 503 206 "-" "ApacheBench/2.3"

127.0.0.1 - - [27/Dec/2014:23:10:29 +0800] "GET /test.php HTTP/1.0" 503 206 "-" "ApacheBench/2.3"

127.0.0.1 - - [27/Dec/2014:23:10:29 +0800] "GET /test.php HTTP/1.0" 503 206 "-" "ApacheBench/2.3"

127.0.0.1 - - [27/Dec/2014:23:10:29 +0800] "GET /test.php HTTP/1.0" 503 206 "-" "ApacheBench/2.3"

127.0.0.1 - - [27/Dec/2014:23:10:29 +0800] "GET /test.php HTTP/1.0" 503 206 "-" "ApacheBench/2.3"

127.0.0.1 - - [27/Dec/2014:23:10:29 +0800] "GET /test.php HTTP/1.0" 503 206 "-" "ApacheBench/2.3"


每秒限制一个,超过503



 HttpLimitZoneModule 限制并发连接数实例

limit_zone只能定义在http作用域,limit_conn可以定义在http server location作用域

http {

    .....

    #定义一个名为one的limit_zone,大小10M内存来存储session,

    #以$binary_remote_addr 为key

    #nginx 1.18以后用limit_conn_zone替换了limit_conn

    #且只能放在http作用域

    limit_conn_zone $binary_remote_addr zone=one:10m;


    ## Log Format ###

    log_format  main  ‘$remote_addr $host $remote_user [$time_local] "$request" ‘

                      ‘$status $body_bytes_sent "$http_referer" "$http_user_agent" "$gzip_ratio"‘;

    server {

        listen       80;

        server_name  ckl.zab.com;


        location / {

            root   /opt/wwwroot/zabbix;

            index  index.html index.php index.htm test.php;

        }


        location ~ \.php$ {

            root           /opt/wwwroot/zabbix;

            fastcgi_pass   127.0.0.1:9000;

            fastcgi_index  index.php;

            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;

            include        fastcgi_params;

   #连接限制为5

            limit_conn one 5;

   #带宽限制,对单个连接限数,如果一个ip两个连接,就是500x2k

            limit_rate 300k;

       }


    }

}

 测试:

 /opt/abtmp/usr/bin/ab -n 10 -c 10 http://127.0.0.1/test.php

127.0.0.1 - - [27/Dec/2014:23:08:05 +0800] "GET /test.php HTTP/1.0" 200 11 "-" "ApacheBench/2.3"

127.0.0.1 - - [27/Dec/2014:23:08:05 +0800] "GET /test.php HTTP/1.0" 200 11 "-" "ApacheBench/2.3"

127.0.0.1 - - [27/Dec/2014:23:08:05 +0800] "GET /test.php HTTP/1.0" 200 11 "-" "ApacheBench/2.3"

127.0.0.1 - - [27/Dec/2014:23:08:05 +0800] "GET /test.php HTTP/1.0" 200 11 "-" "ApacheBench/2.3"

127.0.0.1 - - [27/Dec/2014:23:08:05 +0800] "GET /test.php HTTP/1.0" 200 11 "-" "ApacheBench/2.3"

127.0.0.1 - - [27/Dec/2014:23:08:05 +0800] "GET /test.php HTTP/1.0" 503 206 "-" "ApacheBench/2.3"

127.0.0.1 - - [27/Dec/2014:23:08:05 +0800] "GET /test.php HTTP/1.0" 503 206 "-" "ApacheBench/2.3"

127.0.0.1 - - [27/Dec/2014:23:08:05 +0800] "GET /test.php HTTP/1.0" 503 206 "-" "ApacheBench/2.3"

127.0.0.1 - - [27/Dec/2014:23:08:05 +0800] "GET /test.php HTTP/1.0" 503 206 "-" "ApacheBench/2.3"

127.0.0.1 - - [27/Dec/2014:23:08:05 +0800] "GET /test.php HTTP/1.0" 503 206 "-" "ApacheBench/2.3"

每秒的限制为5,超过503


本文出自 “运维菜鸟” 博客,请务必保留此出处http://ckl893.blog.51cto.com/8827818/1682248

nginx 连接限制新语法

标签:nginx 限制

原文地址:http://ckl893.blog.51cto.com/8827818/1682248

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!