Настройка WordPress на VPS обычно упирается в три вещи: правильный Nginx перед PHP, безопасный SSL и продуманное кеширование, чтобы страницы отдавались быстро и стабильно. Дальше разложим по шагам схему, которая хорошо работает на типичном VPS: Nginx + PHP-FPM + MariaDB/MySQL, HTTPS через Let’s Encrypt и несколько уровней кеша.

Ниже приведён практический план под Ubuntu 22.04. Если у тебя другой дистрибутив, логика останется той же, но команды пакетов и пути конфигов могут отличаться.

Что нужно подготовить перед стартом

Ресурсы VPS и ожидания по производительности

WordPress сам по себе не тяжёлый, но скорость упирается в связку CPU, RAM и диска. Если планируешь 1–5 тыс. визитов в сутки и стандартный блог, обычно хватает 1–2 vCPU и 2–4 ГБ RAM при включённом кешировании. Если сайт растёт и появляются плагины тяжёлого типа (сложные визуальные конструкторы, офлайн-индексация, большие отчёты), лучше сразу закладывать запас.

Ещё момент: VPS с “медленным” диском резко ухудшает время ответа базы и PHP. Это лечится не только кешом, но и правильными настройками MariaDB и выбором типа диска у провайдера.

Домен, DNS и доступ по SSH

Перед настройкой убедись, что домен указывает на IP VPS, и доступ по SSH работает.

Для SSL через Let’s Encrypt удобно иметь:

  • основной домен, например example.com
  • при необходимости поддомен www, например www.example.com

Если www пока не настроен, проще сначала выпустить сертификат на один домен, а потом добавить второй.

Установка Nginx, PHP-FPM и базы данных

Установка Nginx и MariaDB

Обнови индексы пакетов и установи базовые компоненты.

«`bash sudo apt update sudo apt install -y nginx sudo apt install -y mariadb-server sudo systemctl enable nginx sudo systemctl enable mariadb «`

После установки MariaDB желательно выполнить базовую настройку безопасности.

«`bash sudo mysqlsecureinstallation «`

На этом шаге выставь пароль root, отключи анонимный доступ и запрети вход root извне.

Создание пользователя и базы для WordPress

Для WordPress лучше отдельная БД и отдельный пользователь. Пример:

«`bash sudo mariadb -u root «`

Дальше в консоли MariaDB:

«`sql CREATE DATABASE wordpress CHARACTER SET utf8mb4 COLLATE utf8mb4unicodeci; CREATE USER ‘wpuser’@’localhost’ IDENTIFIED BY ‘СЮДА_ПАРОЛЬ’; GRANT ALL PRIVILEGES ON wordpress.* TO ‘wpuser’@’localhost’; FLUSH PRIVILEGES; EXIT; «`

Так проще контролировать доступ и безопаснее, чем использовать root.

Установка PHP и расширений под WordPress

WordPress корректнее всего работает с современными версиями PHP. На Ubuntu 22.04 по умолчанию может быть PHP 8.1. Можно и 8.2, если репозиторий доступен.

Базовый набор модулей:

«`bash sudo apt install -y php-fpm php-mysql php-xml php-mbstring php-curl php-gd php-intl php-zip php-imagick «`

Если Imagick не нужен для твоих задач, можно не ставить. Но многие сайты с обработкой изображений выигрывают от него.

Настройка PHP-FPM: лимиты и opcache

Открой конфиг PHP-FPM для пула www. Путь зависит от версии PHP, обычно это:

«`bash ls /etc/php/*/fpm/pool.d/ «`

Чаще всего редактируют /etc/php/8.1/fpm/pool.d/www.conf (замени версию).

Ключевые параметры:

  • listen: обычно лучше оставить unix-сокет
  • pm: режим пула
  • pm.max_children: лимит процессов
  • php-fpm slowlog: помогает видеть узкие места

Типовой пример для умеренной нагрузки:

«`ini pm = dynamic pm.max_children = 20 pm.start_servers = 4 pm.minspareservers = 2 pm.maxspareservers = 6 requestterminatetimeout = 60s «`

Теперь opcache. Создай или проверь файл:

«`bash sudo nano /etc/php/8.1/fpm/conf.d/10-opcache.ini «`

Пример настройки:

«`ini opcache.enable=1 opcache.enable_cli=0 opcache.memory_consumption=128 opcache.maxacceleratedfiles=100000 opcache.validate_timestamps=1 opcache.revalidate_freq=2 «`

Для продакшена часто validate_timestamps можно держать включённым на короткий интервал. Если сайт на активной разработке, это спасает от ситуации “изменения не видны”.

После правок:

«`bash sudo systemctl restart php*-fpm 2>/dev/null || true sudo systemctl restart nginx «`

Первичная конфигурация Nginx для WordPress

Базовый server block для HTTP

Создай конфигурацию сайта:

«`bash sudo nano /etc/nginx/sites-available/example.com «`

Пример для HTTP (потом добавим HTTPS):

«`nginx server { listen 80; listen [::]:80; server_name example.com www.example.com;

root /var/www/example.com/public; index index.php index.html;

clientmaxbody_size 50m;

access_log /var/log/nginx/example.com-access.log; error_log /var/log/nginx/example.com-error.log;

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

location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/run/php/php8.1-fpm.sock; fastcgiparam SCRIPTFILENAME $documentroot$fastcgiscript_name; include fastcgi_params; }

location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ { expires 30d; access_log off; add_header Cache-Control «public, max-age=2592000, immutable»; }

location ~* \.(zip|gz|tar|tgz|rar)$ { expires 7d; access_log off; add_header Cache-Control «public, max-age=604800»; } } «`

Важно: путь к сокету fastcgi_pass может отличаться. Узнать можно так:

«`bash ls /run/php/ «`

Включи конфиг:

«`bash sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/ sudo nginx -t sudo systemctl reload nginx «`

Права на каталог сайта

WordPress обычно кладут в /var/www/example.com/public. Создай папку и дай нужные права:

«`bash sudo mkdir -p /var/www/example.com/public sudo chown -R www-data:www-data /var/www/example.com/public «`

Если ты будешь загружать файлы через FTP/SFTP под другим пользователем, лучше сразу продумать права, чтобы не появлялись ошибки записи в wp-content.

Установка WordPress в подготовленную структуру

Скачай WordPress и распакуй:

«`bash sudo apt install -y unzip curl cd /var/www/example.com/public curl -O https://wordpress.org/latest.zip unzip latest.zip rm latest.zip sudo chown -R www-data:www-data /var/www/example.com/public «`

Дальше в браузере запусти мастер установки, укажи:

  • адрес базы данных
  • пользователя и пароль
  • префикс таблиц (по умолчанию ок, если нет требований по безопасности)

SSL для WordPress: Let’s Encrypt и безопасные редиректы

Установка certbot и выпуск сертификата

Установи certbot для Nginx:

«`bash sudo apt install -y certbot python3-certbot-nginx «`

Выпусти сертификат:

«`bash sudo certbot —nginx -d example.com -d www.example.com «`

Certbot обычно сам внесёт нужные правила в Nginx и создаст HTTPS server block. Если ты планируешь полностью контролировать конфиг вручную, можно использовать режим с —certonly, но для большинства задач автоматизация удобнее.

Проверь автообновление сертификата:

«`bash sudo systemctl list-timers | grep certbot «`

HTTPS server block: минимальные требования к конфигу

Если certbot уже всё сделал, можно не переписывать конфиг целиком. Но понимание параметров важно.

В HTTPS сервере должны быть:

  • корректный root и location блоки
  • редирект с 80 на 443
  • современные заголовки безопасности

Проверить, что редирект включён, можно через браузер или curl:

«`bash curl -I https://example.com «`

HSTS и типичные ошибки SSL

Если сайтом пользуются только по HTTPS, включение HSTS иногда уместно. В Nginx добавь в HTTPS server block:

«`nginx add_header Strict-Transport-Security «max-age=31536000; includeSubDomains» always; «`

Включать HSTS стоит, когда ты уверен, что HTTPS стабилен. Иначе можно “запереть” пользователей на неправильный режим, пока браузер не обновит кеш.

Типичные ошибки при Let’s Encrypt:

  • домен не указывает на IP VPS (DNS не обновился)
  • закрыт 80/443 порт (firewall мешает валидации)
  • сайт отдаёт не то содержимое на момент проверки

Почини это до усиления конфигов. SSL — как фундамент: пока не выровнен, остальные стройки бессмысленны.

Кеширование на уровне Nginx и PHP: чтобы страницы отдавались быстрее

Кеширование можно строить слоями. На практике чаще всего дают результат:

  1. gzip и корректные заголовки на статику
  2. FastCGI cache в Nginx для страниц WordPress
  3. opcache для PHP
  4. объектный кеш (например, Redis) для ускорения запросов из WordPress

Начнём с тех вещей, которые проще и дают быстрый эффект.

Gzip и корректные заголовки

Убедись, что gzip включён. Файл может быть /etc/nginx/nginx.conf или отдельный include. Пример фрагмента:

«`nginx gzip on; gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; gzipminlength 1024; gzipcomplevel 5; «`

Статика в конфиге выше уже получила expires и Cache-Control. Это помогает браузерам не запрашивать одно и то же по многу раз.

FastCGI cache для WordPress

FastCGI cache — это кеш ответов PHP-FPM на стороне Nginx. Для WordPress он полезен, когда:

  • сайт имеет много контента, который редко меняется
  • у тебя нет строгих требований к “мгновенному отображению” изменений для каждого пользователя
  • ты аккуратно исключаешь страницы, которые нельзя кэшировать

Создай директорию под кеш и настрой параметры:

«`bash sudo mkdir -p /var/cache/nginx/fastcgi_cache sudo chown -R www-data:www-data /var/cache/nginx «`

Теперь добавь в server block для HTTPS (или HTTP, но лучше для HTTPS) фрагмент. Пример, который обычно работает:

«`nginx

fastcgi_cache_path /var/cache/nginx/fastcgi_cache
levels=1:2
keys_zone=WORDPRESS:100m
inactive=60m
use_temp_path=off;

map $http_cookie $skip_cache {
default 0;
«~*(comment_author|wordpress_logged_in|wp-postpass|wordpress_sec)» 1;
}

map $request_method $skip_cache_method {
default 1;
GET 0;
HEAD 0;
}

Внутри server {}:

set $no_cache 0;

if ($skip_cache = 1) {
set $no_cache 1;
}

if ($skip_cache_method = 1) {
set $no_cache 1;
}

location ~ .php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.1-fpm.sock;

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;

fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;

fastcgi_cache WORDPRESS;
fastcgi_cache_bypass $no_cache;
fastcgi_no_cache $no_cache;

fastcgi_cache_valid 200 301 302 1h;
fastcgi_cache_valid 404 1m;

add_header X-FastCGI-Cache $upstream_cache_status always;

}

Пара важных замечаний:

  • логика исключений зависит от того, какие плагины ты используешь (комментарии, формы входа, корзина)
  • если на сайте есть динамика для разных ролей, часть страниц нужно обходить кешом
  • для мультиязычных сайтов ключи кеша могут требовать учёта параметров языка

После внесения изменений:

«`bash sudo nginx -t sudo systemctl reload nginx «`

Как понять, что FastCGI cache реально работает

Сделай запрос и посмотри заголовок. В конфиге выше добавлен X-FastCGI-Cache.

«`bash curl -s -D — https://example.com/ | head «`

Ожидаемые статусы:

  • HIT: ответ взят из кеша
  • MISS: ответ пересчитан
  • BYPASS: кеш пропущен правилами

Если всегда MISS, проверь:

  • нет ли ошибок в include fastcgi_params
  • не настроены ли правила для skip_cache
  • не отдается ли в ответах код, который кеш не хранит (например, 403/500)

Кеширование на уровне WordPress: Redis и объектный кеш

FastCGI cache ускоряет выдачу страниц. Но WordPress тратит время ещё и на “кучу маленьких операций”: выборки опций, метаданных, трансляция языков, расчёт запросов для тем. Это ускоряет объектный кеш в памяти.

Самый распространённый вариант на VPS — Redis.

Установка Redis и подключение

Установи Redis:

«`bash sudo apt install -y redis-server sudo systemctl enable redis-server sudo systemctl start redis-server «`

Дальше нужен PHP-клиент для Redis. Ставь расширение:

«`bash sudo apt install -y php-redis sudo systemctl restart php*-fpm 2>/dev/null || true «`

Проверь, что PHP видит расширение (на уровне CLI):

«`bash php -m | grep redis «`

Настройка Redis в WordPress через wp-config.php

Объектный кеш можно подключить и без сложных плагинов, если ты контролируешь конфигурацию и знаешь, что делаешь. Часто используют plugin “Redis Object Cache”, потому что он сам подхватывает параметры. Если нужен вариант на уровне кода, пример идей такой:

  • включить кеш для редис-инстанса
  • настроить префикс
  • установить порт/хост

Минимально убедись, что Redis доступен по сокету или через TCP. Например, localhost:6379 обычно ок.

Если используешь плагин, следуй его настройкам: он подстроит параметры под твою версию WordPress.

Что именно кешировать и что не стоит

Объектный кеш ускоряет чтение данных. Но он не отменяет необходимость кешировать страницы. Работает комбинация:

  • FastCGI cache держит готовые HTML
  • Redis держит данные, которые WordPress постоянно читает во время сборки страницы

Не пытайся “кешировать всё подряд”. По логике многие данные завязаны на пользователях: корзина, покупки, личные кабинеты, результаты поиска. Их лучше исключить из кэширования на странице и/или ограничить объём объектного кеша.

Для проверки можно смотреть, меняется ли заголовок X-FastCGI-Cache от страницы к странице при разных состояниях: залогинен/не залогинен, есть cookie/нет cookie.

Клиентское кеширование и фронтенд-подготовка

Даже идеальный серверный кеш можно “сломать” медленными фронтенд-запросами. Поэтому стоит добить базу: статика, заголовки и размер ответов.

Cache-Control для статики: практическая схема

Для статических файлов (CSS/JS/шрифты/картинки) логика такая:

  • файлы с уникальными именами (с хешем в имени) можно кэшировать дольше
  • файлы без хеша (например, styles.css) — кэшировать осторожно

Если в твоём шаблоне статике имена не хешируются, лучше не ставить immutable, иначе обновления могут приезжать к пользователям только после того, как они обновят кеш.

В конфиге Nginx выше используется immutable для распространённых файлов. Если в проекте таких гарантий нет, убери immutable или сократи max-age.

Вариант с CDN

Если аудитория географически распределена, CDN может дать заметный прирост без сложных правок в WordPress. CDN обычно берёт на себя:

  • отдачу статических файлов
  • сжатие
  • иногда агрегацию и минимизацию

Но CDN не отменяет FastCGI и Redis. Он дополняет: пока один слой ускоряет “тяжёлую” часть, другой слой ускоряет “лёгкую” статику.

Проверка скорости и диагностика проблем

Быстрая проверка ответов и заголовков

Проверь, какие заголовки отдаёт Nginx:

«`bash curl -I https://example.com/ «`

Смотри на:

  • Content-Type
  • Cache-Control для статики (для HTML часто другое)
  • X-FastCGI-Cache (если FastCGI включён)

Для статики проверяй отдельно, например:

«`bash curl -I https://example.com/wp-content/uploads/2024/01/image.jpg «`

Если видишь, что браузер продолжает перезагружать один и тот же файл, значит настройки expires/Cache-Control либо не применяются, либо файлы без нужных имён.

Логи Nginx и php-fpm: что искать при сбоях

Когда что-то не работает, обычно причина видна в логах.

Nginx:

  • /var/log/nginx/example.com-error.log
  • /var/log/nginx/example.com-access.log

PHP-FPM: открой slowlog, если включал. Если медленно — можно увидеть трассу. Даже без медленных запросов полезно посмотреть error logs php-fpm пула.

Также проверь права на каталог wp-content. Ошибки записи часто проявляются как “не обновляются плагины” или “не загружаются файлы”.

Частые ошибки при включении кеширования

1. Ошибки логина/админки после включения FastCGI

Обычно это происходит, когда правила skip_cache не исключили cookie, связанные с авторизацией, или исключения срабатывают неправильно. Решение: расширить список исключений по cookie и методам, и убедиться, что залогиненный пользователь не получает закешированную HTML-версию.

2. 404 для страниц с ЧПУ

Если tryfiles настроен неправильно, WordPress permalinks могут возвращать 404. Проверь блок location / в Nginx и наличие tryfiles $uri $uri/ /index.php?$args.

3. Слишком частые перегенерации

Если кеш всегда MISS, убедись, что:

  • сервер отдаёт коды, которые ты разрешил кешировать
  • нет строгих ограничений, которые обходят кеш
  • не включены плагины, которые подменяют ответы или всегда добавляют cookie

4. “Кеш не очищается” после изменений

FastCGI cache и объектный кеш живут по времени. В WordPress обычно есть механизмы очистки, но зависит от интеграции. Если у тебя есть процесс релизов, удобно иметь команду очистки кеша на уровне Nginx и Redis после обновлений.

Пакетный чек-лист перед запуском

  • Проверены базовые компоненты: Nginx работает, PHP-FPM отвечает, база подключается из WordPress
  • DNS настроен: домен указывает на IP VPS
  • SSL выдан Let’s Encrypt и продлится автоматически
  • Включены редиректы с HTTP на HTTPS
  • В Nginx корректно настроены:
  • try_files для WordPress
  • fastcgi_pass на правильный сокет PHP-FPM
  • обработка статики с Cache-Control и expires
  • Включён opcache в PHP
  • Включён FastCGI cache в Nginx с корректными bypass/exclude правилами
  • Включён объектный кеш (Redis) и он реально активен для WordPress
  • Проверены заголовки ответов:
  • есть ли X-FastCGI-Cache
  • корректные Cache-Control для статики
  • Логи Nginx и php-fpm готовы к диагностике (пути известны, конфиг протестирован nginx -t)

Заключение

Настройка WordPress на VPS в связке Nginx + SSL + кеширование даёт наибольший эффект, когда ты выстраиваешь систему слоями: FastCGI cache ускоряет выдачу страниц, opcache ускоряет PHP, Redis ускоряет чтение данных из WordPress, а корректные Cache-Control и gzip уменьшают время загрузки в браузере.

Если хочешь быстро проверить результат, сделай две вещи: убедись, что HTTPS стабилен (curl -I и лог ошибок пустой), и убедись, что X-FastCGI-Cache переходит в HIT на повторных запросах к одной и той же странице при одинаковых условиях. После этого можно точечно подгонять правила обхода кеша под плагины и роли пользователей.

От mpns_by