Есть в одном блоке location описать и кэш и limit_req, то лимит будет срабатывать на кэшированные запросы.
Чтобы этого избежать советуют limit_req "выкинуть" в отдельный сервер и в него пересылать из сервера с кэшем.
Однако при такой схеме у меня не работает лимитирование запросов.
example.com:443 (с кэшем) -> 127.0.0.1:8080 (с лимитером) -> 10.1.1.2 бэкэнд
Конфиг
http {
limit_req_zone $server_name zone=b:10m rate=1r/m;
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=custom_cache:50m;
server {
server_name example.com;
listen 443 ssl;
location = /Status{
proxy_pass http://127.0.0.1:8080;
proxy_set_header X-Real-IP $remote_addr;
proxy_cache custom_cache;
proxy_cache_valid any 3m;
proxy_cache_methods POST;
proxy_cache_key "$host$request_uri|$request_body";
add_header X-Cached $upstream_cache_status;
include includes/allowlist.include;
deny all;
}
}
server {
listen 127.0.0.1:8080;
location = /Status{
proxy_pass http://10.1.1.2;
limit_req_status 429;
limit_req zone=b burst=3;
}
}
server {
if ($host = example.com) {
return 301 https://$host$request_uri;
} # managed by Certbot
server_name example.com;
listen 80;
return 404;
}
}