# Деградация производительности при росте трафика: почему сайт падает и что делать
Когда сайт на WordPress начинает посещать несколько сотен человек одновременно, владельцы часто сталкиваются с неприятным сюрпризом: страницы загружаются минутами, а то и вовсе падают с ошибкой 502 Bad Gateway или «Connection timed out». В чём причина и, главное, как это исправить? Разберёмся по порядку.
## Почему сайт падает при росте трафика
WordPress из коробки — не самая производительная система. Каждый запрос к странице запускает десятки PHP-скриптов, обращений к базе данных MySQL и загрузку темы с плагинами. При низкой посещаемости (10–50 человек в день) это незаметно, но при нескольких сотнях одновременных сессий нагрузка на сервер растёт экспоненциально.
Основные узкие места:
— **PHP-процессор** — WordPress обрабатывает каждый запрос синхронно. Если один запрос «зависает», остальные ждут в очереди.
— **MySQL/ MariaDB** — база данных не справляется с конкурентными запросами. Типичная проблема — медленные SELECT-запросы в таблице wp_options.
— **ОЗУ сервера** — при большом количестве одновременных процессов PHP потребляется вся доступная память.
— **Отсутствие кэширования** — каждый посетитель заставляет сервер генерировать страницу с нуля.
## Шаг 1. Включаем кэширование страниц
Самый эффективный способ снизить нагрузку — кэшировать готовые HTML-страницы и отдавать их без участия PHP и MySQL.
### Через плагин (простой способ)
Установите и активируйте **LiteSpeed Cache** (если ваш хостинг на LiteSpeed) или **WP Super Cache** / **W3 Total Cache**.
После установки включите:
— **Page Cache** (кэш страниц) — в режиме «Disk: Enhanced» или через модуль сервера.
— **Browser Cache** — чтобы браузер посетителя сохранял CSS, JS и картинки локально.
— **Database Cache** — кэширование SQL-запросов.
### Через сервер (продвинутый способ, VPS)
Настройте Nginx FastCGI Cache или Varnish перед веб-сервером:
«`nginx
# В секции http конфига Nginx
fastcgi_cache_path /var/cache/nginx levels=1:2 keys_zone=WORDPRESS:100m inactive=60m;
fastcgi_cache_key «$scheme$request_method$host$request_uri»;
server {
# …
location ~ \.php$ {
fastcgi_cache WORDPRESS;
fastcgi_cache_valid 200 60m;
fastcgi_cache_use_stale error timeout updating;
add_header X-Cache $upstream_cache_status;
# стандартные параметры FastCGI
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.1-fpm.sock;
}
}
«`
После настройки проверьте заголовок ответа:
«`bash
curl -I https://ваш-сайт.ru | grep X-Cache
# Должен вернуть: X-Cache: HIT
«`
## Шаг 2. Настраиваем PHP-FPM
PHP-FPM позволяет управлять количеством worker-процессов, которые обрабатывают запросы. Найдите конфиг пула:
«`bash
sudo nano /etc/php/8.1/fpm/pool.d/www.conf
«`
Ключевые параметры для среднего сайта (512 МБ ОЗУ, ~500 посетителей):
«`ini
pm = dynamic
pm.max_children = 30
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 15
pm.max_requests = 500
«`
Формула для расчёта `pm.max_children`:
«`
max_children = (ОЗУ сервера — ОЗУ под ОС) / средний вес PHP-процесса
«`
Пример: сервер 2 ГБ, ОС жрёт 512 МБ, PHP-процесс ~50 МБ → (1536 / 50) ≈ 30.
После изменений:
«`bash
sudo systemctl restart php8.1-fpm
«`
## Шаг 3. Оптимизируем базу данных
С течением времени в таблицах WordPress накапливаются ревизии записей, спам-комментарии и транзитные данные. Очистите их:
«`sql
— Очистить ревизии записей (старше 30 дней)
DELETE FROM wp_posts WHERE post_type = ‘revision’ AND post_date < NOW() - INTERVAL 30 DAY;
-- Очистить спам-комментарии
DELETE FROM wp_comments WHERE comment_approved = 'spam';
-- Очистить транзитные данные
DELETE FROM wp_options WHERE option_name LIKE '_transient_%' OR option_name LIKE '_transient_timeout_%';
```
Или используйте плагин **WP-Optimize** — он делает то же самое через админку.
Также добавьте индексы для частых запросов, если их нет:
```sql
ALTER TABLE wp_postmeta ADD INDEX post_id_meta_key (post_id, meta_key);
ALTER TABLE wp_terms ADD INDEX slug_index (slug);
```
## Шаг 4. Используем CDN и оптимизацию медиафайлов
CDN (Content Delivery Network) разгружает сервер, отдавая статические файлы (CSS, JS, изображения) с ближайшего к посетителю узла.
- **Cloudflare** — бесплатный CDN + защита от DDoS
- **QUIC.cloud** — интеграция с LiteSpeed Cache
- **KeyCDN** или **BunnyCDN** — бюджетные варианты
Оптимизация изображений:
```bash
# Установить optipng и jpegoptim
sudo apt install optipng jpegoptim -y
# Сжать все PNG в папке uploads за 2024 год
find wp-content/uploads/2024 -name '*.png' -exec optipng -o7 {} \;
# Сжать все JPG
find wp-content/uploads/2024 -name '*.jpg' -exec jpegoptim --strip-all {} \;
```
## Шаг 5. Аудит медленных плагинов
Не все плагины одинаково полезны. Некоторые делают десятки лишних SQL-запросов на каждой странице. Проверьте:
1. Временно отключите все плагины.
2. Замерьте время загрузки страницы (инструмент: Chrome DevTools → Network).
3. Включайте плагины по одному, замеряя прирост времени.
4. Плагины, добавляющие >200 мс к времени ответа — на замену.
Полезные инструменты замера:
«`bash
# apache benchmark — 50 одновременных запросов, 1000 всего
ab -n 1000 -c 50 https://ваш-сайт.ru/
# Проверка количества SQL-запросов (включите в wp-config.php)
define(‘SAVEQUERIES’, true);
«`
После включения SAVEQUERIES в нижней части страницы (с включённым WP_DEBUG) появится панель с количеством запросов. Норма — до 50 запросов на страницу.
## Итог: чеклист для диагностики
Если сайт начал падать при росте трафика, действуйте по порядку:
1. ✅ Включить кэширование страниц (плагин или Nginx/Varnish)
2. ✅ Настроить PHP-FPM (pm.max_children под ваше ОЗУ)
3. ✅ Очистить и оптимизировать базу данных
4. ✅ Подключить CDN (Cloudflare — быстро и бесплатно)
5. ✅ Аудит медленных плагинов
6. ✅ Сжать изображения в media-библиотеке
Эти шаги позволяют WordPress-сайту уверенно держать 500–2000 одновременных посетителей без лагов и падений. Если после всех настроек сайт всё ещё тормозит — проблема может быть на стороне хостинг-провайдера. В этом случае рассмотрите переход на VPS с выделенными ресурсами.
