Назад | Перейти на главную страницу

Другой limit_req для части $ request_uri

Я хочу настроить другое ограничение скорости для php-fpm.

Я бы хотел:

  1. статические файлы не имеют ограничений,
  2. PHP-запросы имеют ограничения,
  3. PHP-запросы к / admin /.+ были разные пределы.

У меня проблема с точкой реализации 3. Сейчас тестирую:

limit_req_zone $binary_remote_addr zone=php:10m rate=2r/s;
limit_req_zone $binary_remote_addr zone=admin:10m rate=9r/s;

server {
    location / {
        try_files $uri $uri/ /index.php?$args;
    }
    limit_req_status 429;
# limitng works, server return 404
    location ~ /admin/ {limit_req zone=admin...}

    location ~ [^/]\.php(/|$) {
        limit_req zone=php burst=9 delay=4;
#limit_req not allowed here
        if($request_uri ~ /admin) {limit_req zone=admin...}
#not update limits (lower)
        location ~ ^/admin/ {limit_req zone=admin...}
#negative matching returns index.php content
        location location ~ ^/(?!(admin)) {limit_req zone=php...}
    }
}

Также является limit_req_zone $request_uri но если я понимаю, это создает разные пулы для /admin/1 и /admin/2.

// обновление 1:

Мне нужны разные пулы для запроса, например: /index.php?/.* и менее строгий для /index.php?/admin/.*

В соответствии с документация limit_req разрешен только в http, server, location.

Я бы предложил исключить 1 и 2 и иметь общее местоположение с той же политикой, что и для / и admin:

server {
listen 127.0.0.1:8088;
location / {
content_by_lua_block {
    ngx.say("root")
    ngx.exit(ngx.HTTP_OK)

}
}
location ~* .(jpg|jpeg|gif|png|ico|css|bmp|swf|js|html|txt)$ {
content_by_lua_block {
    ngx.say("static")
    ngx.exit(ngx.HTTP_OK)

}
}
location ~* "^\/admin($|\/(.*)$)" {
content_by_lua_block {
    ngx.say("processed by php with first ratelimit")
    ngx.exit(ngx.HTTP_OK)

}
}
location ~* "\.php$" {
content_by_lua_block {
    ngx.say("processed by php with second ratelimit")
    ngx.exit(ngx.HTTP_OK)

}
}
}

И тесты:

# curl 127.0.0.1:8088/admin
processed by php with first ratelimit
# curl 127.0.0.1:8088/admin.php
processed by php with second ratelimit
# curl 127.0.0.1:8088/admin/
processed by php with first ratelimit
# curl 127.0.0.1:8088/admin/test.php
processed by php with first ratelimit
# curl 127.0.0.1:8088/test/php
root