Журнал Tenku

WordPress на VPS: Nginx, PHP, MariaDB и запуск без панели

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_EDIT true в 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.

Нужен сервер под задачу?

Выберите тариф и локацию — VPS появится в кабинете.

Смотреть тарифы