Знаете, я как-то раз запускал интернет-магазин на 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;
# Остальные настройки
}
Как проверить, что всё работает
После настройки обязательно проверьте:
- Валидность конфигурации:
nginx -t— если ошибок нет, перезагружайте:systemctl reload nginx - Работу кэширования: добавьте заголовок X-Cache (мы его уже добавили) и смотрите в инструментах разработчика браузера
- Скорость загрузки: используйте GTmetrix или PageSpeed Insights
- Безопасность: проверьте через securityheaders.com
Когда стоит доверить настройку профессионалам
Я понимаю желание сделать всё самому. Но если у вас бизнес, который приносит деньги — время дороже. Настройка Nginx для WordPress требует опыта и понимания архитектуры сервера. Одна ошибка может стоить вам клиентов.
В Wenesis мы занимаемся этим каждый день. Настраиваем серверы под высокие нагрузки, оптимизируем скорость, ставим защиту от взлома. Если вы хотите, чтобы ваш сайт летал и не падал в черную пятницу — обращайтесь. Мы сделаем всё под ключ, а вы сможете заниматься своим бизнесом.
Резюме
Настройка Nginx для WordPress — это не rocket science, но требует внимания к деталям. Мы разобрали:
- Базовую конфигурацию сервера
- Кэширование статики и динамики
- Безопасность: защита от брутфорса, SQL-инъекций, скрытие версии
- SSL и HTTPS
- Частые ошибки и их решения
- Дополнительную оптимизацию производительности
Следуйте этому руководству, и ваш сайт будет работать быстро и стабильно. Удачи!
Добавить комментарий