Стабілізовуємо навантаження на вебсервер з IPTABLES

Ніколи не варто бути категоричним, особливо в айті індустрії. Тому дана тема не претендує на автентичність і точність, чи відповідність дійсності взагалі. Дана публікація базується виключно на спостереженні за поведінкою вебсервера в одному конкретному випадку.

Правила IPTables можна використовувати по-різному. Можна різати фейкові пакети трафіку. Можна унеможливлювати брутфорс на портах FTP, POP, IMAP,SSH і таких подібних, і виявляється, можна згладжувати навантаження на веб-сервер.

iptables -I INPUT -i venet0 -p tcp -m tcp –dport 80 -m state –state NEW -m recent –set –name WEB –rsource
iptables -I INPUT -i venet0 -p tcp -m tcp –dport 80 -m state –state NEW -m recent –update –seconds 5 –hitcount 10 –name WEB –rsource -j DROP

Тут замість venet0 пропишіть свій мережевий інтерфейс, якщо система не Debian. Таке правило сповільнить віддачу надто активним серверам нашого сервера. Буквально правило каже, що якщо ти за 5 секунд зробив БІЛЬШ ЯК 10 конектів то пакет дропається, доки не пройде секунда-п’ята, і середня кількість не впаде до нижче десяти.

web-server-iptables

Звичайно, дропати пакети це грубо, а лупити два запити в секунду це тактовно? На практиці чи не половина павуків ігнорують директиву Crawl-delay з robots.txt. Деякі по замовчуванню роблять біля десяти запитів на секунду. Толковий розробник, який мав час або бюджет на оптимізацію навантаження, звичайно оптимізував код. Але ж не всі сайти такі. Не рідко трапляється кривий, або криво налаштований набір скриптів. Деякі роблять до 500 запитів до бази даних для генерації одної сторінки. Що робити тому ж хостеру, який розмістив от такий безтолково зроблений проект, і той проект на 10 000 сторінок вирішив проіндексувати безпардонний павук? Рахуємо: 10 000 стор./ 10 зап./сек. виходить 1000 секунд = майже 17 хвилин, та 10 000 х 500 SQL запитів = жах в 5 000 000 запитів до бази даних за 17 хвилин.  То що робити? Вірно – тактовно дропати пакети.

Такий дроп не призводить до відмови в послузі, лише сповільняє її, не дивлячись на те, що пакети запитів ігноруються. Адже браузер автоматично повторює запит перед тим як повідомити про те, що сторінка не доступна – відповіді веб-сервера нема. Як буде себе поводити павук – питання до розробника.

Ще важливим є факт той, що Keep-Alive фактично дозволяє браузеру стягнути всі зображення та включені файли відкривши лише одне TCP з’єднання. Тобто якщj на сторінці 10 CSS-ок, 20 JavaSctipt-ів і 50 зображень, це не означає, що нам за три секунди завантаження сторінки стануть потрібні 80 відкритих з’єднань, адже всі ці файли браузер може стягнути відкривши лише одне з’єднання. На практиці браузер може відкрити кілька з’єднань. Якщо ж він відкриє 10 з’єднань за 5 секунд, то йому доведеться трохи пригальмувати з його апетитами.

Цифри 5/10 далеко не панацея і не еліксир. В залежності від того, як сконфігуровано сервер цифри можна підбирати інші. Краще всього тестувати на практиці і слідкувати за поведінкою як браузерів так і павуків.

Отже, всі правила що ми навигадували зберегаємо в файл, на приклад, в /etc/iptables.conf:
iptables-save > /etc/iptables.conf

В файл /etc/network/interfaces дописуємо команду для автоматичного підняття правил при перезапуску сервера:
pre-up iptables-restore < /etc/iptables.conf
Ну а вручну відновити правила з файлу можна так:
iptables-restore < /etc/iptables.conf

Гладких графіків навантажень!

Напишіть відгук

Ваша пошт@ не публікуватиметься. Обов’язкові поля позначені *

* Copy This Password *

* Type Or Paste Password Here *

Можна використовувати XHTML теґи та атрибути: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>