Nginx. Ограничение нагрузки на сайт. limit_zone и limit_req
Источник - http://unixhome.org.ua/blog/doc/35.html
Nginx – вебсервер разработка которого направлена на работу с высокими нагрузками. Но не зависимо от возможностей nginx, когда нужно ограничить нагрузку на сайт/сервер. Соображения тут могут быть разные, во первых это препятствие любителям скачать весь сайт, а потом выложить его под другим именем, слабая конечно защита от этого, во вторых бывают пиковые, кратковременные нагрузки, ради которых расширять аппаратную часть сервера нет смысла.
В nginx есть два модуля ngx_http_limit_zone_module – предназначенный ограничивать число одновременных соединений с сервером и ngx_http_limit_req_module – он нужен для ограничения числа запросов за единицу времени. Большой плюс этих модулей в том, что они направлены на конкретный адрес, то есть ограничивают соединения или число запросов только для каждого ip адреса.
Ограничение числа одновременных соединений(закачек) нужно там, где скачиваются большие файлы(фильмы, образы, картинки). Настройка состоит из двух частей. Сначала в секции http описывается директива limit_zone, это описывается хеш (зона) для хранения состояния соединений, сессий. Далее уже в location или для всего виртуалхоста описывается число допустимых соединений c помощью limit_conn.
В конфиге nginx.conf настройка выглядит так:
user www; worker_processes 2; pid /var/run/nginx.pid; events { use kqueue; worker_connections 1024; multi_accept on; } http { include mime.types; default_type application/octet-stream; large_client_header_buffers 4 4k; tcp_nopush on; sendfile on; output_buffers 32 512k; sendfile_max_chunk 128k; postpone_output 1460; tcp_nodelay on; limit_zone lconn $binary_remote_addr 10m; fastcgi_intercept_errors on; server_names_hash_bucket_size 64; client_max_body_size 15m; server { listen 89.252.34.107; server_name hilik.org.ua www.hilik.org.ua; limit_conn lconn 1; location / { root /usr/local/www/hilik.org.ua; index index.html index.htm; } } }
В этом примере, мы ограничили число одновременных закачек(соединений) для всего виртуального хоста hilik.org.ua.
Настройка limit_req очень похожа на limit_zone. Точно так же, настраивается зона (limit_req_zone) для хранения состояния сессий, состояние сессий так же базируется на ip адресе с которого пришел запрос и так же вносятся ограничения в виртуал хост или в location с помощью limit_req.
В конфиге настройка выглядит так:
<pre lang="bash"> user www; worker_processes 2; pid /var/run/nginx.pid; events { use kqueue; worker_connections 1024; multi_accept on; } http { include mime.types; default_type application/octet-stream; large_client_header_buffers 4 4k; tcp_nopush on; sendfile on; output_buffers 32 512k; sendfile_max_chunk 128k; postpone_output 1460; tcp_nodelay on; #Зона для учета запросов limit_req_zone $binary_remote_addr zone=lreq:10m rate=2r/s; fastcgi_intercept_errors on; server_names_hash_bucket_size 64; client_max_body_size 15m; server { listen 89.252.34.107; server_name hilik.org.ua www.hilik.org.ua; #Вносим ограничение limit_req zone=lreq burst=4; location / { root /usr/local/www/hilik.org.ua; index index.html index.htm; } } }
В limit_req присутствует пареметр burst – этот параметр определяет максимальное, кратковременное превышение лимита. При этом для дальнейшиг запросов с превысившего лимит ip адреса будет пересчитано число запросов и выровняно в определенный лимит. Ну в общем если в 1 секунду пришло с адреса 4 запроса то в следующую секунду не будет обработано ни одного запроса. Пока не вернется число запросов в секунду в нормальный лимит.
При превышении лимитов, как limit_zone так и limit_req_zone, nginx возвращает 503 ошибку.
Обсуждение