Настройка 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.