Я хочу настроить другое ограничение скорости для php-fpm.
Я бы хотел:
/ 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