基于 nginx-ingress 上的 HTTP header 值的速率限制请求
Rate limit requests based on HTTP header value on nginx-ingress
是否可以根据 nginx-ingress 上的 HTTP header 值对请求进行速率限制?
是的,您可以通过使用包含 'limit_req_zone' 指令的自定义模板创建 ConfigMap 文件来实现,如自定义注释使用的官方 NGINX Ingress 示例所示 here.
您应该将 key/variable 指定为 limit_req_zone 指令,例如:
limit_req_zone $http_authorization_key ...
其中$http_authorization_key变量对应'Authorization-Key'请求头字段*
*变量名的最后部分是将字段名转换为小写,破折号替换为下划线(来自NGINX官方doc)
因为我没有来自 nginxinc 的 kubernetes nginx ingress,所以这里建议的解决方案不起作用。
设法通过 configmap 和注释调整来做到这一点。
配置图:
kind: ConfigMap
apiVersion: v1
metadata:
name: nginx-configuration
namespace: ingress-nginx
labels:
app: nginx-ingress
chart: nginx-ingress-1.33.0-dev
release: nginx-ingress
data:
http-snippet: |
limit_req_zone $http_authorization zone=my-zone:20m rate=5r/s;
limit_req_zone $binary_remote_addr zone=my-zone:20m rate=10r/s;
limit_req_zone $http_someheader zone=my-zone:20m rate=20r/s;
入口资源中的注释:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/configuration-snippet: |
limit_req zone=my-zone-1 burst=10 nodelay;
limit_req_log_level notice;
limit_req_status 429;
注意:http-snippet 不允许作为注释!
一个入口定义的不同位置的不同节流示例:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/server-snippet: |
location /content/images/ {
limit_req zone=my-zone-2 burst=50 nodelay;
}
location /content/texts/ {
limit_req zone=my-zone-3 burst=50 nodelay;
}
nginx.ingress.kubernetes.io/configuration-snippet: |
limit_req zone=my-zone-1 burst=10 nodelay;
limit_req_log_level notice;
limit_req_status 429;
请注意,在 server-snippet 注释中定义位置不允许您在 ingress[=13 中进一步定义它=]
是否可以根据 nginx-ingress 上的 HTTP header 值对请求进行速率限制?
是的,您可以通过使用包含 'limit_req_zone' 指令的自定义模板创建 ConfigMap 文件来实现,如自定义注释使用的官方 NGINX Ingress 示例所示 here.
您应该将 key/variable 指定为 limit_req_zone 指令,例如:
limit_req_zone $http_authorization_key ...
其中$http_authorization_key变量对应'Authorization-Key'请求头字段*
*变量名的最后部分是将字段名转换为小写,破折号替换为下划线(来自NGINX官方doc)
因为我没有来自 nginxinc 的 kubernetes nginx ingress,所以这里建议的解决方案不起作用。
设法通过 configmap 和注释调整来做到这一点。
配置图:
kind: ConfigMap
apiVersion: v1
metadata:
name: nginx-configuration
namespace: ingress-nginx
labels:
app: nginx-ingress
chart: nginx-ingress-1.33.0-dev
release: nginx-ingress
data:
http-snippet: |
limit_req_zone $http_authorization zone=my-zone:20m rate=5r/s;
limit_req_zone $binary_remote_addr zone=my-zone:20m rate=10r/s;
limit_req_zone $http_someheader zone=my-zone:20m rate=20r/s;
入口资源中的注释:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/configuration-snippet: |
limit_req zone=my-zone-1 burst=10 nodelay;
limit_req_log_level notice;
limit_req_status 429;
注意:http-snippet 不允许作为注释!
一个入口定义的不同位置的不同节流示例:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/server-snippet: |
location /content/images/ {
limit_req zone=my-zone-2 burst=50 nodelay;
}
location /content/texts/ {
limit_req zone=my-zone-3 burst=50 nodelay;
}
nginx.ingress.kubernetes.io/configuration-snippet: |
limit_req zone=my-zone-1 burst=10 nodelay;
limit_req_log_level notice;
limit_req_status 429;
请注意,在 server-snippet 注释中定义位置不允许您在 ingress[=13 中进一步定义它=]