在咱们的比如中,行列中的第20个数据包等候2秒钟被转发,此时对其的响应可能对客户端不再有用。 要解决这种状况,请将nodelay参数与burst参数一同增加:
通过nodelay参数,Nginx仍然根据burst参数在行列中分配时隙,而且强加装备的速率约束,可是不扫除转发排队的恳求。 相反,当恳求抵达“太快”时,Nginx会当即转发,只要行列中有一个可用的时隙。 它将该插槽标记为“已占用”,而且不会将其开释以供其他恳求运用,直到通过恰当的时刻(在本例中为100毫秒之后)。
假定像以前相同,20个时隙的行列是空的,21个恳求一同从给定的IP地址抵达。 Nginx当即转发一切21个恳求,并将行列中的20个插槽标记为已占用,然后每100毫秒开释1个插槽(假如有25个恳求,Nginx会当即转发21个插槽,标记20个插槽,回绝4个恳求状况503 )。
现在假定在第一组恳求之后101毫秒被转发,别的20个恳求一同抵达。 行列中只有1个插槽被开释,所以Nginx转发1个恳求,并回绝其他19个状况为503的行列。 假如在20个新恳求抵达之前通过了501毫秒,那么5个空闲空间,所以Nginx当即转发5个恳求,回绝15个恳求。
作用相当于每秒10个恳求的速率约束。 假如您希望在不约束恳求之间的答应距离的状况下施加速率约束,则nodelay选项非常有用。
留意:对于大多数布置,咱们建议将burst和nodelay参数包括到limit_req指令中。
高级装备示例
通过将根本速率约束与其他Nginx功能相结合,您能够实现更多细微的流量约束。
白名单
此示例显示怎么对不在“白名单”上的任何人的恳求施加速率约束。
这个比如运用了geo和map指令。 geo块为白名单中的IP地址分配一个0值到$limit值,其他0 1 。 然后,咱们运用地图将这些值转换为一个密钥,以便:
假如$limit是0,$limit_key设置为空字符串。
假如$limit是1,则$limit_key以二进制格式设置为客户端的IP地址。
把两者放在一同,$limit_key被设置为白名单IP地址的空字符串,否则设置为客户端的IP地址。 当limit_req_zone目录(密钥)的第一个参数为空字符串时,约束不适用,因而列入白名单的IP地址(在10.0.0.0/8和192.168.0.0/24子网中)不受约束。 一切其他IP地址每秒约束为5个恳求。
limit_req指令将约束使用于/方位,而且答应在装备的约束上突发多达10个分组而没有转发推迟
在一个方位包括多个limit_req指令
您能够在一个方位包括多个limit_req指令。 一切与给定恳求匹配的约束都被使用,这意味着运用最严格的约束。 例如,假如多于一个指令施加推迟,则运用最长的推迟。 相同,假如这是任何指令的影响,即使其他指令答应它们通过,恳求也会被回绝。