Тюнінг хостинг-сервера: 15 параметрів, які перетворюють «черепаху» на «ракету»
Уявіть: ви купили спортивний автомобіль, але їздите на ньому з ручним гальмом. Двигун ревe, бензин горить, а швидкість - як у велосипеда. Саме так виглядає 80% хостинг-серверів у продакшені. Залізо потужне, тарифний план дорогий, а сайт відкривається за 6 секунд. Причина проста: ніхто не потрудився налаштувати сервер після розгортання. Сьогодні ми розберемо ті самі 15 параметрів, які відрізняють повільний хостинг від блискавичного - і зробимо це без зайвої академічності, на конкретних прикладах і цифрах.
Чому «з коробки» не працює так, як вам потрібно
Коли ви отримуєте свіжий сервер - VPS, dedicated чи навіть managed-хостинг - він приходить із дефолтними налаштуваннями. І ось у чому пастка: ці дефолти розраховані на максимальну сумісність, а не на максимальну продуктивність. Виробники ОС і панелей керування грають у безпечну гру. Вони не знають, що ви будете запускати - блог на 100 відвідувачів чи маркетплейс на 50 000. Тому ставлять консервативні значення, які «точно не зламають».
Результат? Ваш Apache обробляє 150 з'єднань, хоча може 500. Ваш MySQL використовує 128 МБ буфера, маючи 16 ГБ оперативки. Ваш PHP працює без OPcache, перекомпілюючи скрипти при кожному запиті. Це як тримати ресторан із однією касою, коли у вас десять касирів сидять без діла.
Веб-сервер: перша лінія оборони швидкості
Почнемо з того, що зустрічає кожного відвідувача - веб-сервера. Тут три основні кандидати: Apache, Nginx і LiteSpeed. І кожен потребує свого підходу.
Найбільша помилка новачків - залишити Apache із модулем prefork і включеним .htaccess на кожну директорію. Сервер витрачає ресурси на парсинг файлів .htaccess при кожному HTTP-запиті. Вимкніть AllowOverride і перенесіть правила в основний конфіг - і ви отримаєте приріст від 10% до 30% лише на цьому кроці.
Ось ключові параметри для тюнінгу веб-сервера:
- MaxRequestWorkers (Apache) / worker_connections (Nginx) - розрахуйте за формулою: доступна RAM / середнє споживання одного процесу. Для типового VPS із 4 ГБ RAM і Nginx це 1024-2048 з'єднань.
- KeepAlive і KeepAliveTimeout - увімкніть KeepAlive, але знизьте таймаут до 2-5 секунд. Довший таймаут «тримає» з'єднання, яке вже нікому не потрібне.
- Gzip/Brotli-стиснення - стиснення HTML, CSS, JS зменшує трафік на 60-80%. Brotli ефективніший за Gzip на 15-20%, але потребує HTTPS.
- Статичний кеш і expires headers - налаштуйте кешування статики (зображення, шрифти, стилі) на 30-365 днів. Повторні відвідувачі будуть вам вдячні.
«Найшвидший запит - це той, який ніколи не дійшов до вашого бекенда. Віддайте статику з кешу, і половина вашої проблеми зникне.» - Ілля Григорик, автор книги «High Performance Browser Networking», інженер Google
PHP та OPcache: де ховаються 40% вашої швидкості
Якщо ваш сайт працює на PHP (а це WordPress, Laravel, OpenCart, Joomla - тобто більшість проєктів), то налаштування PHP-FPM та OPcache - це не опція, а обов'язок.
PHP-FPM має три режими управління процесами: static, dynamic і ondemand. Для серверів із стабільним трафіком обирайте static - він тримає фіксовану кількість процесів, уникаючи витрат на їх створення та знищення. Для проєктів із пікоподібним навантаженням краще dynamic із розумними pm.max_children.
Формула проста: pm.max_children = доступна RAM для PHP / споживання одного процесу. Якщо один процес PHP з'їдає 50 МБ, а ви виділили 2 ГБ - ставте pm.max_children = 40.
Тепер OPcache. Без нього PHP перечитує і компілює кожен .php-файл при кожному запиті. Це як щоранку заново вчити рецепт кави, яку ви п'єте вже 10 років. Увімкніть OPcache і налаштуйте:
- opcache.memory_consumption = 256 (МБ) - для більшості проєктів вистачає 128-256 МБ
- opcache.max_accelerated_files = 20000 - WordPress із плагінами легко генерує 10 000+ файлів
- opcache.validate_timestamps = 0 на продакшені - не перевіряти зміни файлів, бо їх ніхто не змінює на живому сервері
- opcache.revalidate_freq = 0 - працює у парі з попереднім параметром
Реальний кейс: один інтернет-магазин на OpenCart після увімкнення OPcache і тюнінгу PHP-FPM знизив TTFB (Time To First Byte) з 1.8 секунди до 0.4 секунди. Без жодних змін у коді. Просто конфіг.
MySQL/MariaDB: база даних, яка задихається
Знаєте, що спільного між погано налаштованою базою даних і переповненим складом? В обох випадках пошук потрібної речі займає вічність. MySQL із дефолтними налаштуваннями - це саме такий склад.
Ось таблиця ключових параметрів для серверів із 4-16 ГБ RAM:
| Параметр | Дефолт | Рекомендація (8 ГБ RAM) | Ефект |
|---|---|---|---|
| innodb_buffer_pool_size | 128 МБ | 4-5 ГБ (50-70% RAM) | Кешування даних і індексів у RAM |
| innodb_log_file_size | 48 МБ | 512 МБ - 1 ГБ | Менше операцій запису на диск |
| query_cache_type | ON (MySQL 5.7) | OFF | У MySQL 8.0 вже видалено - створює блокування |
| max_connections | 151 | 200-300 | Більше одночасних з'єднань |
| tmp_table_size | 16 МБ | 64-128 МБ | Тимчасові таблиці в RAM замість диска |
Найважливіший параметр тут - innodb_buffer_pool_size. Він визначає, скільки даних MySQL тримає в оперативній пам'яті. Чим більше - тим менше звернень до диска. А диск, навіть SSD, у сотні разів повільніший за RAM.
Перевірити ефективність можна командою SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_read%'. Якщо hit rate нижче 99% - збільшуйте буфер.
Ядро Linux: системні параметри, про які всі забувають
Ви можете ідеально налаштувати Nginx і MySQL, але якщо ядро ОС не готове до навантаження - все це марно. Декілька параметрів sysctl, які змінюють гру:
net.core.somaxconn - максимальна довжина черги з'єднань. Дефолт 128, для навантажених серверів ставте 65535. Уявіть, що це кількість людей, які можуть стояти в черзі до вашого магазину замість того, щоб піти до конкурента.
vm.swappiness - наскільки агресивно система використовує swap. Для серверів із базами даних ставте 10 або навіть 1. Swap на диску - це смерть продуктивності.
fs.file-max - максимальна кількість відкритих файлів. Кожне з'єднання - це файл. Дефолтних значень часто не вистачає для серверів із тисячами одночасних з'єднань. Рекомендація: 2097152 або вище.
Не забудьте також про ulimit для користувача, під яким працює веб-сервер. Системний ліміт - це одне, а ліміт для конкретного процесу - інше. Я бачив сервери, де Nginx мав ліміт у 1024 файли при загальносистемному лімiті в мільйон. Класика.
Безпека як частина продуктивності
Дивне поєднання? Зовсім ні. Зламаний сервер - це сервер, який майнить криптовалюту для когось іншого замість того, щоб обслуговувати ваших клієнтів. Ось мінімум, який треба зробити одразу після налаштування продуктивності:
- Змініть порт SSH із 22 на будь-який інший (наприклад, 2222 або 49152) - це відсіче 90% автоматизованих ботів
- Вимкніть вхід за паролем, використовуйте тільки SSH-ключі
- Налаштуйте fail2ban - він банить IP після N невдалих спроб логіну
- Закрийте всі порти, крім 80, 443 і вашого SSH-порта через iptables або ufw
- Оновлюйте пакети хоча б раз на тиждень - unattended-upgrades для Debian/Ubuntu зробить це автоматично
Запам'ятайте: один криптомайнер на вашому сервері з'їдає 80-100% CPU. Жодний тюнінг не допоможе, якщо хтось вже «живе» у вашій системі.
Як перевірити, що все працює: чекліст після тюнінгу
Налаштували? Чудово. Тепер перевіряємо. Не «на око», а з інструментами:
- ab (Apache Benchmark) або wrk - запустіть навантажувальний тест із 100-500 одночасних з'єднань. Порівняйте TTFB до і після.
- MySQLTuner - скрипт, який аналізує конфіг MySQL і дає конкретні рекомендації. Запускайте після 24-48 годин роботи сервера.
- htop / glances - дивіться споживання RAM і CPU в реальному часі під навантаженням. Якщо swap використовується активно - щось не так.
- Google PageSpeed Insights - перевірте TTFB із різних локацій. Цільове значення - менше 200 мс.
- Логи помилок - загляньте в /var/log/nginx/error.log і /var/log/mysql/error.log. Помилки на кшталт «worker_connections are not enough» - це прямий сигнал до дії.
Зробіть собі привичку: після кожної зміни конфігурації - перезапуск сервісу, навантажувальний тест, перевірка логів. Три кроки. Завжди. Без виключень.
А тепер чесне запитання до вас: коли ви востаннє заглядали у конфіг свого сервера? Не в панель управління хостингом, а саме в конфіги Nginx, PHP-FPM, MySQL? Якщо відповідь «ніколи» або «не пам'ятаю» - то саме зараз найкращий момент. Бо ваш сервер, скоріш за все, працює з «ручним гальмом». І ваші відвідувачі це відчувають - навіть якщо мовчать.