WordPress на VPS нужен, когда shared уже тесен или когда вы не хотите делить PHP с соседями. Панель «в один клик» экономит час и прячет от вас диск, очередь и логи. Здесь — обратный путь: час руками, зато дальше вы чините причину, а не жмёте «восстановить сайт» вслепую.
Нужны: Ubuntu на VPS Tenku, SSH и файрвол, домен на A-записи сервера. HTTPS — по гайду Nginx и Let's Encrypt; ниже соберём PHP и WP так, чтобы тот гайд к нему стыковался. Переезд существующего WP — перенос сайта, не эта статья.
Тариф: для нормального WP с кэшем берите от 2 ГБ RAM, для WooCommerce спокойнее 4 ГБ. Почему — в выборе тарифа.
Пакеты
На Ubuntu 22.04 PHP 8.1 — разумный старт. На 24.04 часто 8.3. Не мешайте две ветки без нужды.
sudo apt update
sudo apt install -y nginx mariadb-server php-fpm php-mysql php-xml php-mbstring php-curl php-zip php-gd php-intl unzip curl
Проверьте сокет:
ls /run/php/
php-fpm8.1 -v
Подставьте свою версию везде ниже.
MariaDB: база только для этого сайта
sudo mysql_secure_installation
Ответы для свежей установки: unix_socket для root — ок, пароль root задайте, тестовые БД удалите, удалённый root запретите, reload привилегий — да.
sudo mysql
CREATE DATABASE wp CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'wp'@'localhost' IDENTIFIED BY 'СЛУЧАЙНЫЙ_ПАРОЛЬ_24_СИМВОЛА';
GRANT ALL ON wp.* TO 'wp'@'localhost';
FLUSH PRIVILEGES;
Пароль сохраните в менеджере. Пользователь wp@'%' с доступом из интернета не нужен. Порт 3306 в UFW не открывайте.
Каталог и загрузка WordPress
sudo mkdir -p /var/www/wp
sudo chown -R $USER:$USER /var/www/wp
cd /var/www/wp
curl -O https://wordpress.org/latest.tar.gz
tar --strip-components=1 -xf latest.tar.gz
rm latest.tar.gz
cp wp-config-sample.php wp-config.php
В wp-config.php пропишите DB_NAME, DB_USER, DB_PASSWORD, DB_HOST = localhost. Сгенерируйте ключи: api.wordpress.org/secret-key/1.1/salt и замените блок AUTH_KEY. Это не косметика: ключи по умолчанию из sample — подарок для угона сессий.
sudo chown -R www-data:www-data /var/www/wp
Nginx для WordPress
/etc/nginx/sites-available/wp (имя домена своё):
server {
listen 80;
server_name example.ru www.example.ru;
root /var/www/wp;
index index.php index.html;
client_max_body_size 32m;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php-fpm8.1.sock;
fastcgi_read_timeout 120s;
}
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff2)$ {
expires 7d;
access_log off;
}
location ~ /\. { deny all; }
}
Сокет ещё раз сверьте с ls /run/php. Включите сайт, nginx -t, reload. Затем выпускайте сертификат, как в гайде по Let's Encrypt.
Откройте http://example.ru/wp-admin/install.php и пройдите мастер: язык, название, пользователь админки не admin, пароль длинный, свой email.
Если мастер не открывается — error.log Nginx и права на каталог. Если открывается «скачать PHP файл» — не работает fastcgi_pass, не тот сокет.
PHP-FPM: чтобы админка не убила витрину
В пуле /etc/php/8.1/fpm/pool.d/www.conf для тарифа 2 ГБ разумные порядки:
pm = dynamic
pm.max_children = 8
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
На 1 ГБ max_children = 8 — путь в OOM. На 4 ГБ можно 12–16, если нет тяжёлой базы рядом. После правки sudo systemctl reload php8.1-fpm.
memory_limit в php.ini для WP 256M нормально, 128M мало для сборщиков страниц. Не ставьте 2G «на всякий»: один плагин съест всю машину.
wp-cli — чтобы не тыкать FTP
curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
chmod +x wp-cli.phar
sudo mv wp-cli.phar /usr/local/bin/wp
sudo -u www-data wp --info --path=/var/www/wp
Обновления ядра и плагинов:
sudo -u www-data wp core update --path=/var/www/wp
sudo -u www-data wp plugin update --all --path=/var/www/wp
Не запускайте wp от root: файлы станут root:root, WP перестанет писать в uploads.
Кэш, который реально снимает CPU
Сначала объектный кэш. Redis:
sudo apt install -y redis-server php-redis
sudo systemctl enable --now redis-server
sudo systemctl reload php8.1-fpm
Плагин «Redis Object Cache» в WP и enable. Проверьте wp cache type или статус плагина: drop-in должен быть активен.
Затем полностраничный кэш: либо плагин с аккуратными исключениями для корзины, либо fastcgi_cache в Nginx. Для WooCommerce не кэшируйте страницы с cookie корзины. Неверный кэш «у всех одна корзина» — хуже, чем медленный сайт.
CDN на картинки — хорошо. CDN на wp-admin — обычно плохо.
Укрепление без паранойи на 40 плагинов
DISALLOW_FILE_EDITtrue вwp-config.php— не нужны редакторы тем из админки.- Префикс таблиц не
wp_, если ставите с нуля: вwp-config.phpдо инсталлятора. - xmlrpc: если не используете приложение WordPress, закройте location
/xmlrpc.phpв Nginx (return 403). - Лимит попыток входа — плагин или fail2ban на лог WP. Штатный SSH fail2ban админку не закрывает.
- Обновления ядра не откладывайте на год. VPS не освобождает от патчей CMS.
- Не ставьте «все SEO-плагины сразу». Один нормальный, не пять.
Права: каталоги 755, файлы 644, владелец www-data. wp-config.php можно 640. 777 — признак, что сломался пользователь php-fpm, а не «требование хостинга».
Почта с сайта
mail() с VPS часто попадёт в спам. Настройте SMTP через нормального провайдера писем (транзакционные письма магазина). PTR и «свой Postfix на 1 ГБ» — отдельная профессия, не шаг 7 этой статьи.
Бэкап WordPress
Нужны файлы wp-content (минимум uploads + темы, которые меняли) и дамп базы. Плагин бэкапа на тот же диск — утешение. Как делать копии, которые восстанавливаются: бэкапы VPS.
Проверка восстановления: поднимите копию на поддомене раз в квартал. Пока не восстановили — бэкапа нет.
Когда установка закончена
Чеклист:
- Главная и постоянные ссылки (ЧПУ) работают, не только
?p=1. Для этого обязателенtry_filesнаindex.php. - Загрузка медиа пишет в
uploads. - HTTPS без смешанного контента: в «Настройки → Общие» URL с
https://. cron: WP-Cron на слабом трафике ненадёжен. Системный cron:/5 * www-data php /var/www/wp/wp-cron.php.htopв покое не ест всю RAM.
Дальше контент и шаблон. Если после набора плагинов админка оплыла — не докупайте ядра сразу, снимите профиль: почему VPS тормозит. Часто виноват один плагин статистики, не тариф Tenku.