HttpLimitReqModul 为 nginx 官方自带的限制单位时间内请求次数的功能模块,通过limit_req_zone和limit_req命令配合使用来达到限制。一旦对应的累计连接超过指定数量,就会返回 503 错误。
可以利用该规则对 IP 和 URL 进行访问频率的限制。
- limit_conn_zone 定义 IP 或 url 访问的频率限制规则
只能配置在 http{}- limit_conn 启用对应的规则
可以配置于 http{},server{},location{}
1 |
limit_req_zone $binary_remote_addr zone=ip_second:10m rate=10r/s; |
int x=0
中的 intzone=ip_second:10m rate=10r/s
相当于zone=限制规则变量名:内存占用上限 频率=次数r/秒
rate=10r/s
这十个请求平均分配在 1 秒内,也就是 100ms 最多能通过一次请求,而不是前面 100ms 接收 10 次,后面才不能接收。当 limit_req 设置后,对应的 limit_req_zone 规则才会生效,而且只在 limit_req 声明的范围内生效
1 |
limit_req zone=限制规则变量名 burst=5 nodelay; |
将此命令放在 http{} 层,紧接着 limit_req_zone 之后
将此命令放在 server{} 或 location{} 层,则在此之外的层级不受影响,还可以在不同的层级设置不同的规则
1 |
server{ |
burst 代表令牌数量,至少要为 1,即可以在 limit_req_zone 规则的基础上,额外可以请求的数量。
令牌消耗后,以 limit_req_zone 定义的时间单位恢复。
只能控制 秒(rate=100r/s)和 分钟(rate=100r/m)级别
多个限制时,只要有一个符合条件,就会触发限制
1 |
http { |
一秒内请求 100 次
只会有 51 个成功,rate=10r/m
代表一分钟 10 个请求,系统会默认把这十个请求平均分配在 60 秒内,即 6 秒一个请求,所以 1 秒内,只能用掉这里的 1 个名额,剩下 50 个名额用的是burst=50
令牌的名额。
自定义限制规则生效后的返回码
1 |
http { |