Так как limit_req_zone
должен быть указан в контексте HTTP и не может быть в server
или даже в location
В контексте кажется, что можно установить ограничение скорости только для всего сервера.
Nginx используется для обслуживания статических файлов, и это можно делать сколько угодно раз. Однако /api/...
Путь передается серверу приложений через прокси и не должен подвергаться атаке DoS. Как я могу настроить Nginx только на ограничение скорости API?
Первый аргумент limit_req_zone
является ключом к сохранению состояния. В документация говорит нам:
Запросы с пустым значением ключа не учитываются.
Чтобы ограничить скорость только для определенных частей сайта, нам нужно сделать так, чтобы у этих частей был непустой ключ. Мы можем сделать это, сопоставив /api/...
Пространство URI для удаленного IP-адреса и сопоставление всего остального с пустым ключом:
http {
[the rest of your configuration]
map $uri $apicall {
default "";
~api $binary_remote_addr;
}
limit_req_zone $apicall zone=mylimit:100m rate=10r/s;
}
Обратите внимание, что мы используем $binary_remote_addr
как объяснено в их сообщение в блоге, ограничивающее скорость.