作者回复: limit_req不能在if中使用,你可以先在if中rewrite到@location中,在这个location中再limit_req
作者回复: 每个worker进程是等效的,功能完全相同。多worker进程的意义在于使用多CPU,第5部分内容会详细介绍。由内核调度worker进程,决定把哪些连接交给哪个worker进程处理。
作者回复: 多数lua waf都是在access阶段工作的
作者回复: 是的。源码实现如下:
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是上次发送时间
}
作者回复: 你理解的正确,burst就是桶的大小!
关于nodelay很抱歉,可能演示时漏掉了,它的意思是:不使用nodelay,burst中的请求会延迟处理,使用了nodealy,则立刻返回失败
作者回复: reload后,共享内存不会清空哦,所以之前的数据状态仍然会影响当前请求
作者回复: nginx里大量使用到slab共享内存,不局限在limit_conn或者limit_req这两个模块。例如upstream里的zone指令,又比如openresty中的share_dict,又比如tls/ssl中的session缓存。
作者回复: 根据请求中的body么? 这样不行,你没办法利用preaccess阶段的模块了,因为这些模块工作时,只能确保接收到完整的url参数和http header,是否接收到完整的body中的form完全无法保证
作者回复: 没有,这个是个性化,首要考虑业务场景的要求,其次是资源限制
作者回复: 演示中添加burst=3后,又成功访问了3次,在第5分38秒时得到了503这个错误码。
作者回复: 可能是视频剪辑时剪辑掉啦,你的理解是对的:-)
作者回复: 不是哦,你可以再看一下第50课里的realip模块,这个ip可以不是tcp层中的remote ip,而是http request header中的xforwarded-for或者x-realip头部的内容
作者回复: 是的
作者回复: 是的,请参看描述模块间顺序的那一页PPT,有一张图很形象的描述了这个问题!