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

Как настроить Nginx для ограничения скорости только API, а не статических файлов?

Так как 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 как объяснено в их сообщение в блоге, ограничивающее скорость.