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

How to add limit_req zone for a particular location in nginx ingress

我有一个类似下面的入口

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 添加速率限制,我尝试了位置片段,但它在 /login/info 中创建了嵌套位置,结果 api给出 404,有什么方法可以做到这一点?

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

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

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

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

而不是使用 map,例如:

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

Sets parameters for a shared memory zone that will keep states for various keys. In particular, the state stores the current number of excessive requests. The key can contain text, variables, and their combination. Requests with an empty key value are not accounted.