Знаете, я как-то раз запускал интернет-магазин на WordPress для одного клиента. Всё сделали красиво: дизайн, контент, плагины. Запускаем — а сайт тормозит, как старый компьютер под Windows 95. Клиент нервничает, я краснею. Полезли в сервер — а там Apache стоит. Переезд на Nginx решил проблему за час. Сайт взлетел, клиент счастлив, я — герой.

С тех пор я твердо уверен: если у вас WordPress и вы хотите, чтобы он летал — ставьте Nginx. Это не просто веяние моды, а реальная необходимость для любого бизнес-сайта. В этой статье я расскажу, как настроить Nginx для WordPress с нуля. Без воды, с примерами и пояснениями для тех, кто не хочет копаться в документации неделями.

Дисклеймер: если вы не готовы лезть в консоль сервера — просто передайте эту статью своему разработчику или обратитесь к нам в Wenesis. Мы сделаем всё быстро и без головной боли.

Почему Nginx, а не Apache?

Давайте сразу расставим точки над i. Apache — это легенда, он кормил интернет двадцать лет. Но у него есть фундаментальная проблема: он создает отдельный процесс на каждое соединение. Когда на ваш сайт заходит 100 человек — он создает 100 процессов. Когда 1000 — начинает задыхаться.

Nginx работает иначе. Он использует событийно-ориентированную архитектуру. Один процесс может обрабатывать тысячи соединений одновременно. Результат? Ваш сайт на WordPress выдерживает высокие нагрузки без падения скорости.

Цифры не врут: по данным Netcraft, Nginx обслуживает около 30% всех сайтов в мире, включая такие гиганты, как Netflix, Airbnb и WordPress.com. Если это работает для них — сработает и для вашего бизнеса.

Базовая конфигурация Nginx для WordPress

Перед тем как начать, убедитесь, что у вас установлен Nginx и PHP-FPM. Если нет — гуглите установку для вашей операционной системы (Ubuntu, CentOS, Debian). Дальше я покажу конфиг, который можно использовать как стартовую точку.

Структура конфигурации WordPress

Конфигурационные файлы Nginx обычно лежат в `/etc/nginx/`. Нас интересует папка `sites-available/`, где создаются файлы для каждого сайта. Создадим файл, например, `mysite.conf`:

server {
    listen 80;
    server_name ваш-домен.ru www.ваш-домен.ru;
    root /var/www/ваш-сайт;

    index index.php index.html index.htm;

    client_max_body_size 64M;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~ /\.ht {
        deny all;
    }

    location = /favicon.ico {
        log_not_found off; access_log off;
    }

    location = /robots.txt {
        log_not_found off; access_log off; allow all;
    }

    location ~* \.(css|gif|ico|jpeg|jpg|js|png|svg|webp)$ {
        expires max;
        log_not_found off;
    }
}

Разберем, что здесь происходит:

  • server_name — ваш домен. Обязательно укажите и с www, и без.
  • root — путь к папке с файлами WordPress.
  • try_files — волшебная строка, которая заставляет Nginx сначала искать статический файл, потом директорию, и только потом передавать запрос WordPress.
  • location ~ \.php$ — обрабатывает PHP-файлы через FastCGI.
  • deny all для скрытых файлов — базовая безопасность.

Это минимальный рабочий конфиг. Он поднимет сайт, но не даст максимальной производительности. Для бизнес-сайта нужно больше.

Оптимизация кэширования для WordPress

Кэширование — это то, за что клиенты будут вас благодарить. Представьте: посетитель заходит на сайт, сервер не дергает базу данных, не компилирует PHP, а просто отдает готовую HTML-страницу. Скорость загрузки падает до долей секунды.

Кэширование статики

Статические файлы (CSS, JS, изображения) редко меняются. Зачем их отдавать каждый раз заново? Добавляем в конфиг:

location ~* \.(jpg|jpeg|png|gif|ico|css|js|pdf|svg|webp)$ {
    expires 30d;
    add_header Cache-Control "public, immutable";
}

Этот блок говорит браузеру: «Сохрани эти файлы на 30 дней. Не проси их у меня снова». Результат — моментальная загрузка страниц при повторных визитах.

FastCGI Cache для WordPress

Более продвинутый уровень — кэширование динамических страниц на стороне сервера. Добавляем в секцию `http` (обычно в файле `/etc/nginx/nginx.conf`):

fastcgi_cache_path /var/cache/nginx levels=1:2 keys_zone=wpcache:100m inactive=60m;
fastcgi_cache_key "$scheme$request_method$host$request_uri";

А затем в конфигурацию сайта:

set $skip_cache 0;

# Не кэшируем админку и страницы входа
if ($request_uri ~* "/wp-admin/|/wp-login.php|/wp-json/") {
    set $skip_cache 1;
}

# Не кэшируем для авторизованных пользователей
if ($http_cookie ~* "wordpress_logged_in_") {
    set $skip_cache 1;
}

location ~ \.php$ {
    try_files $uri =404;
    include fastcgi_params;
    fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_cache_bypass $skip_cache;
    fastcgi_no_cache $skip_cache;
    fastcgi_cache wpcache;
    fastcgi_cache_valid 200 1h;
    add_header X-Cache $upstream_cache_status;
}

Обратите внимание на строку `add_header X-Cache $upstream_cache_status`. Она добавляет в HTTP-заголовок информацию о том, попал ли запрос в кэш (HIT) или нет (MISS). Это очень удобно для отладки — вы всегда видите, работает ли кэширование.

Проблема с кэшированием и корзиной WooCommerce

Если у вас интернет-магазин на WooCommerce — будьте аккуратны. Кэширование страниц корзины и оформления заказа может привести к тому, что клиенты увидят чужие данные. Обязательно исключайте эти страницы из кэша:

if ($request_uri ~* "/cart/|/checkout/|/my-account/|/addons/") {
    set $skip_cache 1;
}

Безопасность Nginx для WordPress

WordPress — самая популярная CMS в мире. А значит, она — самая популярная цель для взлома. Nginx может стать вашим первым рубежом обороны.

Защита от брутфорса

Злоумышленники постоянно пытаются подобрать пароль к wp-admin. Ограничим количество попыток:

limit_req_zone $binary_remote_addr zone=login:10m rate=5r/m;

location /wp-login.php {
    limit_req zone=login burst=2 nodelay;
    try_files $uri $uri/ /index.php?$args;
}

Этот код разрешает не более 5 запросов к wp-login.php в минуту с одного IP. Больше — блокируется.

Защита от SQL-инъекций и XSS

Хотя WordPress сам по себе фильтрует запросы, лишняя защита не помешает:

location ~* (eval\(|base64_encode|base64_decode|union.*select|gzinflate) {
    deny all;
    access_log off;
    log_not_found off;
}

location ~* \.(sql|log|env|git|svn|bak|old|swp)$ {
    deny all;
    access_log off;
    log_not_found off;
}

Скрываем версию WordPress

По умолчанию WordPress выдает свою версию в заголовках и RSS-ленте. Зачем помогать хакерам?

В файл `functions.php` вашей темы добавьте:

remove_action('wp_head', 'wp_generator');
add_filter('the_generator', '__return_false');

А в конфиге Nginx уберите заголовок:

server_tokens off;

SSL и HTTPS

Сегодня сайт без HTTPS — моветон. Google штрафует, клиенты боятся вводить данные. Настроим Let’s Encrypt:

server {
    listen 443 ssl http2;
    server_name ваш-домен.ru;

    ssl_certificate /etc/letsencrypt/live/ваш-домен.ru/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/ваш-домен.ru/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;

    # Остальные настройки из предыдущего конфига
}

server {
    listen 80;
    server_name ваш-домен.ru www.ваш-домен.ru;
    return 301 https://$server_name$request_uri;
}

Первый блок слушает 443 порт (HTTPS) с современными протоколами шифрования. Второй блок — редиректит всех с HTTP на HTTPS. Это важно для SEO: Google любит единый протокол.

Частые ошибки при настройке Nginx для WordPress

За годы работы я видел кучу граблей, на которые наступают даже опытные разработчики. Вот топ-5:

1. Забыли про обработку .php файлов

Самый популярный косяк. Вы настроили Nginx, открываете сайт — а он скачивает index.php вместо того, чтобы выполнить его. Решение: проверьте блок `location ~ \.php$`. Если его нет — сайт не заработает.

2. Неправильные права на файлы

WordPress должен иметь право писать в папки `wp-content/uploads` и иногда `wp-content/plugins`. Если права выставлены неправильно — не будут загружаться изображения, не будут обновляться плагины.

# Владелец файлов — пользователь nginx (или www-data)
chown -R nginx:nginx /var/www/ваш-сайт
# Права: папки 755, файлы 644
find /var/www/ваш-сайт -type d -exec chmod 755 {} \;
find /var/www/ваш-сайт -type f -exec chmod 644 {} \;

3. Отключен буферизинг FastCGI

Если ваш сайт выдает ошибку 502 Bad Gateway — скорее всего, проблема в FastCGI. Проверьте, работает ли PHP-FPM:

# Проверка статуса
systemctl status php8.1-fpm

И добавьте буферизацию в конфиг:

fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;

4. Нет обработки редиректов

В WordPress часто используются редиректы (например, канонические URL). Если Nginx их не обрабатывает — будут дубли страниц, что плохо для SEO. Убедитесь, что в вашем конфиге есть:

location / {
    try_files $uri $uri/ /index.php?$args;
}

Эта строка передает все запросы, которые не соответствуют реальным файлам, в WordPress, который уже сам решает, что делать.

5. Игнорирование логов

Логи — ваши лучшие друзья при отладке. Включите их:

access_log /var/log/nginx/ваш-сайт.access.log;
error_log /var/log/nginx/ваш-сайт.error.log;

И регулярно проверяйте. Особенно error.log — там будет написано, почему сайт не работает.

Производительность: дополнительные настройки

Если вы дошли до этого места — вы молодец. Давайте выжмем из Nginx максимум.

Gzip сжатие

Сжимает HTML, CSS, JS перед отправкой клиенту. Уменьшает объем трафика на 70-80%:

gzip on;
gzip_comp_level 5;
gzip_min_length 256;
gzip_proxied any;
gzip_vary on;
gzip_types
    text/plain
    text/css
    text/xml
    text/javascript
    application/json
    application/javascript
    application/xml+rss
    application/rss+xml
    image/svg+xml;

HTTP/2

Протокол HTTP/2 ускоряет загрузку за счет мультиплексирования (несколько запросов в одном соединении). Включается добавлением `http2` в строку listen:

listen 443 ssl http2;

Ограничение количества соединений

Если на ваш сайт идет DDoS-атака, Nginx может ограничить количество соединений с одного IP:

limit_conn_zone $binary_remote_addr zone=addr:10m;

server {
    limit_conn addr 10;
    # Остальные настройки
}

Как проверить, что всё работает

После настройки обязательно проверьте:

  1. Валидность конфигурации: nginx -t — если ошибок нет, перезагружайте: systemctl reload nginx
  2. Работу кэширования: добавьте заголовок X-Cache (мы его уже добавили) и смотрите в инструментах разработчика браузера
  3. Скорость загрузки: используйте GTmetrix или PageSpeed Insights
  4. Безопасность: проверьте через securityheaders.com

Когда стоит доверить настройку профессионалам

Я понимаю желание сделать всё самому. Но если у вас бизнес, который приносит деньги — время дороже. Настройка Nginx для WordPress требует опыта и понимания архитектуры сервера. Одна ошибка может стоить вам клиентов.

В Wenesis мы занимаемся этим каждый день. Настраиваем серверы под высокие нагрузки, оптимизируем скорость, ставим защиту от взлома. Если вы хотите, чтобы ваш сайт летал и не падал в черную пятницу — обращайтесь. Мы сделаем всё под ключ, а вы сможете заниматься своим бизнесом.

Резюме

Настройка Nginx для WordPress — это не rocket science, но требует внимания к деталям. Мы разобрали:

  • Базовую конфигурацию сервера
  • Кэширование статики и динамики
  • Безопасность: защита от брутфорса, SQL-инъекций, скрытие версии
  • SSL и HTTPS
  • Частые ошибки и их решения
  • Дополнительную оптимизацию производительности

Следуйте этому руководству, и ваш сайт будет работать быстро и стабильно. Удачи!

Добавить комментарий

Разработка сайтов на Wordpress