• 牛牛
    2019-03-01
    老师,有一个问题想请教,这几天服务器指定请求路径被攻击,我想通过location匹配被攻击的路径,利用req模块限制请求频率,但是苦恼的是location匹配不到/?app=index/login这样的路径,然后我就在location / {}中通过if判断指定路径,并且在判断中使用req指令,结果if能够生效,但是nginx提示req的指令位置不对,可能不能在if中使用吧,所以,想请教老师解惑

    作者回复: limit_req不能在if中使用,你可以先在if中rewrite到@location中,在这个location中再limit_req

    
     6
  • 高枕
    2018-12-13
    老师,我对生效范围是全部work进程还不是很理解。
    这样问您:比如总共有10个模块被编译进了二进制文件,nginx启动时,先启动master进程,master进程然后启动多个work进程。
    这多个work进程的工作任务是同样的吗?或者他们分别负责不同的工作,比如第一个work负责前五个模块的工作,第二个work负责后五个的工作?

    作者回复: 每个worker进程是等效的,功能完全相同。多worker进程的意义在于使用多CPU,第5部分内容会详细介绍。由内核调度worker进程,决定把哪些连接交给哪个worker进程处理。

    
     4
  • Panda
    2018-12-22
    老师你好 WAF这种过滤规则在哪个阶段

    作者回复: 多数lua waf都是在access阶段工作的

    
     2
  • start
    2019-10-05
    老师,此节课的 rate这一块我从官网的理解是,rate=1r/s 表示1秒钟一个请求,rate=2r/m 表示一分钟以内每间隔30秒一个请求,意思就是在第一个请求发出以后的前面30秒是不能处理第二个请求的。官网的解释是:The rate is specified in requests per second (r/s). If a rate of less than one request per second is desired, it is specified in request per minute (r/m). For example, half-request per second is 30r/m.

    作者回复: 是的。源码实现如下:
    ms = (ngx_msec_int_t) (now - lr->last);
    excess = lr->excess - ctx->rate * ngx_abs(ms) / 1000 + 1000;
    if ((ngx_uint_t) excess > limit->burst) {return NGX_BUSY;}
    lr->last是上次发送时间
    }

    
     1
  • Robert小七
    2019-01-26
    感觉老师讲的很模糊,burst 和nodealy我听的不是很懂!我再网上查资料说,burst相当于一个缓存桶,当请求的数量过多时,第一个请求被处理,其他的请求放入缓存区,当缓存区达到上限时,则返回错误,我看老师你演示的时候 burst设置的为3,每分钟速率显示为2r/m,演示的时候第五次请求失败,和这个描述一致!但是老师却没有讲清楚burst和nodelay!

    作者回复: 你理解的正确,burst就是桶的大小!
    关于nodelay很抱歉,可能演示时漏掉了,它的意思是:不使用nodelay,burst中的请求会延迟处理,使用了nodealy,则立刻返回失败

     1
     1
  • Robert小七
    2019-01-26
    limit_conn_zone $binary_remote_addr zone=addr:10m;
      2 limit_req_zone $binary_remote_addr zone=one:10m rate=3r/m;
      3
      4 server {
      5 server_name location.hwenip.com;
      6 root html/;
      7 error_log logs/myerror.log info;
      8
      9 location / {
     10 limit_conn_status 500;
     11 limit_conn_log_level warn;
     12 #limit_rate 50;
     13 #limit_conn addr 1;
     14 limit_req zone=one burst=2 nodelay;
     15 #limit_req zone=one;
     16 }
     17 }
    老师,我的配置文件如上,为什么我第四次请求就会报503错误,感觉burst没有生效啊!
    展开

    作者回复: reload后,共享内存不会清空哦,所以之前的数据状态仍然会影响当前请求

    
     1
  • 风觉醒
    2019-01-06
    老师,如果没有配置limit_conn或者limit_req,nginx进程里面就不会创建slab共享内存吗?

    作者回复: nginx里大量使用到slab共享内存,不局限在limit_conn或者limit_req这两个模块。例如upstream里的zone指令,又比如openresty中的share_dict,又比如tls/ssl中的session缓存。

    
     1
  • 西奥叔叔
    2018-12-21
    老师您好,请问怎么获取post请求中的参数值呢,我想通过post请求参数进行限流。:-)

    作者回复: 根据请求中的body么? 这样不行,你没办法利用preaccess阶段的模块了,因为这些模块工作时,只能确保接收到完整的url参数和http header,是否接收到完整的body中的form完全无法保证

    
     1
  • vector_jin
    2020-01-12
    问下为什么用ip做key,这样是达不到限流的目的啊。另外每个ip都分配10m内存,不就很容易把内存用完了吗

    作者回复: 1、你可以根据变量,任意选择key。ip是从通用性角度,方便学习。如果你能从cookie等中找出username当然更好。
    2、不是每个ip 10m,而是所有限速共享10m

    
    
  • NEVER SETTLE
    2019-07-27
    老师,最近一直对限流这个设置很迷惑,这个到底限流算法到底是用的漏桶还是令牌桶。我实验了下,我设置是rate=50r/s,burst也设置是50。然后我写了工具,每秒向服务端发送55个请求,我看了下access日志,前几秒都是55,56,53,几秒之后一直稳定50,我有点琢磨不清,这背后的原理,请老师指点!
    
    
  • 韩健楚
    2019-05-31
    老师你好,我想请教一下,burst的设置值和rate的速度是什么关系比较好呢?有没有比较好的设置关系呢?比如 rata=60r/m , 那burst设置多少比较好?多谢。

    作者回复: 没有,这个是个性化,首要考虑业务场景的要求,其次是资源限制

    
    
  • soonshine
    2019-02-25
    老师,做了下limit_req的实验,如果配置2r/m的时候,不是说这一分钟前两个请求就是成功,后面的请求都503。看上去像是做了更优化的算法,前面30秒只会成功一次,后面30秒开始又会成功一次。比如配置30r/m,几乎就是一次成功一次503,间隔返回。
    
    
  • soooldier
    2019-01-06
    老师好,在视频中(3分24秒)提到设置了nodelay,burst的请求也会返回错误;但在演示中好像并没有返回错误。

    作者回复: 演示中添加burst=3后,又成功访问了3次,在第5分38秒时得到了503这个错误码。

    
    
  • 想个昵称好难
    2019-01-04
    老师,您好,有个地方想请教下您
    在视频5分钟作用的时候,您的配置文件是2r/m,然后用curl limit.taohui.tech连续发了2条请求,然后第二条请求返回503,为啥不是第三条返回503,第二条就503了呢?我的理解里面发第2条请求的时候是满足2r/m的

    作者回复: 可能是视频剪辑时剪辑掉啦,你的理解是对的:-)

    
    
  • jsw
    2018-12-20
    请问老师,限制请求和连接的ip是指tcp层的请求的ip吧,如果ngnix前面加了WAF和负载均衡,对这个有没有影响呢?

    作者回复: 不是哦,你可以再看一下第50课里的realip模块,这个ip可以不是tcp层中的remote ip,而是http request header中的xforwarded-for或者x-realip头部的内容

    
    
  • 王先统
    2018-12-19
    limit_**指令中的key究竟是什么意思呢?它和限制的数量有什么关系?比如说key是用户ip,limit_conn是2,就表示每个不同的用户只能同时有两个连接到服务器吗?

    作者回复: 是的

    
    
  • 路过
    2018-12-12
    老师,我同时启用了limit_conn,limit_req.配置如下:
    limit_conn_zone $binary_remote_addr zone=perip:10m;
        limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
        server {
            location / {
                    #limit_rate 1;
                    limit_req zone=one burst=5;
                    limit_req_log_level error;
                    limit_req_status 503;
                    limit_conn perip 1;
                    limit_conn_status 501;
                    limit_conn_log_level error;
                    root html;
                    index index.html;
            }
    测试报错结果是:
    2018/12/12 10:58:13 [error] 15572#0: *1195093 limiting requests, excess: 5.001 by zone "one", client: 192.168.30.66, server: localhost, request: "GET /index.html HTTP/1.0", host: "192.168.30.65"

    是不是说明limit_req先于limit_conn生效?谢谢!
    展开

    作者回复: 是的,请参看描述模块间顺序的那一页PPT,有一张图很形象的描述了这个问题!

    
    
我们在线,来聊聊吧