Ограничение скорости с Nginx
На этой странице
- 1 Использование модуля HttpLimitReqModule
- 2 ссылки
В этой статье объясняется, как использовать HttpLimitReqModule nginx для ограничения количества запросов для данного сеанса. Это полезно, например, если ваш сайт забит ботом, выполняющим несколько запросов в секунду и, таким образом, увеличивающим нагрузку на ваш сервер. С помощью HttpLimitReqModule вы можете определить ограничение скорости, и если посетитель превысит эту скорость, он получит ошибку 503.
1 Использование HttpLimitReqModule
Откройте ваш nginx.conf...
nano /etc/nginx/nginx.conf
... и определите область, в которой хранятся состояния сеанса - это должно находиться внутри контейнера http {}:
http { [...] limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s; [...] }
Эта область называется единицей и ей выделено 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=один пакет=5; указывает, что это ограничение скорости принадлежит области хранения сеанса, которую мы определили ранее (поскольку zone=one), что означает ограничение скорости 1r/s. Вы можете представить себе значение параметра Burst как некой очереди. Это означает, что если вы превысите ограничение скорости, следующие запросы будут задержаны, и только если у вас будет больше запросов в очереди, чем указано в параметре Burst, вы получите ошибку 503 (например, так:
).
Если вы не хотите использовать эту очередь (т. е. немедленно доставить 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, чтобы изменения вступили в силу:
systemctl nginx reload
2 ссылки
- nginx: https://nginx.org/
- HttpLimitReqModule: