Как настроить VPS с нуля под WordPress — пошаговый гайд
VPS отличается от shared-хостинга уровнем контроля: вы сами управляете версиями PHP, PHP-FPM, Nginx, базой данных, firewall, кэшем и системными настройками. Но вместе с этим на вас ложатся обновления, резервное копирование и мониторинг.
Когда нужен VPS
- Нужен контроль над сервером - на shared-хостинге нельзя самостоятельно менять конфигурацию Nginx, PHP-FPM, системный firewall и другие параметры.
- Сайт упирается в ограничения shared-хостинга - при росте нагрузки могут возникать очереди PHP-запросов, ограничения CPU или памяти, 502/504 и другие проблемы. На VPS параметры можно диагностировать и изменять самостоятельно.
- Нужны дополнительные сервисы - Redis, собственный cron, дополнительные системные службы, специфические PHP-расширения или фоновые процессы проще запускать на VPS.
- Растёт нагрузка на базу данных - WooCommerce и сайты с большим количеством записей могут требовать настройки MariaDB/MySQL, PHP-FPM и серверных ресурсов, которые недоступны на обычном shared-тарифе.
Какие ресурсы выбрать
Практическая стартовая конфигурация для небольшого WordPress:
- 2 vCPU;
- 2 ГБ RAM;
- 20-30 ГБ NVMe;
- Ubuntu 24.04 LTS;
- Nginx;
- PHP 8.3;
- MariaDB 10.11+.
WordPress рекомендует PHP 8.3 или новее и MariaDB 10.11+ либо MySQL 8.0+. Это актуальные рекомендации на момент подготовки статьи, а не минимальные технические требования.
Ubuntu 24.04 LTS остаётся поддерживаемой LTS-версией со стандартной поддержкой до 2029 года. Ubuntu 26.04 LTS уже выпущена в апреле 2026 года (стандартная поддержка до 2031 года) и также подходит для новых серверов. В этом гайде используется Ubuntu 24.04 LTS как стабильная и хорошо документированная база - используемые здесь версии PHP и пакетов соответствуют её стандартным репозиториям.
Сколько нужно RAM
2 ГБ - нормальная стартовая конфигурация для небольшого или среднего WordPress. Для WooCommerce, большого каталога, нескольких сайтов или высокой нагрузки лучше начинать с 4 ГБ.
Подготовка Ubuntu
Обновите систему до установки основного ПО - свежая база пакетов это первый шаг настойки:
apt update
apt upgrade -y
SSH и firewall
Пользователь и SSH-ключ
Подключитесь к серверу по SSH и создайте отдельного пользователя:
ssh root@IP_сервера
adduser deploy
usermod -aG sudo deploy
Перед отключением root-входа настройте SSH-ключ для пользователя deploy. Если ключ root уже используется, его можно скопировать:
mkdir -p /home/deploy/.ssh
cp /root/.ssh/authorized_keys /home/deploy/.ssh/authorized_keys
chown -R deploy:deploy /home/deploy/.ssh
chmod 700 /home/deploy/.ssh
chmod 600 /home/deploy/.ssh/authorized_keys
Если root подключается другим способом, публичный ключ нужно добавить в /home/deploy/.ssh/authorized_keys вручную. Проверьте, что пользователь и ключи на месте:
getent passwd deploy
ls -la /home/deploy/.ssh
Проверьте вход с нового пользователя: ssh deploy@IP_сервера. Только после успешной проверки отключите root-вход и парольную авторизацию в /etc/ssh/sshd_config:
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
sshd -t
systemctl reload ssh
Firewall
Установите UFW и разрешите SSH, HTTP и HTTPS:
apt install -y ufw
ufw allow OpenSSH
ufw allow 'Nginx Full'
ufw enable
Проверьте: ufw status
Swap
Swap не является обязательным условием для WordPress, но может быть полезен как аварийный запас памяти на небольшом VPS. Для сервера с 2 ГБ RAM можно создать 2 ГБ swap:
fallocate -l 2G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
Проверка: swapon --show и free -h
Установка Nginx, PHP-FPM и MariaDB
Установите веб-стек. Certbot ставится отдельно, в разделе HTTPS:
apt install -y nginx mariadb-server php-fpm php-mysql php-cli php-curl php-gd php-mbstring php-xml php-zip php-imagick
Проверьте версии: php -v, nginx -v, mariadb --version. На Ubuntu 24.04 штатная версия PHP - 8.3, что соответствует рекомендации WordPress.
Убедитесь, от какого пользователя работает PHP-FPM - обычно это www-data, и от этого зависит схема прав на файлы дальше:
ps aux | grep '[p]hp-fpm'
Создание базы данных
Откройте MariaDB и создайте базу с отдельным пользователем:
mariadb
CREATE DATABASE wordpress CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'wpuser'@'localhost' IDENTIFIED BY 'сложный_пароль';
GRANT ALL PRIVILEGES ON wordpress.* TO 'wpuser'@'localhost';
FLUSH PRIVILEGES;
EXIT;
Пароль сохраните в менеджере паролей - он потребуется при настройке wp-config.php.
Установка WordPress
Создайте каталог сайта и скачайте WordPress-архив:
mkdir -p /var/www/example.ru/public_html
cd /var/www/example.ru/public_html
wget https://ru.wordpress.org/latest-ru_RU.tar.gz
tar xzf latest-ru_RU.tar.gz --strip-components=1
rm latest-ru_RU.tar.gz
Базовые права на файлы и каталоги - далее, в отдельном разделе, владелец и группа настраиваются под схему PHP-FPM:
find /var/www/example.ru/public_html -type d -exec chmod 755 {} \;
find /var/www/example.ru/public_html -type f -exec chmod 644 {} \;
Создайте конфигурацию и заполните её: cp wp-config-sample.php wp-config.php, затем nano wp-config.php. Укажите DB_NAME, DB_USER, DB_PASSWORD, DB_HOST. Уникальные значения Authentication Unique Keys and Salts можно получить через официальный генератор WordPress и вставить в wp-config.php - реальные ключи в статьях и туториалах не публикуют.
Права на файлы
Для простого VPS допустима схема, при которой веб-сервер владеет каталогом WordPress, а SSH-пользователь получает доступ через группу. В этом гайде используем схему www-data:
chown -R www-data:www-data /var/www/example.ru/public_html
Но тогда deploy не сможет без дополнительных прав редактировать файлы. Поэтому конкретную схему прав выбирают отдельно, особенно если WordPress должен самостоятельно обновлять ядро, плагины и темы. Права 755/644 не решают вопрос записи в wp-content - владелец и группа должны соответствовать выбранной схеме PHP-FPM.
Конфигурация Nginx
Создайте конфигурацию /etc/nginx/sites-available/example.ru с базовой защитой служебных файлов:
server {
listen 80;
server_name example.ru www.example.ru;
root /var/www/example.ru/public_html;
index index.php;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
}
location ~* \.(js|css|png|jpg|jpeg|gif|svg|webp|woff2)$ {
expires 30d;
access_log off;
}
location ~ /\.(?!well-known) {
deny all;
}
location ~* /(?:uploads|files)/.*\.php$ {
deny all;
}
location ~* /(?:\.git|\.env|composer\.(?:json|lock)|wp-config\.php) {
deny all;
}
}
Активируйте сайт, уберите стандартный дефолтный сайт Ubuntu (он мешает диагностике при обращении по IP или неправильному Host) и перезагрузите Nginx:
ln -s /etc/nginx/sites-available/example.ru /etc/nginx/sites-enabled/example.ru
rm -f /etc/nginx/sites-enabled/default
nginx -t
systemctl reload nginx
PHP-FPM
Основной конфигурационный файл пула - /etc/php/8.3/fpm/pool.d/www.conf. Пример стартовой конфигурации:
pm = dynamic
pm.max_children = 8
pm.start_servers = 2
pm.min_spare_servers = 2
pm.max_spare_servers = 4
pm.max_requests = 500
Это только пример, а не рекомендация для всех VPS с 2 ГБ RAM. pm.max_children нельзя надёжно определить по объёму памяти: на сервере одновременно работают MariaDB, Nginx, системные процессы и другие службы. Значение корректируют по фактическому потреблению памяти PHP-FPM и наличию свободной RAM.
После настройки: systemctl restart php8.3-fpm.
DNS
Перед выпуском сертификата домен example.ru и www.example.ru должны резолвиться на IP VPS. Проверить это можно с сервера или локального компьютера:
dig +short example.ru
dig +short www.example.ru
Certbot использует HTTP/HTTPS-проверку домена, поэтому DNS должен быть настроен корректно до выпуска сертификата.
HTTPS: Let's Encrypt
Установка Certbot
Установите Certbot способом, рекомендованным для выбранной версии Ubuntu. Для Ubuntu официальная инструкция Certbot в настоящее время рекомендует snap-пакет:
snap install --classic certbot
ln -s /snap/bin/certbot /usr/local/bin/certbot
После установки команда certbot --nginx автоматически получит сертификат и изменит конфигурацию Nginx:
certbot --nginx -d example.ru -d www.example.ru
Проверьте сертификаты: certbot certificates
Автоматическое продление
Механизм автоматического продления зависит от способа установки Certbot: apt-пакет создаёт systemd timer, snap-версия использует собственный механизм. Проверьте, что настроил ваш пакет, и обязательно выполните тест:
certbot renew --dry-run
OPcache и gzip
OPcache устанавливается вместе с PHP-пакетом и может быть уже включён в конфигурации дистрибутива - наличие пакета и фактическое состояние OPcache это разные вещи. Проверять OPcache нужно именно в конфигурации PHP-FPM, потому что CLI и FPM могут использовать разные конфигурации PHP:
php -r 'var_dump(opcache_get_status(false));'
Для PHP 8.3 FPM на Ubuntu конфигурация обычно находится в /etc/php/8.3/fpm/conf.d/ (например, 10-opcache.ini) или задаётся в основном конфигурационном файле PHP. Базовые параметры:
opcache.enable=1
opcache.memory_consumption=128
opcache.max_accelerated_files=10000
opcache.validate_timestamps=1
opcache.revalidate_freq=2
Для обычного VPS с WordPress безопаснее оставить opcache.validate_timestamps=1: OPcache автоматически обнаруживает изменения PHP-файлов. Значение 0 допустимо в контролируемом production-окружении, но после каждого изменения PHP-кода потребуется самостоятельно сбрасывать OPcache или перезапускать PHP-FPM. После изменения конфигурации: systemctl restart php8.3-fpm.
Gzip в /etc/nginx/nginx.conf сжимает текстовые ресурсы:
gzip on;
gzip_types
text/plain
text/css
application/javascript
application/json
application/xml
image/svg+xml;
nginx -t
systemctl reload nginx
Gzip уменьшает объём передаваемых данных. Это не заменяет полноценное кэширование и оптимизацию WordPress.
Проверка результата
Проверьте состояние сервисов и типичные маршруты WordPress:
systemctl status nginx php8.3-fpm mariadb
curl -sI https://example.ru | head
curl -s https://example.ru/robots.txt
curl -sI https://example.ru/wp-admin/ | head
php -r 'echo PHP_VERSION . PHP_EOL;'
mariadb -u wpuser -p -e "SELECT 1" wordpress
Если установлен WP-CLI и используется соответствующая версия WordPress:
wp core verify-checksums
Эта команда проверяет файлы ядра WordPress по официальным контрольным суммам. Она не проверяет произвольные файлы wp-content, плагины и темы.
После этого откройте сайт и /wp-admin/, проверьте HTTPS, загрузку изображений, обновление записей и работу основных функций. Системный cron вместо wp-cron.php можно настроить отдельно - это особенно полезно для сайтов с регулярными задачами и высокой нагрузкой. При переходе обычно отключают выполнение WP-Cron при каждом запросе и запускают wp-cron.php по расписанию.
Что настроить после установки
Минимальный следующий этап: автоматические резервные копии базы и файлов на отдельное хранилище, мониторинг RAM/CPU/диска, системные обновления, системный cron, Redis при необходимости, rate limiting и дополнительная защита SSH, например fail2ban.
Когда этой базовой конфигурации недостаточно
Эта конфигурация рассчитана на один небольшой или средний WordPress-сайт и не является универсальным production-тюнингом. Для нескольких сайтов, WooCommerce, высокой нагрузки, больших баз данных и большого количества PHP-запросов параметры PHP-FPM, MariaDB, кэша и дисковой подсистемы нужно подбирать по фактической нагрузке.
1 ГБ RAM - WordPress технически может работать на VPS с 1 ГБ RAM, но для полноценного стека Nginx + PHP-FPM + MariaDB запас памяти будет небольшим. Для обычного рабочего сайта разумнее начинать с 2 ГБ RAM, а для WooCommerce и тяжёлых плагинов рассматривать 4 ГБ и выше.
Большой WooCommerce - сайт с десятками тысяч товаров не обязательно требует одного конкретного набора настроек. При такой нагрузке необходимо измерять узкие места: запросы к базе данных, PHP, object cache, диск, внешние API и генерацию страниц. Сам перенос на VPS проблему не решает.
Высокая нагрузка - при большом количестве запросов потребуются дополнительные настройки:
- FastCGI cache;
- Redis Object Cache;
- PHP-FPM и MariaDB тюнинг;
- CDN;
- rate limiting;
- мониторинг CPU/RAM/IO;
- оптимизация самого WordPress.
Нет опыта администрирования - VPS это не просто более мощный хостинг. Нужно самостоятельно следить за обновлениями, резервными копиями, безопасностью, диском, памятью и доступностью сервисов. Если заниматься сервером самостоятельно не хочется, managed VPS или хороший shared-хостинг может быть практичнее.
Частые вопросы
Базовая задача VPS - не получить максимально возможную скорость любой ценой, а получить контролируемую среду: корректно настроенные Nginx, PHP-FPM и MariaDB, HTTPS, SSH-доступ, firewall, права на файлы и резервное копирование. Оптимизацию Redis, FastCGI cache, PHP-FPM и MariaDB имеет смысл выполнять после измерения фактической нагрузки.
VPS для WordPress - настрою с нуля?
Настрою сервер целиком: Nginx, PHP-FPM, MariaDB, SSL, права на файлы, кэш и бэкапы. Сайт переедет с shared-хостинга без простоя.