如何为 nginx 入口中的特定位置添加 limit_req 区域

问题描述

我有一个类似于下面的入口

apiVersion: extensions/v1beta1
kind: Ingress
Metadata:
  name: staging-ingress-rules-login
  annotations:
    kubernetes.io/ingress.class: 'Nginx'
    Nginx.ingress.kubernetes.io/proxy-body-size: '0'
spec:
  rules:
  - host: staging.mysite.com
    http:
      paths:
      - path: /
        backend:
          serviceName: login
          servicePort: 80
      - path: /login/info
        backend:
          serviceName: login
          servicePort: 80

Nginx.conf 是这样的

server { 
 location / {
   ---------
   ---------
}

location /login/info {
  ---------
  -------
}

} 

我想为位置/login.info 添加速率限制,我尝试了location-snippet,但它在/login/info 中创建了嵌套位置,这个api 的结果是404,有什么办法可以做到这一点?

解决方法

这是一个社区 wiki 答案,您可以随意编辑和扩展它。

由于我们缺少有关您的配置的一些详细信息,我将向您解释一般情况下如何处理此问题。

您可以使用以下注释来添加自定义位置块:

nginx.ingress.kubernetes.io/configuration-snippet: |
  limit_req zone=authentication_ratelimit nodelay;

然后使用地图,例如:

http-snippets: |
  map $uri $with_limit_req {
    default 0;
    "~*^/authenticate$" 1;
  }
  map $with_limit_req $auth_limit_req_key {
    default '';
    '1'     $binary_remote_addr; # the limit key
  }
  limit_req_zone $auth_limit_req_key zone=authentication_ratelimit:10m rate=1r/s;

Notice that

Syntax:   limit_req_zone key zone=name:size rate=rate [sync];
Default:  —
Context:  http

为共享内存区域设置参数,该区域将保持状态 各种键。特别地,状态存储当前的数量 过分的要求。键可以包含文本、变量及其 组合。不考虑具有空键值的请求。