«Правильне» обмеження швидкості в Nginx. Міф чи реальність?

Ось вже багато років користувачів Nginx мучить одне і те ж питання: «Як можна обмежити швидкість в цілому для IP адреси незалежно від числа сесій (з'єднань)? Чому Nginx цього не вміє? Чому розробники Nginx так вперто не хочуть реалізувати цей простий функціонал? »І відповісти мені їм нема чого, про що думають розробники Nginx — не зрозуміло і відомо, напевно, тільки господу богу.
 
Боротися з цим можна по різному, хтось використовує скрипти на подобу htb.init , хтось пише скрипти шейпінгу самостійно і ділиться вдалим досвідом на Хабре , а деякі й зовсім використовують PHP для обмеження швидкості віддачі файлів. Тільки уявіть собі, яким буде оверхед і витрата пам'яті, при використанні PHP в подібних цілях.
 
На даний момент Nginx не вміє обмежувати швидкість для IP і робить це тільки в рамках окремих сесій. Що це означає? Якщо адміністратор встановив в конфіги обмеження швидкості в 200 КБ / сек, то створивши 10 з'єднань з сервером можна отримати швидкість в 2000 КБ / сек, що ніяк не вписується в плани адміністратора. Досягти бажаного засобами самого Nginx можна лише встановивши ліміт, наприклад
 
 
http {
    limit_conn_zone  $binary_remote_addr  zone=perip:10m;
    server {
        location /download/ {
            limit_conn  perip  1;
        }
    }
}

який не дасть створити більш 1-го з'єднання з окремо взятого IP адреси. Однак на практиці використання такого обмеження на сервері має мало сенсу, адже за однією IP адресою можуть ховатися тисячі користувачів, а при нестабільному мережевому підключенні користувач взагалі ризикує не отримати доступ до файлу.
 
Але, як виявилося, не все так похмуро і вихід із ситуації є. Це простий маленький модуль від yaoweibin під назвою nginx_limit_speed_module . Давайте розглянемо як працює цей модуль:
 
 
http {
    limit_speed_zone  one  $binary_remote_addr  10m;
    server {
        location /download/ {
            limit_speed  one  100k;
        }
    }
}

Директива limit_speed задає сумарну швидкість для всіх підключень з однієї IP адреси. Наприклад, якщо встановлено ліміт швидкості в 100KB, а користувач при цьому качає файл в 10 потоків, то швидкість скачування для кожного окремо взятого потоку складе 10KB (100KB/10). Зауважте, це без всяких танців з шейпінгом в Linux і збочень з використанням PHP. Зручно, просто і зрозуміло. На мій погляд саме так і повинно бути, але чомусь цього до цих порт немає в Nginx «з коробки» за що мені хотілося б кинути великий такий камінчик у город Nginx.
 
Для складання Nginx з цим чудовим модулем досить додати в параметри. / Configure такий запис:
  
 
--add-module=/путь до папки с модулем/nginx_limit_speed_module

 
Наприклад:
 
 
./configure --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_stub_status_module --with-http_auth_request_module --with-file-aio --with-ipv6 --with-http_spdy_module --add-module=/root/nginx_limit_speed_module --with-cc-opt='-O2 -g -pipe -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic'

 
Докладно зупинятися на складанні Nginx я не буду, на цьому тему вже написано чимало статей. В якості короткого керівництва по збірці можна використовувати цю інструкцію .
 
Сторінка модуля на GitHub: https://github.com/yaoweibin/nginx_limit_speed_module

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.