Стабілізовуємо навантаження на вебсервер з 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 конектів то пакет дропається, доки не пройде секунда-п’ята, і середня кількість не впаде до нижче десяти.
Звичайно, дропати пакети це грубо, а лупити два запити в секунду це тактовно? На практиці чи не половина павуків ігнорують директиву 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
Гладких графіків навантажень!