通过Nginx可以实现访问流量控制, 主要使用3个模块

  • geo 和 map 模块相结合来定义哪些ip需要流控,哪些不需要, 因为一些内部的访问和信任域的访问如果也加了流控限制可能会误伤,所以可以通过geo 模块把需要流控的IP地址段分开,通过map 映射到不同的变量上
  • ngx_http_limit_req_module 来实现具体的流控
    • http 中使用  limit_req_zone  来设置流控的zone 和 限流的速率, 这里只是设置策略
    • location server 中使用 limit_req  来应用这个 zone 已达到限流的目的 , 另外 limit_req 还可以使用 burst 来应对突发流量

具体配置示例如下

### 使用geo设置哪些地址不受限制
# 对于内网设置变量limit为0, 其他默认为1
geo $limit {
    default 1;
    10.0.0.0/8 0;
    192.168.0.0/24 0;
}

### 使用map来映射流控的变量
# 如果limit是0, 设置limit_key为空,就不会有流控;
# 如果为1, 设置limit_key为$binary_remote_addr,$binary_remote_addr是IP地址的二进制存储方式,相对于节省内存
map $limit $limit_key {
    0 "";
    1 $binary_remote_addr;
}

# 定义了一个zone为req_zone的zone, 大小为10m, 速率为5个请求每秒
limit_req_zone $limit_key zone=req_zone:10m rate=5r/s;
 
server {
    location / {
        # 应用req_zone, 并设置突发burst为10, 不延迟
        limit_req zone=req_zone burst=10 nodelay;
 
        # ...
    }
}
CODE


参考文章: Nginx官方博客 Nginx Rate Limiting