RTFM.WIKI

Ordnung muß sein. Ordnung über alles (18+)

Инструменты пользователя

Инструменты сайта


linux:nginx:nginx_limit_zone_and_limit_req

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 ошибку.

Обсуждение

Ваш комментарий. Вики-синтаксис разрешён:
 
linux/nginx/nginx_limit_zone_and_limit_req.txt · Последнее изменение: 2013/08/16 19:14 — 127.0.0.1