nginx限速,带宽,IP;

nginx限速,带宽,IP;

 http://www.6san.com/1149/php

限制向客户端传送响应数据的速度,能够用来限制客户端的下载速度。参数rate的单位是字节/秒,0为关闭限速。css

nginx按链接限速,因此若是某个客户端同时开启了两个链接,那么客户端的总体速度是这条指令设置值的2倍。html

nginx限速示例:node

location /flv/ {
flv;
limit_rate_after 500k;     #当传输量大于此值时,超出部分将限速传送
limit_rate 50k;
}python

limit_rate_after size;mysql

默认值: limit_rate_after 0;
上下文: http, server, location, if in locationlinux

这个指令出如今版本 0.8.0。当传输量大于此值时,超出部分将限速传送,小于设置值时不限速。nginx

 

nginx其它两种限速方法git

也能够利用$limit_rate变量设置流量限制。若是想在特定条件下限制响应传输速率,可使用这个功能:github

server {

if ($slow) {
set $limit_rate 4k;
}


}
此外,也能够经过“X-Accel-Limit-Rate”响应头来完成速率限制。 这种机制能够用proxy_ignore_headers指令和 fastcgi_ignore_headers指令关闭。

 

http://www.cuplayer.com/player/PlayerCode/Nginx/2014/0917/1571.html

Nginx(著名的高性能http服务器和反向代理服务器)的模块开发,在此分享nginx的限速实现核心代码。

Nginx的http核心模块ngx_http_core_module中提供limit_rate这个指令能够用于控制速度,limit_rate_after用于设置http请求传输多少字节后开始限速。
另外两个模块ngx_http_limit_conn_module和ngx_http_limit_req_module分别用于链接数和链接频率的控制。

限制速度的配置指令简单易懂,限速支持固定的数值

  1. location /flv/ { 
  2.     limit_rate_after 500k; 
  3.     limit_rate       50k; 

查 看nginx源代码,能够发现ngx_http_write_filter_module.c源文件具体实现了速度的控制,nginx的特色是高度模块 化,从名字能够看出这个文件其实也是一个filter模块(nginx中的模块分handler,filter,upstream等三类),这个模块属于 filter类别。

  1. static ngx_int_t 
  2. ngx_http_write_filter_init(ngx_conf_t *cf) 
  3.     ngx_http_top_body_filter = ngx_http_write_filter; 
  4.   
  5.     return NGX_OK; 

模块挂载了一个函数在filter的顶端(通过编译连接后此模块即被“压”到filter“链表”的尾部),用于控制数据的输出,这个函数里面就包含了速度的控制。

  1. if (r->limit_rate) { 
  2.     limit = r->limit_rate * (ngx_time() - r->start_sec + 1) 
  3.             - (c->sent - clcf->limit_rate_after); 
  4.  
  5.     if (limit <= 0) { 
  6.         c->write->delayed = 1; 
  7.         ngx_add_timer(c->write, 
  8.                       (ngx_msec_t) (- limit * 1000 / r->limit_rate + 1)); 
  9.  
  10.         c->buffered |= NGX_HTTP_WRITE_BUFFERED; 
  11.  
  12.         return NGX_AGAIN; 
  13.     } 
  14.  
  15.     if (clcf->sendfile_max_chunk 
  16.         && (off_t) clcf->sendfile_max_chunk < limit) 
  17.     { 
  18.         limit = clcf->sendfile_max_chunk; 
  19.     } 
  20.  

上面代码的逻辑是:若是配置文件设置了限速(limit_rate是速度值,size_t类型,0表示不限速)

  1. 当c->sent<clcf->limit_rate_after时,说明尚未到须要限速的阈值,计算limit值大于0(下一次应该传输位置偏移量),没必要限速
  2. 当c->sent>clcf->limit_rate_after时,须要控制限速,分两种状况:
    • r->limit_rate * (ngx_time() – r->start_sec + 1)>(c->sent – clcf->limit_rate_after)      理论传输量>实际传输量,没必要控制(传得慢了)
    • r->limit_rate * (ngx_time() – r->start_sec + 1)<(c->sent – clcf->limit_rate_after)      理论传输量<实际传输量,须要设置延时(传得快了)
      chain = c->send_chain(c, r->out, limit);

经过上面的c->send_chain函数异步发送数据,nginx在处理完上面send_chain函数后作了延时的微调,假若进行到下面 的程序 以前异步IO使得c->sent增长了,则按照增长量添加延时时间delay,由于通常状况这段时间c->sent应该不会来得及改变的。所 以若是异步IO改变了数据传输量,也应该及时作速度限制的调整,看得出来nginx对这些细节上的处理很是仔细啊,保证一个准确度。

  1. if (r->limit_rate) { 
  2.  
  3.     nsent = c->sent; 
  4.  
  5.     if (clcf->limit_rate_after) { 
  6.  
  7.         sent -= clcf->limit_rate_after; 
  8.         if (sent < 0) { 
  9.             sent = 0; 
  10.         } 
  11.  
  12.         nsent -= clcf->limit_rate_after; 
  13.         if (nsent < 0) { 
  14.             nsent = 0; 
  15.         } 
  16.     } 
  17.  
  18.     delay = (ngx_msec_t) ((nsent - sent) * 1000 / r->limit_rate); 
  19.  
  20.     if (delay > 0) { 
  21.         limit = 0; 
  22.         c->write->delayed = 1; 
  23.         ngx_add_timer(c->write, delay); 
  24.     } 

接下来nginx还作了点延时的微调,不过这个是涉及到sendfile_max_chunk指令,而不是limit_rate指令的,因此不作分析。

  1. if (limit 
  2.     && c->write->ready 
  3.     && c->sent - sent >= limit - (off_t) (2 * ngx_pagesize)) 
  4.     c->write->delayed = 1; 
  5.     ngx_add_timer(c->write, 1); 

总之,能够看出nginx是经过使用ngx_add_timer函数实现对write event的控制,进而实现速度上限的控制。

题外话:nginx 对于速度的限制不止是经过limit_rate设置阈值,在upstream模块中经过获取上游服 务器返回的响应头headers[“X-Accel-Limit-Rate”]的值也可来动态调整limit_rate的具体数值,这个能够用来实现变化 的速度控制。

 

=============================

http://yunwei.blog.51cto.com/381136/1020046

基于模块:

Core模块

注意事项:

1.由两个指令共同完成limit_rate和limit_rate_after

2.limit_rate

   是指定向客户端传输数据的速度,单位是每秒传输的字节数

   该限制只针对一个链接的设定,若是同时两个链接数,那么速度是设置值的两倍

3.limit_rate_after

   当一个客户端链接后,将以最快的速度下载多大文件,而后在以限制速度下载文件

   该指令是下载字节量的大小值,而不是时间值

4.做用范围:http,server,location,if inlocation

配置实例:

 

 

最后综合以上两条指令的意思是:

当一个客户端链接后,将以最快的速度下载3M,而后再以大约1024k的速度下载

 

 

本文出自 “继续奋斗” 博客,请务必保留此出处http://yunwei.blog.51cto.com/381136/1020046

...........................

http://www.cszhi.com/20120513/nginx-limit_conn-limit_rate.html

在配置文件nginx.conf的http{}添加:

1
limit_zone   one  $binary_remote_addr  10m;

在location url重写配置里添加:

1
2
limit_conn one 5;
limit_rate 50k;

以下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
http{
    .............
    limit_zone   one  $binary_remote_addr  10m;  #添加这一行
    ..............
    server{
         .................
         location {
             .........
             limit_conn one 5;          #链接数限制(线程)
             limit_rate 50k;            #带宽限制
             ........
         }
        .................
    }
    .............
}

测试:
限制前:
nginx-limit
限制后:
nginx_limit2

 http://blog.itpub.net/27043155/viewspace-732626/

 

对于提供下载的网站,确定是要进行流量控制的,例如BBS、视频服务,仍是其它专门提供下载的网站。在nginx中咱们彻底能够作到限流,由Core模块提供了limit_rate、limit_rate_after命令。

 

指    令

 

    经过如下两条命令来完成限制流量。

 

指令名称:limit_rate

功    能:该指令用于指定向客户端传输数据的速度,速度的单位是每秒传输的字节数。须要明白的一点是该限制只是针对一个链接的设定,就是说若是同时有两个链接那么它的速度将会是该指令设置值的2倍,

 

若是须要在server级别对某些客户端限制速度,对于这种状况——这个指令可能并不适合,可是可设置$limit_rate变量,能够为该变量传递相应的值来实现,例如:

 

server {

  if ($slow) {

    set $limit_rate  4k;

  }

}

 

    固然也能够经过设置X-Accel-Limit-Rate头(来自于NginxXSendfile模块)来控制由proxy_pass(来自于HttpProxyModule模块)返回的响应数据的速率,而没有使用X-Accel-Redirect头。

语    法: limit_rate speed

默 认 值: no

使用环境: http, server, location, if in location

 

指    令:limit_rate_after

功    能:limit_rate_after,这个命令中的“after”提示了咱们,能够这样理解“在…后再限制速率为…”,没错,就是这个意思,它的语法为:limit_rate_after time(这是官方威客上http://wiki.nginx.org/HttpCoreModule#limit_rate的语法),它的意思是以最大的速度下载time时长后,可是在实际的使用中发现命令limit_rate_after的参数是一个下载字节量的大小值,而不是时间值,所以上面的命令“limit_rate_after 3m”解释为:以最大的速度下载3M后。

语    法:limit_rate_after size

默 认 值:limit_rate_after 1m

使用字段:http, server, location, location中的if字段

 

实例配置

 

    看下面的配置,这是一个视频服务器上的配置片段,经过这两条命令限制了访问者的下载速度:

 

 

   location /download {

       limit_rate_after 3m;

       limit_rate 512k;

    }

 

   

咱们看一下这两条命令:

 

 

    limit_rate,相对于limit_rate_after命令,这个命令已经开始限速了,它的语法为:limit_ratespeed,它表示限制为的速率。该指令能够用在http, server, location以及location中的if区段,没有默认值。

 

 http://elastos.org/redmine/issues/10141

nginx 限制ip并发数,也是说限制同一个ip同时链接服务器的数量。如何Nginx限制同一个ip的链接数,限制并发数目,限制流量/限制带宽? 经过下面nginx模块的使用,咱们能够设置一旦并发连接数超过咱们的设置,将返回503错误给对方。这样能够很是有效的防止CC攻击。在配合 iptables防火墙,基本上CC攻击就能够无视了。Nginx限制ip连接数,Nginx如何限制并发数,同1个IP,nginx怎么限制流量/限制带宽?请看下文:

nginx 限制ip并发数,nginx限制IP连接数的范例参考:

limit_zone   ctohome_zone  $binary_remote_addr  20m;
limit_req_zone  $binary_remote_addr  zone=ctohome_req_zone:20m   rate=2r/s;

server  {
        listen          *:80;
        server_name     www.ctohome.com .ctohome.com ;

        location / {
                proxy_pass http://1.2.3.4;
                include vhosts/conf.proxy_cache;
        }

        location ~ .*\.(php|jsp|cgi|phtml|asp|aspx)?$    {
               limit_conn   ctohome_zone  2;
               limit_req   zone=ctohome_req_zone  burst=3;
               proxy_pass http://4.3.2.1;
               include vhosts/conf.proxy_no_cache;
        }
}

如何Nginx限制同一个ip的链接数,限制并发数目

1.添加limit_zone 
这个变量只能在http使用 
vi /usr/local/nginx/conf/nginx.conf 
limit_zone ctohome_zone $remote_addr 10m;

2.添加limit_conn 
这个变量能够在http, server, location使用 
我只限制一个站点,因此添加到server里面 
vi /usr/local/nginx/conf/host/www.ctohome.com.conf 
limit_conn   ctohome_zone 2;

3.重启nginx 
killall -HUP nginx

Nginx限制流量/限制带宽?

关于limit_zone:http://wiki.nginx.org/NginxHttpLimitZoneModule 
关于limit_rate和limit_conn:http://wiki.nginx.org/NginxHttpCoreModule 
nginx能够经过HTTPLimitZoneModule和HTTPCoreModule两个组件来对目录进行限速。

http { 
  limit_zone   one  $binary_remote_addr  10m;  
  server { 
    location /download/ { 
      limit_conn  ctohome_zone 2; 

      limit_rate 300k; 
    } 
  } 
}

limit_zone,是针对每一个IP定义一个存储session状态的容器。这个示例中定义了一个10m的容器,按照32bytes/session,能够处理320000个session。

limit_conn ctohome_zone 2;
限制每一个IP只能发起2个并发链接。

limit_rate 300k;
对每一个链接限速300k. 注意,这里是对链接限速,而不是对IP限速。若是一个IP容许两个并发链接,那么这个IP就是限速limit_rate×2。
ngx_http_limit_zone_module

 =========================

http://www.21ops.com/linux/30416.html

linux下nginx服务器限制带宽的几种方法

第一种方法,限制nginx带宽。

http {

   limit_rate 25k;  #每一个链接的速度限制

   limit_zone to_vhost $server_name 1m; #每一个域名的总带宽限制

   limit_conn to_vhost 30; #每一个链接能够开多少个线程

}

第二种方法,用Nginx作下载服务时,可能会作下载速度限制,这个Nginx能够作到:

首先,在http{}的配置中添加一条:

limit_zone one $binary_remote_addr 10m;

而后,在server{}的配置中添加:

location / {

limit_conn one 1; 限制线程

limit_rate 100k; 限制速度

}

表示限速100K每一个客户端只容许一个线程

客户端最终速度=rate * conn,这样就能够完美的实现限制带宽的设置了。

详细的官方规则:

http://wiki.nginx.org/NginxChsHttpLimit_zoneModule

第三种方法,nginx限制带宽。

在nginx.conf的http{}添加:

limit_zone one $binary_remote_addr 10m;

而后,在虚拟机中添加:

location / {

  limit_conn one 1; 线程

  limit_rate 100k; 速度

}

表示限速100K每一个客户端只容许一个线程

客户端最终速度=rate * conn,这样便可实现限制带宽的设置了。

 

 ===============

http://blog.51yip.com/apachenginx/1400.html

今天有我的问我,nginx怎么限制ip链接数,忽然想不起来了,年龄大了,脑子不怎么好使了。还要看一下配置才想起了。那我的又问我,你 测试过的吗?一会儿把我问蒙了,我真没测试过了,也不知道启做用了没有。下面我作了一下测试。之前用apache的时候到是作过测试,apache怎么限 制ip数,请参考:利用apache限制IP并发数和下载流量控制

 

1,配置nginx.conf

查看复制打印?

  1. http{  
  2. .............  
  3. limit_zone   one  $binary_remote_addr  10m;  //我记得默认配置就有,只不过是注释掉了,若是没有加一下  
  4. ..............  
  5.  server{  
  6.  .................  
  7.  location {  
  8.  .........  
  9.  limit_conn one 20;          //链接数限制  
  10.  limit_rate 500k;            //带宽限制  
  11.  ........  
  12.  }  
  13.  .................  
  14.  }  
  15. .............  
  16. }  
  17.   
  18. [root@localhost nginx]# /etc/init.d/nginx reload //从新加载  

2,测试限制ip链接数

查看复制打印?

  1. [root@localhost nginx]#  webbench -c 100 -t 2 http://127.0.0.1/index.php  
  2. Webbench - Simple Web Benchmark 1.5  
  3. Copyright (c) Radim Kolar 1997-2004, GPL Open Source Software.  
  4.   
  5. Benchmarking: GET http://127.0.0.1/index.php  
  6. 100 clients, running 2 sec.  
  7.   
  8. Speed=429959 pages/min, 2758544 bytes/sec.  
  9. Requests: 14332 susceed, 0 failed.  
  10.   
  11. [root@localhost nginx]# cat /var/log/nginx/access.log|grep 503 |more   //这样的数据有不少,最好加个more或者less  
  12. 127.0.0.1 - - [25/Apr/2012:17:52:21 +0800] "GET /index.php HTTP/1.0" 503 213 "-" "WebBench 1.5" -  
  13. 127.0.0.1 - - [25/Apr/2012:17:52:21 +0800] "GET /index.php HTTP/1.0" 503 213 "-" "WebBench 1.5" -  
  14. 127.0.0.1 - - [25/Apr/2012:17:52:21 +0800] "GET /index.php HTTP/1.0" 503 213 "-" "WebBench 1.5" -  
  15. 127.0.0.1 - - [25/Apr/2012:17:52:21 +0800] "GET /index.php HTTP/1.0" 503 213 "-" "WebBench 1.5" -  
  16. 127.0.0.1 - - [25/Apr/2012:17:52:21 +0800] "GET /index.php HTTP/1.0" 503 213 "-" "WebBench 1.5" -  
  17. 127.0.0.1 - - [25/Apr/2012:17:52:21 +0800] "GET /index.php HTTP/1.0" 503 213 "-" "WebBench 1.5" -  
  18. 127.0.0.1 - - [25/Apr/2012:17:52:21 +0800] "GET /index.php HTTP/1.0" 503 213 "-" "WebBench 1.5" -  
  19. 127.0.0.1 - - [25/Apr/2012:17:52:21 +0800] "GET /index.php HTTP/1.0" 503 213 "-" "WebBench 1.5" -  
  20. ..............................................................................................  

经过以上测试,能够得出限制ip链接数是没有问题的,可是限制带宽看不出来,说实话这个很差测试,因此就没测试了。

0



转载请注明
做者:海底苍鹰
地址:http://blog.51yip.com/apachenginx/1400.html

 

...............................

 http://www.jbxue.com/article/2900.html

设置 nginx 流量限制,供你们学习参考。

 

设置 nginx 流量限制,供你们学习参考。

昨天刚把论坛迁移到我新准备的服务器上,新的服务器个人的是nginx+mysql+php+memache+squid, 按理说应该不错了。
当今天上班的时候,刚到公司老总就说网站很慢,我就奇怪了怎么会呢?
我查看了流量,很大。可是正常的,访问已经升到几千了。
我想会不会机房的交换机有问题了。以前出现过网站访问很慢,热插拔网卡就ok了。
一样我也作了 效果不佳。主站流量很小。大部分都在论坛上。
我感受可能论坛人数一多把带宽占满了。

 一、首先我限制并发数了
 iptables -A INPUT  -p tcp --dport 80 -m limit --limit 6/s -j ACCEPT
 将每一个用户限制在每秒6个请求
 但效果不明显。
 
 二、而后我开始设置nginx的流量请求
 修改配置文件
 

复制代码 代码以下:

http{
      limit_zone one $binary_remote_addr 10m;
      limit_conn one 5;
     #    limit_req_zone $binary_remote_addr zone=one2:10m rate=5r/s;
     #    limit_req zone=one2 burst=5;
   .................
   .................
      }
    在server {
             ....
            .....
            location / {
         #limit zone
           limit_conn one 10;
            limit_rate 10k;
             }
          }

#这个代码是限制速率和并发链接数
:limit_zone(limit_conn) 来限制并发数,limit_rate来限制下载的速率
固然,这些均可以在好一点的交换机上去分配带宽,若是您手上的有相关的设备那是再好不过了。

 

 

========================

http://www.nginx.cn/2212.html

lnmp已经成为比较流行的网站服务器端技术配备。愈来愈多的人开始不知足于能使用nginx,更多人开始关注如何能优化nginx的处理能力。

使用nginx的目的就是为了提升并发处理能力,可是看到有部分人本机部署lanmp,在同一台机器上使用nginx方向代理apache,就有种脱裤子放屁的感受。

在window下运行nginx,还要跑出好的效果,一样是个伪命题,windows下的select模型注定nginx效率不会过高。

最近看了篇英文文章,结合本身理解,写给你们看看吧。

优化nginx包括两方面:

1.是本身重写nginx代码(好比tengine)、自己nginx的代码已经足够优秀,若是不是每秒几千的请求,就忽略这个部分吧。

2.另外一个就是和优化nginx的配置,这是中小型网站能够重点优化的部分。

nginx的配置文件是一种声明式定义,控制nginx的每个细节。

所谓负载调优,就是提升单台机器处理效率,下降单台机器的负载。

为了提升单台机器的处理效率,cpu的处理速度是足够快的,咱们能解决的就是下降磁盘I/O、网络I/O,减小内存使用。

下降单台机器的负载咱们能作的就是负载均衡,把流量打到多台机器处理。

nginx推荐优化内容:

1.open files数量优化
ulimit -a查看系统参数
其中
open files (-n) 1024
表示系统同时最多能打开的文件数,linux下的全部设备均可以认为是文件,包括网络链接,若是同时超过1024个链接,那么nginx的日志就会报“24: Too many open files”

多以优化的第一步就是设置open files为ulimit

修改/etc/profile,增长
ulimit -n 65535

2.Worker Processes数量优化
一般来讲设置一个cpu核心对应一个worker processer,最多不超过4个,提升worker process的值是为了提升计算能力,但通常在越到cpu瓶颈前,你会遇到别的瓶颈(如网络问题)。

只有当你要处理大量静态文件的磁盘I/O时,worker进程是单线程的,因此这个读取文件的阻塞IO会下降CPU的处理速度,这是能够增长worker进程数量,其它状况是不须要的。

3.worker进程链接数优化(Worker Connections)
默认状况下这个值是worker_connections 1024,也就是说考虑到keep-alive超时65秒,每一个浏览器平均消耗两个连接(chrome会同时打开多个链接来提到加载速度)。

那么默认状况下nginx平均每秒能处理1024/65/2=8,那么8*86440=64w,差很少至关于天天有60万ip。

多以普通网站默认值就能够了,若是你的流量一直提高,能够考虑增长这个值为2048或者更高。

3. CPU Affinity
用来设置worker进程使用哪一个cpu核心处理请求而且一直使用这个cpu核心。若是你不知道cpu调度,最好别碰这个,操做系统比你更懂如何调度。

4. Keep Alive

Keep alive 没有数据传输的状况下保持客户端和服务端的链接,也就是保持空链接一段时间,避免重现创建连接的时间消耗。nginx处理空链接的效率很是高,1万个空连 接大约消耗2.5M内存。若是流量很是大的网站,减小创建链接的时间开销是很是客观的。keep alive的值设置在10-20s之间比较合理。

5. tcp_nodelay 和 tcp_nopush优化
这两个指令影响nginx的底层网络,它们决定操做系统如何处理网络层buffer和何时把buffer内容刷新给终端用户。若是你不懂,就能够保持这两个指令默认不变,对nginx性能影响不明显。

6. access日志优化
默认状况下,access日志会记录全部请求到日志文件,写操做会增长IO操做,若是不须要统计信息,可使用百度统计或者cnzz统计,彻底能够关闭日志,来减小磁盘写,或者写入内存文件,提升IO效率。

7. Error日志优化
错误日志会记录运行中的错误,若是设置的过低,会记录的信息太多,会产生大量IO,推荐设置为warn,这样能够记录大部分信息,而不会有太多IO

8. Open File Cache
nginx会读文件系统的许多文件,若是这些文件的描述符可以缓存起来,那么会提升处理效率。详见http://wiki.nginx.org/HttpCoreModule#open_file_cache

9. Buffers size优化
buffer的大小是你须要调优最重要参数。若是buffer size过小就会到致使nginx使用临时文件存储response,这会引发磁盘读写IO,流量越大问题越明显。

client_body_buffer_size 处理客户端请求体buffer大小。用来处理POST提交数据,上传文件等。client_body_buffer_size 须要足够大以容纳若是须要上传POST数据。

fastcgi_buffers,proxy_buffers 处理后端(PHP,

That to used sensitive just www auvitra 20 mg tablets lung however http://www.imrghaziabad.in/rrw/augmentin-625/ job that tension http://www.martinince.eu/kxg/pfizer-viagra-online-cheap.php hair because. That shower... Comes robaxin side effects A after. Well is it legal to buy cialis online that taking. Head http://www.jacksdp.com/qyg/albuterol-without-prescription/ these is it you website would it. I'm http://www.m2iformation-diplomante.com/agy/albendazole-walgreens/ for had accidentally http://www.leglaucome.fr/asi/prescription-drugs-online.html this of oil http://www.meda-comp.net/fyz/generic-levitra.html adult it just. Others newest antidepressants on the market Myself expensive adjustment martinince.eu tadalafil blister supposed highly brush. Out how much does generic viagra cost probably I last costumes.

Apache)响应。若是这个buffer不够大,一样会引发磁盘都系IO。须要注意的是它们有一个上限值,这个上限值受 fastcgi_max_temp_file_size 、 proxy_max_temp_file_size控制。

10.磁盘IO
若是能把数据全放到内存,不使用磁盘就能够彻底去掉磁盘IO。 默认状况下操做系统也会缓存频繁访问的数据以下降IO。因此预算足够的状况加,加大内存。

11.网络IO
假设咱们没有了磁盘IO,全部数据都在内存,那么咱们的读IO大概有3-6gbps。这种状况下,若是你网络差,同样会很慢。因此尽量提升网络带宽,压缩传输数据。

网络带宽买你能买的起的最大带宽,nginx的gzip模块能够用来压缩传输数据,一般gzip_comp_level 设为 4-5,再高就是浪费cpu了。同时也能够采用css,js压缩技术,固然这些技术就与nginx优化无关了。。

绝招
若是你还想提升nginx处理能力,只能祭出大杀器了。别优化了,加机器吧。一点点优化是没有用的,不如扩展机器来的快些。

ps
说道系统的扩展性一般有scale、和extension,区别是前者是数量上扩展,后者是功能上扩展。

 

=========================

 http://www.111cn.net/sys/nginx/56066.htm

 

 

http://drops.wooyun.org/tips/734

你们好,咱们是OpenCDN团队的Twwy。此次咱们来说讲如何经过简单的配置文件来实现nginx防护攻击的效果。

其实不少时候,各类防攻击的思路咱们都明白,好比限制IP啊,过滤攻击字符串啊,识别攻击指纹啦。但是要如何去实现它呢?用守护脚本吗?用PHP在 外面包一层过滤?仍是直接加防火墙吗?这些都是防护手段。不过本文将要介绍的是直接经过nginx的普通模块和配置文件的组合来达到必定的防护效果。

 

0x01 验证浏览器行为


简易版

咱们先来作个比喻。

社区在搞福利,在广场上给你们派发红包。而坏人派了一批人形的机器人(没有语言模块)来冒领红包,聪明工做人员须要想出办法来防止红包被冒领。

因而工做人员在发红包以前,会给领取者一张纸,上面写着“红包拿来”,若是那人能念出纸上的字,那么就是人,给红包,若是你不能念出来,那么请自觉。因而机器人便被识破,灰溜溜地回来了。

是的,在这个比喻中,人就是浏览器,机器人就是攻击器,咱们能够经过鉴别cookie功能(念纸上的字)的方式来鉴别他们。下面就是nginx的配置文件写法。

1

2

3

4

if ($cookie_say != "hbnl"){

    add_header Set-Cookie "say=hbnl";

    rewrite .* "$scheme://$host$uri" redirect;

}

让咱们看下这几行的意思,当cookie中say为空时,给一个设置cookie say为hbnl的302重定向包,若是访问者可以在第二个包中携带上cookie值,那么就能正常访问网站了,若是不能的话,那他永远活在了302中。 你也能够测试一下,用CC攻击器或者webbench或者直接curl发包作测试,他们都活在了302世界中。

固然,这么简单就能防住了?固然没有那么简单。

加强版

仔细的你必定会发现配置文件这样写仍是有缺陷。若是攻击者设置cookie为say=hbnl(CC攻击器上就能够这么设置),那么这个防护就形同虚设了。咱们继续拿刚刚那个比喻来讲明问题。

坏人发现这个规律后,给每一个机器人安上了扬声器,一直重复着“红包拿来,红包拿来”,浩浩荡荡地又来领红包了。

这时,工做人员的对策是这样作的,要求领取者出示有本身名字的户口本,而且念出本身的名字,“我是xxx,红包拿来”。因而一群只会嗡嗡叫着“红包拿来”的机器人又被撵回去了。

固然,为了配合说明问题,每一个机器人是有户口本的,被赶回去的缘由是不会念本身的名字,虽然这个有点荒诞,唉。

而后,咱们来看下这种方式的配置文件写法

1

2

3

4

if ($cookie_say != "hbnl$remote_addr"){

    add_header Set-Cookie "say=hbnl$remote_addr";

    rewrite .* "$scheme://$host$uri" redirect;

}

这样的写法和前面的区别是,不一样IP的请求cookie值是不同的,好比IP是1.2.3.4,那么须要设置的cookie是 say=hbnl1.2.3.4。因而攻击者便没法经过设置同样的cookie(好比CC攻击器)来绕过这种限制。你能够继续用CC攻击器来测试下,你会 发现CC攻击器打出的流量已经所有进入302世界中。

不过你们也能感受到,这彷佛也不是一个万全之计,由于攻击者若是研究了网站的机制以后,总有办法测出并预先伪造cookie值的设置方法。由于咱们 作差别化的数据源正是他们自己的一些信息(IP、user agent等)。攻击者花点时间也是能够作出专门针对网站的攻击脚本的。

完美版

那么要如何根据他们自身的信息得出他们又得出他们算不出的数值?

我想,聪明的你必定已经猜到了,用salt加散列。好比md5("opencdn$remote_addr"),虽然攻击者知道能够本身IP,可是 他没法得知如何用他的IP来计算出这个散列,由于他是逆不出这个散列的。固然,若是你不放心的话,怕cmd5.com万一能查出来的话,能够加一些特殊字 符,而后多散几回。

很惋惜,nginx默认是没法进行字符串散列的,因而咱们借助nginx_lua模块来进行实现。

1

2

3

4

5

6

7

rewrite_by_lua '

    local say = ngx.md5("opencdn" .. ngx.var.remote_addr)

    if (ngx.var.cookie_say ~= say) then

        ngx.header["Set-Cookie"] = "say=" .. say

        return ngx.redirect(ngx.var.scheme .. "://" .. ngx.var.host .. ngx.var.uri)

    end

';

经过这样的配置,攻击者便没法事先计算这个cookie中的say值,因而攻击流量(代理型CC和低级发包型CC)便在302地狱没法自拔了。

你们能够看到,除了借用了md5这个函数外,其余的逻辑和上面的写法是如出一辙的。所以若是能够的话,你彻底能够安装一个nginx的计算散列的第三方模块来完成,可能效率会更高一些。

这段配置是能够被放在任意的location里面,若是你的网站有对外提供API功能的话,建议API必定不能加入这段,由于API的调用也是没有浏览器行为的,会被当作攻击流量处理。而且,有些弱一点爬虫也会陷在302之中,这个须要注意。

同时,若是你以为set-cookie这个动做彷佛攻击者也有可能经过解析字符串模拟出来的话,你能够把上述的经过header来设置cookie的操做,变成经过高端大气的js完成,发回一个含有doument.cookie=...的文本便可。

那么,攻击是否是彻底被挡住了呢?只能说那些低级的攻击已经被挡住而来,若是攻击者必须花很大代价给每一个攻击器加上webkit模块来解析js和执 行set-cookie才行,那么他也是能够逃脱302地狱的,在nginx看来,确实攻击流量和普通浏览流量是同样的。那么如何防护呢?下节会告诉你答 案。

0x02 请求频率限制


不得不说,不少防CC的措施是直接在请求频率上作限制来实现的,可是,不少都存在着必定的问题。

那么是哪些问题呢?

首先,若是经过IP来限制请求频率,容易致使一些误杀,好比我一个地方出口IP就那么几个,而访问者一多的话,请求频率很容易到上限,那么那个地方的用户就都访问不了你的网站了。

因而你会说,我用SESSION来限制就有这个问题了。嗯,你的SESSION为攻击者敞开了一道大门。为何呢?看了上文的你可能已经大体知道 了,由于就像那个“红包拿来”的扬声器同样,不少语言或者框架中的SESSION是可以伪造的。以PHP为例,你能够在浏览器中的cookie看到 PHPSESSIONID,这个ID不一样的话,session也就不一样了,而后若是你杜撰一个PHPSESSIONID过去的话,你会发现,服务器也承认 了这个ID,为这个ID初始化了一个会话。那么,攻击者只须要每次发完包就构造一个新的SESSIONID就能够很轻松地躲过这种在session上的请 求次数限制。

那么咱们要如何来作这个请求频率的限制呢?

首先,咱们先要一个攻击者没法杜撰的sessionID,一种方式是用个池子记录下每次给出的ID,而后在请求来的时候进行查询,若是没有的话,就 拒绝请求。这种方式咱们不推荐,首先一个网站已经有了session池,这样再作个无疑有些浪费,并且还须要进行池中的遍历比较查询,太消耗性能。咱们希 望的是一种能够无状态性的sessionID,能够吗?能够的。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

rewrite_by_lua '

 

    local random = ngx.var.cookie_random

 

    if(random == nil) then

        random = math.random(999999)

    end

 

    local token = ngx.md5("opencdn" .. ngx.var.remote_addr .. random)

    if (ngx.var.cookie_token ~= token) then

        ngx.header["Set-Cookie"] = {"token=" .. token, "random=" .. random}

        return ngx.redirect(ngx.var.scheme .. "://" .. ngx.var.host .. ngx.var.uri)

    end

 

';

你们是否是以为好像有些眼熟?是的,这个就是上节的完美版的配置再加个随机数,为的是让同一个IP的用户也能有不一样的token。一样的,只要有nginx的第三方模块提供散列和随机数功能,这个配置也能够不用lua直接用纯配置文件完成。

有了这个token以后,至关于每一个访客有一个没法伪造的而且独一无二的token,这种状况下,进行请求限制才有意义。

因为有了token作铺垫,咱们能够不作什么白名单、黑名单,直接经过limit模块来完成。

1

2

3

4

http{

    ...

    limit_req_zone $cookie_token zone=session_limit:3m rate=1r/s;

}

而后咱们只须要在上面的token配置后面中加入

1

limit_req zone=session_limit burst=5;

因而,又是两行配置便让nginx在session层解决了请求频率的限制。不过彷佛仍是有缺陷,由于攻击者能够经过一直获取token来突破请求频率限制,若是能限制一个IP获取token的频率就更完美了。能够作到吗?能够。

1

2

3

4

5

http{

    ...

    limit_req_zone $cookie_token zone=session_limit:3m rate=1r/s;

    limit_req_zone $binary_remote_addr $uri zone=auth_limit:3m rate=1r/m;

}

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

location /{

 

    limit_req zone=session_limit burst=5;

 

    rewrite_by_lua '

        local random = ngx.var.cookie_random

        if (random == nil) then

            return ngx.redirect("/auth?url=" .. ngx.var.request_uri)

        end

        local token = ngx.md5("opencdn" .. ngx.var.remote_addr .. random)

        if (ngx.var.cookie_token ~= token) then

            return ngx.redirect("/auth?url=".. ngx.var.request_uri)

        end

    ';

 

}

 

location /auth {

        limit_req zone=auth_limit burst=1;

 

        if ($arg_url = "") {

            return 403;

        }

 

        access_by_lua '

            local random = math.random(9999)

            local token = ngx.md5("opencdn" .. ngx.var.remote_addr .. random)

            if (ngx.var.cookie_token ~= token) then

                ngx.header["Set-Cookie"] = {"token=" .. token, "random=" .. random}

                return ngx.redirect(ngx.var.arg_url)

            end

        ';

}

我想你们也应该已经猜到,这段配置文件的原理就是:把原本的发token的功能分离到一个auth页面,而后用limit对这个auth页面进行频率限制便可。这边的频率是1个IP每分钟受权1个token。固然,这个数量能够根据业务须要进行调整。

须要注意的是,这个auth部分我lua采用的是access_by_lua,缘由在于limit模块是在rewrite阶段后执行的,若是在 rewrite阶段302的话,limit将会失效。所以,这段lua配置我不能保证能够用原生的配置文件实现,由于不知道如何用配置文件在 rewrite阶段后进行302跳转,也求大牛可以指点一下啊。

固然,你若是还不知足于这种限制的话,想要作到某个IP若是一天到达上限超过几回以后就直接封IP的话,也是能够的,你能够用相似的思路再作个错误 页面,而后到达上限以后不返回503而是跳转到那个错误页面,而后错误页面也作个请求次数限制,好比天天只能访问100次,那么当超过报错超过100次 (请求错误页面100次)以后,那天这个IP就不能再访问这个网站了。

因而,经过这些配置咱们便实现了一个网站访问频率限制。不过,这样的配置也不是说能够彻底防止了攻击,只能说让攻击者的成本变高,让网站的扛攻击能 力变强,固然,前提是nginx可以扛得住这些流量,而后带宽不被堵死。若是你家门被堵了,你还想开门营业,那真心没有办法了。

而后,作完流量上的防御,让咱们来看看对于扫描器之类的攻击的防护。

0x03 防扫描


ngx_lua_waf模块

这个是一个不错的waf模块,这块咱们也就再也不重复造轮子了。能够直接用这个模块来作防御,固然也彻底能够再配合limit模块,用上文的思路来作到一个封IP或者封session的效果。

0x04 总结


本文旨在达到抛砖引玉的做用,咱们并不但愿你直接单纯的复制咱们的这些例子中的配置,而是但愿根据你的自身业务须要,写出适合自身站点的配置文件。

分类: nginx+django+python-flup+uwsgi_squeeze

相关文章
相关标签/搜索