Настройка Nginx для WordPress: ускоряем до 300 % – полное руководство
Почему Nginx – лучший выбор для WordPress
WordPress традиционно работает на Apache, но Nginx предлагает асинхронную обработку запросов, меньший расход памяти и встроенный кэш. При правильной настройке вы получаете быстрый отклик, сниженную нагрузку на сервер и повышенную безопасность.
Базовая конфигурация сервера
Начнём с минимального server-блока, который будет служить фундаментом для всех дальнейших оптимизаций.
server {
listen 80 default_server;
server_name example.com www.example.com;
root /var/www/html;
index index.php index.html;
# Перенаправление HTTP → HTTPS (если уже настроен SSL)
return 301 https://$host$request_uri;
} После включения SSL замените listen 80 на listen 443 ssl и добавьте сертификаты.
Кеширование FastCGI (fastcgi_cache)
FastCGI‑кеш позволяет хранить готовый HTML‑output от PHP‑процессов и отдавать его напрямую из памяти, что экономит CPU.
Создание зоны кеша
# В http‑блоке
fastcgi_cache_path /var/run/nginx/cache levels=1:2 keys_zone=wp_cache:100m inactive=60m use_temp_path=off; Настройка кэширования в server‑блоке
location ~ .php$ {
include fastcgi_params;
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_cache wp_cache;
fastcgi_cache_valid 200 301 302 10m;
fastcgi_cache_use_stale error timeout updating;
add_header X-Cache $upstream_cache_status;
} Для динамических страниц, где кэшировать нельзя (например, корзина WooCommerce), добавьте условие if ($request_uri ~* "(cart|checkout)") { set $skip_cache 1; } и отключите кэш в этом случае.
Сжатие контента: gzip и Brotli
Сжатие уменьшает объём передаваемых данных. Gzip поддерживается почти везде, а Brotli – более эффективен, если клиент его запросит.
Включаем gzip
gzip on;
gzip_comp_level 5;
gzip_types text/css application/javascript image/svg+xml;
gzip_vary on; Включаем Brotli (модуль ngx_brotli)
brotli on;
brotli_comp_level 4;
brotli_types text/plain text/css application/javascript application/json image/svg+xml; Не забудьте установить модуль ngx_brotli через пакетный менеджер или собрать Nginx с поддержкой.
Обслуживание статических файлов
Статический контент (CSS, JS, изображения) лучше отдавать без обращения к PHP. Добавим отдельный блок location с длительным кэш‑контролем.
location ~* .(?:css|js|jpg|jpeg|png|gif|svg|webp)$ {
expires 30d;
add_header Cache-Control "public, max-age=2592000";
try_files $uri $uri/ =404;
access_log off;
} Для более продвинутой оптимизации изображений см. нашу статью Оптимизация изображений WordPress.
Безопасность и защита от брутфорса
Настройки Nginx могут снизить риски сканирования и атак на wp-login.php. Добавим ограничение количества запросов и скрытие версии.
Ограничение запросов (rate limiting)
limit_req_zone $binary_remote_addr zone=login:10m rate=5r/m;
location = /wp-login.php {
limit_req zone=login burst=3 nodelay;
include fastcgi_params;
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
} Для более глубокой защиты прочитайте руководство Защита wp-login wordpress от брутфорса.
Сокрытие версии WordPress и Nginx
server_tokens off; # скрыть версию Nginx
add_header X-Powered-By ""; # убрать X-Powered-By
Тонкая настройка FastCGI и таймаутов
Неправильные таймауты могут приводить к обрыву соединения при больших запросах (например, импорт CSV). Оптимальные значения:
fastcgi_connect_timeout 60s;
fastcgi_send_timeout 300s;
fastcgi_read_timeout 300s;
fastcgi_buffer_size 128k;
fastcgi_buffers 8 256k;
fastcgi_busy_buffers_size 256k; Эти параметры позволяют WordPress выполнять тяжёлые операции без ошибок.
Мониторинг и отладка
Для контроля эффективности включите логирование кэша и статуса запросов.
log_format cache_status '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'Cache:$upstream_cache_status';
access_log /var/log/nginx/cache.log cache_status; Анализируя cache.log, вы быстро увидите, какой процент запросов обслуживается из кеша.
Полный пример конфигурации
Ниже собран готовый nginx.conf с учётом всех рекомендаций. Скопируйте его в /etc/nginx/sites-available/example.com и включите через ln -s.
server {
listen 80;
server_name example.com www.example.com;
root /var/www/html;
index index.php index.html;
# SSL (если есть)
# listen 443 ssl;
# ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
# ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
# Сокрытие версии
server_tokens off;
add_header X-Powered-By "";
# Ограничения запросов к wp-login
limit_req_zone $binary_remote_addr zone=login:10m rate=5r/m;
# Кеш fastcgi
fastcgi_cache_path /var/run/nginx/cache levels=1:2 keys_zone=wp_cache:100m inactive=60m use_temp_path=off;
# Gzip & Brotli
gzip on;
gzip_comp_level 5;
gzip_types text/css application/javascript image/svg+xml;
gzip_vary on;
brotli on;
brotli_comp_level 4;
brotli_types text/plain text/css application/javascript application/json image/svg+xml;
# Статические файлы
location ~* .(?:css|js|jpg|jpeg|png|gif|svg|webp)$ {
expires 30d;
add_header Cache-Control "public, max-age=2592000";
try_files $uri $uri/ =404;
access_log off;
}
# PHP обработка + fastcgi_cache
location ~ .php$ {
include fastcgi_params;
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_cache wp_cache;
fastcgi_cache_valid 200 301 302 10m;
fastcgi_cache_use_stale error timeout updating;
add_header X-Cache $upstream_cache_status;
fastcgi_connect_timeout 60s;
fastcgi_send_timeout 300s;
fastcgi_read_timeout 300s;
fastcgi_buffer_size 128k;
fastcgi_buffers 8 256k;
fastcgi_busy_buffers_size 256k;
}
# Защита wp-login
location = /wp-login.php {
limit_req zone=login burst=3 nodelay;
include fastcgi_params;
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
}
# Логирование кеша
log_format cache_status '$remote_addr - $remote_user [$time_local] "'$request'" $status $body_bytes_sent "'$http_referer'" "'$http_user_agent'" Cache:$upstream_cache_status';
access_log /var/log/nginx/cache.log cache_status;
}
После правок проверьте синтаксис nginx -t и перезапустите сервис systemctl reload nginx. Теперь ваш WordPress работает на максимальной скорости.
Дополнительные ресурсы
❓ Часто задаваемые вопросы
Как проверить, работает ли fastcgi_cache?
Откройте любой пост в браузере и посмотрите заголовок X-Cache. Если значение HIT, кэш отдает страницу, иначе – MISS.
Можно ли использовать Brotli без отдельного модуля?
Нет. Brotli требует сборки Nginx с модулем ngx_brotli или установки пакета, предоставляющего этот модуль.
Что делать, если после настройки кэша страницы не обновляются?
Очистите кеш вручную командой rm -rf /var/run/nginx/cache/* или добавьте правило fastcgi_cache_bypass $http_cookie для авторизованных пользователей.
Как ограничить количество запросов к API WooCommerce?
Используйте limit_req_zone с отдельной зоной и примените её в location /wp-json/wc/, задав нужный rate‑limit.