Nginx · 2 min read · Jan 23, 2026

Ограничение скорости с помощью nginx

Эта статья объясняет, как использовать модуль HttpLimitReqModule в nginx для ограничения количества запросов для данной сессии. Это полезно, например, если ваш сайт подвергается атаке бота, который делает несколько запросов в секунду, тем самым увеличивая нагрузку на ваш сервер. С помощью модуля ngx_http_limit_req_module вы можете определить ограничение скорости, и если посетитель превышает это ограничение, он получит ошибку 503.

1 Использование HttpLimitReqModule (ngx_http_limit_req_module)

Откройте ваш nginx.conf…

nano /etc/nginx/nginx.conf

… и определите область, где хранятся состояния сессий - это должно находиться внутри контейнера http {}:

http {
    [...]
    limit_req_zone  $binary_remote_addr  zone=one:10m   rate=1r/s;
    [...]
}

Эта область называется one и выделяет 10 МБ памяти. Вместо переменной $remote_addr мы используем переменную $binary_remote_addr, которая уменьшает размер состояния до 64 байт. В 1 МБ зоне может быть около 16,000 состояний, поэтому 10 МБ позволяют хранить около 160,000 состояний, что должно быть достаточно для ваших посетителей. Ограничение скорости составляет один запрос в секунду. Обратите внимание, что здесь необходимо использовать целые значения, поэтому, если вы хотите установить лимит на ползапроса в секунду, вам нужно использовать 30r/m (30 запросов в минуту).

Чтобы применить это ограничение, мы используем директиву limit_req. Вы можете использовать эту директиву в контейнерах http {}, server {}, и location {}, но, на мой взгляд, она наиболее полезна в контейнерах location {}, которые передают запросы на ваши серверы приложений (PHP-FPM, mongrel и т.д.), потому что в противном случае, если вы загружаете одну страницу с множеством изображений, CSS и JavaScript файлов, вы, вероятно, превысите данное ограничение скорости с одним запросом страницы.

Итак, давайте поместим это в контейнер location ~ .php$ {}:

[...]
        location ~ \.php$ {
                try_files $uri =404;
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                fastcgi_pass unix:/var/run/php5-fpm.sock;
                fastcgi_index index.php;
                include fastcgi_params;
                limit_req zone=one burst=5;
        }
[...]

limit_req zone=one burst=5; указывает, что это ограничение скорости принадлежит области хранения сессий, которую мы определили ранее (из-за zone=one), что означает, что ограничение скорости составляет 1r/s. Вы можете представить себе значение burst как своего рода очередь. Это означает, что если вы превышаете ограничение скорости, последующие запросы задерживаются, и только если у вас в очереди больше ожидающих запросов, чем указано в параметре burst, вы получите ошибку 503 (например, как это:

Примененное ограничение скорости Nginx.

).

Если вы не хотите использовать эту очередь (т.е. немедленно выдавать 503, если кто-то превышает ограничение скорости), вам нужно использовать опцию nodelay:

[...]
        location ~ \.php$ {
                try_files $uri =404;
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                fastcgi_pass unix:/var/run/php5-fpm.sock;
                fastcgi_index index.php;
                include fastcgi_params;
                limit_req zone=one burst=5 nodelay;
        }
[...]

Не забудьте перезагрузить nginx, чтобы ваши изменения вступили в силу:

service nginx reload

2 Ссылки

Об авторе

Фалко Тимме является владельцем Timme Hosting (ультра-быстрый веб-хостинг на nginx). Он является ведущим куратором HowtoForge (с 2005 года) и одним из основных разработчиков ISPConfig (с 2000 года). Он также внес вклад в книгу O’Reilly “Администрирование систем Linux”.

Share: X/Twitter LinkedIn

Get new posts in your inbox

No spam. Unsubscribe anytime.