暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Ingress Nginx限流

487



Hi~朋友,关注置顶防止错过消息


为什么需要限流

为了防止接口被恶意请求,我们可以在Ingress Nginx网关上增加一个限流。

Nginx的限流

Nginx中的限流模块主要使用limit_req指令实现。

Nginx限流配置

1. 首先我们需要在http模块中使用limitreqzone定义一个共享内存区域,该共享内存区域记录了限流key的访问频率:

  1. http {

  2. limit_req_zone $binary_remote_addr zone=ip_limit:10m rate=5r/s;

  3. }

  • zone=iplimit:10m,指定了共享内存区域的名称为iplimit,并为其分配10MB的内存空间

  • rate:rate参数用来指定请求速率,上述示例中限速每秒钟5次

  • $binaryremoteaddr:这里指定限流的key是客户端的IP地址二进制表现形式,如果是IP+uri的形式后面可以再跟上$uri

 2. 使用limit_req指令为location配置具体的请求限制:

  1. location {

  2. limit_req zone=ip_limit burst=5 nodelay;

  3. }

  • zone:指定了使用的共享内存区域的名称

  • burst:指定了在超过指定速率限制以后允许的1s内最大突发请求次数,该参数受nodelay参数的影响

  • nodelay:该参数有两个值off和on,默认为off,表示启用延迟模式,该模式下burst参数会生效,如果修改为on表示禁用延迟模式,一旦超过速率限制,请求会被立即拒绝

Kubernetes Nginx中限流配置

 1. 在Ingress Nginx的ingress-nginx-controller中定义共享内存区域:

  1. kind: ConfigMap

  2. apiVersion: v1

  3. metadata:

  4. name: ingress-nginx-controller

  5. namespace: ingress-nginx

  6. ...

  7. data:

  8. ...

  9. http-snippet: |

  10. limit_req_zone $binary_remote_addr$uri zone=ip_uri_limit:10m rate=10r/s;

  11. ...

 2. 在相应的ingress中配置使用 nginx.ingress.kubernetes.io/configuration-snippet注解指定limit_req

  1. kind: Ingress

  2. apiVersion: networking.k8s.io/v1

  3. metadata:

  4. name: xxxx

  5. annotations:

  6. .....

  7. nginx.ingress.kubernetes.io/configuration-snippet: |

  8. limit_req zone=ip_uri_limit burst=10 nodelay;

  9. spec:

  10. ingressClassName: nginx

  11. tls:

  12. ...

  13. rules:

  14. - host: xxx

  15. ....

测试和监控

测试工具我使用的wrk压测工具,它可以同时并发的向我们的网关发送请求。

上线限流规则以后一定要注意监控,默认的触发限流nginx会返回503错误,一定要注意限流参数的设置,防止误触。

对于更高级别的防护大家可以考虑使用WAF产品,WAF本人也不熟悉,就暂时不过多叙述。


文章转载自程序员修炼笔记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论