作者回复: limit_req不能在if中使用,你可以先在if中rewrite到@location中,在这个location中再limit_req
作者回复: 是的。源码实现如下: 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是上次发送时间 }
作者回复: 每个worker进程是等效的,功能完全相同。多worker进程的意义在于使用多CPU,第5部分内容会详细介绍。由内核调度worker进程,决定把哪些连接交给哪个worker进程处理。
作者回复: 多数lua waf都是在access阶段工作的
作者回复: nginx里大量使用到slab共享内存,不局限在limit_conn或者limit_req这两个模块。例如upstream里的zone指令,又比如openresty中的share_dict,又比如tls/ssl中的session缓存。
作者回复: 如果第1秒发请求1,那么不加burst时,只有在第31秒发请求2才可以,因为没有burst桶,如果转发请求2会导致固定的出速率不再符合要求。一般都要加burst的,而且还会加delay,这样可以降低请求时延
作者回复: 你理解的正确,burst就是桶的大小! 关于nodelay很抱歉,可能演示时漏掉了,它的意思是:不使用nodelay,burst中的请求会延迟处理,使用了nodealy,则立刻返回失败
作者回复: reload后,共享内存不会清空哦,所以之前的数据状态仍然会影响当前请求
作者回复: 可能是视频剪辑时剪辑掉啦,你的理解是对的:-)
作者回复: 根据请求中的body么? 这样不行,你没办法利用preaccess阶段的模块了,因为这些模块工作时,只能确保接收到完整的url参数和http header,是否接收到完整的body中的form完全无法保证