Я пытаюсь настроить параметр ограничения скорости limit_req
для определенного пути в Kubernetes ingress-nginx, чтобы предотвратить грубую аутентификацию.
Я определил limit_req_zone
, используя ConfigMap:
http-snippet: |
limit_req_zone $the_real_ip zone=authentication_ratelimit:10m rate=1r/s;
Далее я использую аннотацию для добавления пользовательского блока местоположения:
nginx.ingress.kubernetes.io/configuration-snippet: |
location ~* "^/authenticate$" {
limit_req zone=authentication_ratelimit nodelay;
more_set_headers "x-test: matched";
}
В результате получается nginx.conf:
server {
# - - 8< - -
location / {
# - - 8< - -
location ~* "^/authenticate$" {
limit_req zone=authentication_ratelimit nodelay;
more_set_headers "x-test: matched";
}
proxy_pass http://upstream_balancer;
proxy_redirect off;
}
В результате /authenticate
всегда возвращает HTTP 503 (с заголовком x-test). Сообщение из журналов входного доступа:
<ip> - [<ip>] - - [04/Jan/2019:15:22:07 +0000] "POST /authenticate HTTP/2.0" 503 197 "-" "curl/7.54.0" 172 0.000 [-] - - - - 1a63c9825c9795be1378b2547e29992d
Я подозреваю, что это может быть связано с конфликтом между вложенным блоком местоположения и proxy_pass
(но это только дикое предположение).
Какие еще варианты я пробовал?
- использовать
server-snippet
аннотацию вместо configuration-snippet
- /authenticate
возвращает 404, поскольку proxy_pass
не настроено
- use
nginx.ingress.kubernetes.io/limit-rpm
annotation - вызывает ограничение скорости для всего приложения, что не то, что я хочу.
Вопрос: почему пользовательский блок местоположения отвечает 503? Как я могу отладить это? Будет ли повышение уровня ведения журнала nginx давать более подробную информацию о 503?
Или более общий вопрос: могу ли я добавить пользовательские блоки местоположения в ingress-nginx?