Медленная работа MySQL и постоянные ошибки 502 Bad Gateway — главные враги сайтов на WordPress (Elementor, WooCommerce). В этой статье мы проведем полную диагностику и настроим идеальный баланс между Базой Данных, PHP и Nginx для максимальной производительности сервера.
Диагностика и выявление «бутылочного горлышка»
Первым делом проверяем основной параметр — размер буфера InnoDB. Он определяет, сколько данных MySQL может держать в быстрой оперативной памяти.
SHOW VARIABLES LIKE 'innodb_buffer_pool_size';
| Variable_name | Value |
|---|---|
| innodb_buffer_pool_size | 134217728 (128MB) |
Проблема: По умолчанию выделено всего 128MB. Если ваша база данных (например, 628MB) больше этого значения, сервер начинает читать данные с диска, что вызывает скачки CPU до 400%.
Оптимизация MySQL: Настройка my.cnf
Для стабильной работы WordPress нам нужно выделить достаточно памяти под базу, оставив запас для тяжелых PHP-процессов Elementor.
Актуальный баланс: Для сервера с 8GB RAM оптимально выделить 2GB под MySQL. Это покроет базу в 600-1500MB и оставит место для PHP-процессов, которые при активации WooCommerce могут потреблять до 512MB на каждый поток.
nano /etc/mysql/my.cnf
[mysqld]
# Основной буфер (увеличиваем до 2GB)
innodb_buffer_pool_size = 2G
innodb_buffer_pool_instances = 2
# Оптимизация записи и транзакций
innodb_flush_log_at_trx_commit = 2
innodb_log_buffer_size = 32M
innodb_flush_method = O_DIRECT
# Ограничение временных таблиц (чтобы избежать Out of Memory)
tmp_table_size = 32M
max_heap_table_size = 32M
# Настройки соединений
max_connections = 150
skip_name_resolve = 1
Индексация и чистка мусора
Даже быстрая память не спасет, если запросы не оптимизированы. Мы добавим индексы в самые «медленные» таблицы WordPress.
-- Ускоряем выборку настроек сайта
ALTER TABLE wp_options ADD INDEX idx_autoload (autoload);
-- Оптимизация WooCommerce и логов
ALTER TABLE wp_woocommerce_shipping_zones ADD INDEX idx_zone_order (zone_order);
ALTER TABLE wp_wpmailsmtp_debug_events ADD INDEX idx_created_at (created_at);
-- Чистка раздутых таблиц логов
TRUNCATE TABLE wp_wpmailsmtp_debug_events;
TRUNCATE TABLE wp_rank_math_404_logs;
Связка: Nginx + PHP-FPM (Борьба с 502)
Если база работает быстро, но Nginx не может принять тяжелый ответ от PHP, вы увидите «Bad Gateway». Нужно расширить буферы передачи данных.
# Добавьте в конфиг Nginx в блок location ~ \.php$
fastcgi_buffer_size 128k;
fastcgi_buffers 64 64k;
fastcgi_busy_buffers_size 256k;
fastcgi_read_timeout 300;
Почему это важно: Плагины безопасности (Cerber) и конструкторы (Elementor) передают огромные Cookie и заголовки. Без этих настроек Nginx будет «сбрасывать» соединение, считая его ошибочным.
Итоги глобальной оптимизации
Диагностика (Было)
- База 628MB жила в 128MB памяти
- Постоянный своп (чтение) с диска
- Ошибки 502 из-за узких буферов Nginx
- CPU 400% из-за очереди запросов
Результат (Стало)
- База полностью в RAM (2GB Buffer Pool)
- Nginx «проглатывает» любые заголовки
- Индексы ускорили wp_options в разы
- Нагрузка на CPU снижена до 15-20%
Теперь ваш сервер работает как единый слаженный механизм. Данные мгновенно отдаются из MySQL в PHP, а Nginx без задержек транслирует их пользователю.
systemctl restart mysql php8.1-fpm nginx