Поиск по сайту:

Ограничение скорости с Nginx


На этой странице

  1. 1 Использование модуля HttpLimitReqModule
  2.  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: