Как развернуть WordPress на своём сервере за 10 минут

Пять шагов и около двадцати команд: Ubuntu 24.04, Nginx, PHP 8.3, MariaDB, бесплатный SSL и WP-CLI. Если домен уже указывает на сервер, установка займёт 10-15 минут.

Сервер, соединённый кабелями с окном браузера, где собирается сайт

Хостинг с кнопкой «Установить WordPress» удобен, пока сайт один. Когда сайтов пять или двадцать, общий хостинг начинает мешать: лимиты на процессор, соседи по серверу, нет root-доступа. Свой VPS снимает эти ограничения и обычно стоит столько же.

Коротко

Что получится

  • WordPress на своём сервере с HTTPS и отдельной базой данных
  • Сервер, на который новый сайт добавляется за 5 минут
  • Чек-лист защиты и резервных копий после запуска

Что понадобится

  • VPS: 1 vCPU, 1-2 ГБ памяти, 20 ГБ SSD
  • Ubuntu 24.04 LTS и доступ по SSH
  • Домен с A-записью на IP сервера
  1. Шаг 1Подготовка сервера1-2 мин
  2. Шаг 2Nginx, PHP и MariaDB2 мин
  3. Шаг 3База данных1 мин
  4. Шаг 4Nginx и SSL2-3 мин
  5. Шаг 5WordPress2 мин
Содержание
  1. Как это устроено
  2. Шаг 1. Подготовка сервера
  3. Шаг 2. Nginx, PHP и MariaDB
  4. Шаг 3. База данных
  5. Шаг 4. Nginx и SSL
  6. Шаг 5. WordPress
  7. После установки
  8. Второй сайт на сервере
  9. Типичные ошибки
  10. Руками или автоматически
  11. Вопросы и ответы
  12. Итог

Как устроен сайт на своём сервере

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

Путь запроса: браузер, Nginx, PHP-FPM с WordPress, MariaDB, файлы на диске Ваш VPS · Ubuntu 24.04 Посетитель браузер Nginx веб-сервер и HTTPS PHP-FPM запускает WordPress MariaDB записи и настройки картинки, CSS, JS HTTPS .php SQL статика
Nginx принимает запрос. Страницы собирает WordPress через PHP-FPM, данные лежат в MariaDB, а картинки и стили Nginx отдаёт с диска сам.
КомпонентРекомендует WordPressВ Ubuntu 24.04 из коробки
PHP8.3 и новее8.3
База данныхMariaDB 10.11+ или MySQL 8.0+MariaDB 10.11
HTTPSобязателенLet's Encrypt через Certbot
Как выбрать VPS
  • SSD или NVMe-диск: на HDD WordPress заметно тормозит в админке
  • Дата-центр ближе к вашей аудитории
  • Снимки сервера: снимок перед обновлением плагинов спасает от вечера восстановления
Подсвеченные значения замените на свои

Во всех командах ниже example.com - это ваш домен, а пароли и имена пользователей придумайте сами.

1Подготовка сервера1-2 мин

Подключаемся к серверу и обновляем пакеты:

ssh root@IP_СЕРВЕРА
apt update && apt upgrade -y

На VPS с 1 ГБ памяти установка пакетов и обновления плагинов иногда падают из-за нехватки памяти. Файл подкачки на 2 ГБ снимает проблему:

fallocate -l 2G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
echo '/swapfile none swap sw 0 0' >> /etc/fstab

Если у сервера 2 ГБ памяти и больше, файл подкачки можно не создавать.

2Nginx, PHP и MariaDB2 мин

Ставим веб-сервер, базу данных и расширения PHP, которые нужны WordPress и популярным плагинам. Nginx выбран за экономный расход памяти, а PHP работает отдельным процессом через PHP-FPM.

apt install -y nginx mariadb-server \
  php8.3-fpm php8.3-mysql php8.3-curl php8.3-gd php8.3-mbstring \
  php8.3-xml php8.3-zip php8.3-intl

Закрываем всё, кроме SSH и веб-трафика:

ufw allow OpenSSH
ufw allow 'Nginx Full'
ufw --force enable
Порядок важен

Сначала разрешаем SSH, потом включаем файрвол. Иначе можно закрыть доступ к серверу самому себе.

Поднимаем лимит загрузки файлов: по умолчанию PHP не пропустит картинку тяжелее 2 МБ.

sed -i 's/^upload_max_filesize.*/upload_max_filesize = 64M/; s/^post_max_size.*/post_max_size = 64M/' /etc/php/8.3/fpm/php.ini
systemctl restart php8.3-fpm
Проверка

Команда systemctl is-active nginx php8.3-fpm mariadb должна вывести active три раза.

3База данных для WordPress1 мин

В Ubuntu пользователь root входит в MariaDB без пароля, через системную учётную запись. Создаём базу и отдельного пользователя только для этого сайта:

mysql -u root <<'SQL'
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;
SQL

Почему utf8mb4

Старая кодировка utf8 превращает эмодзи и редкие символы в вопросительные знаки.

Зачем отдельный пользователь

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

4Nginx для домена и SSL2-3 мин

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

mkdir -p /var/www/example.com
chown www-data:www-data /var/www/example.com
nano /etc/nginx/sites-available/example.com
server {
    listen 80;
    listen [::]:80;
    server_name example.com www.example.com;

    root /var/www/example.com;
    index index.php;
    client_max_body_size 64m;

    # красивые ссылки вида /blog/zapis/
    location / {
        try_files $uri $uri/ /index.php?$args;
    }

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

    # закрывает .git и .env, но оставляет .well-known для Let's Encrypt
    location ~ /\.(?!well-known) {
        deny all;
    }
}

Включаем сайт и проверяем конфигурацию:

ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
nginx -t && systemctl reload nginx
Проверка

nginx -t пишет syntax is ok и test is successful. Если нет, в сообщении будет номер строки с ошибкой.

Перед сертификатом

A-запись домена уже должна указывать на сервер. Проверьте: dig +short example.com возвращает IP вашего сервера.

Выпускаем сертификат. Certbot сам допишет HTTPS в конфигурацию и включит перенаправление с HTTP. Продлевается сертификат тоже сам.

apt install -y certbot python3-certbot-nginx
certbot --nginx -d example.com -d www.example.com --redirect

5Установка WordPress2 мин

WP-CLI - официальная консольная утилита WordPress. С ней не нужно скачивать архив и проходить мастер установки в браузере.

curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
chmod +x wp-cli.phar
mv wp-cli.phar /usr/local/bin/wp

Устанавливаем WordPress от имени веб-сервера, чтобы у файлов сразу были правильные права:

cd /var/www/example.com
sudo -u www-data wp core download --locale=ru_RU
sudo -u www-data wp config create --dbname=wordpress --dbuser=wpuser --prompt=dbpass
sudo -u www-data wp core install --url=https://example.com --title="Мой сайт" \
  --admin_user=ИМЯ_АДМИНА --admin_email=you@example.com --prompt=admin_password
Готово

Откройте https://example.com/wp-admin: WordPress установлен. Пароли, введённые через --prompt, не попали в историю команд.

Что сделать сразу после установки

Сайт работает, но до публикации стоит потратить ещё 10 минут. Отмечайте пункты, отметки сохранятся в этом браузере.

Ежедневная выгрузка базы - одна строка в crontab -e под root. Каталог /root/backups создайте заранее.

0 3 * * * /usr/local/bin/wp --path=/var/www/example.com db export /root/backups/wp-$(date +\%F).sql --allow-root

Кэширование: быстрый выигрыш в скорости

Без кэша WordPress на каждый запрос заново запускает PHP и обращается к базе. На маленьком сервере это первое узкое место.

Кэш страниц

Плагин вроде WP Super Cache сохраняет готовые HTML-страницы: повторные посетители получают их без PHP и базы.

Кэш объектов

Redis держит результаты запросов к базе в памяти: apt install -y redis-server php8.3-redis и плагин Redis Object Cache.

Второй и следующие сайты на том же сервере

Серверная часть ставится один раз. Для нового сайта повторяются только три шага из пяти, около пяти минут.

Уже есть на сервере

  • Nginx, PHP 8.3 и MariaDB
  • Файрвол и файл подкачки
  • Certbot и WP-CLI

Для каждого нового сайта

  • Шаг 3: новая база и пользователь с другим паролем
  • Шаг 4: каталог, файл в sites-available, сертификат
  • Шаг 5: установка WordPress в новом каталоге
Следите за памятью

Каждый сайт с плагинами добавляет нагрузку. free -h покажет свободную память, htop - кто её занимает. Если свободно стабильно меньше 200 МБ, пора увеличивать тариф или разносить сайты.

Типичные ошибки и как их исправить

502 Bad Gateway

Nginx не находит PHP-FPM: в fastcgi_pass указана не та версия PHP.

Проверьте, какой сокет существует: ls /run/php/

Ошибка соединения с базой

Не совпадают имя базы, пользователь или пароль в wp-config.php.

Проверьте вход: mysql -u wpuser -p wordpress

Бесконечный редирект

После подключения Cloudflare выбран режим SSL Flexible, а сервер отправляет на HTTPS.

Режим Full (strict), подробнее в статье про Cloudflare

413 Request Entity Too Large

Не поднят client_max_body_size в Nginx или upload_max_filesize в PHP.

Лимиты должны совпадать в обоих местах

Certbot не проверяет домен

A-запись ещё не обновилась или указывает на другой IP.

dig +short example.com должен вернуть IP сервера

Когда ставить руками, а когда автоматизировать

Ручная установка стоит своих десяти минут, когда сайт один и хочется понимать, как он устроен. На десятом сайте это уже рутина, в которой легко забыть отдельного пользователя базы или проверку конфигурации.

Общий хостингСвой VPS вручнуюСвой VPS через Kesyio
Контроль над серверомнет root-доступаполныйполный, сервер ваш
Время на один сайт5 минут10-15 минутоколо 2 минут
Нужен ли Linuxнетдатолько IP и доступ
Несколько сайтовограничено тарифомда, всё рукамида, по кнопке
Стоимостьтариф хостингатолько VPSVPS плюс $2.5 за сайт
Kesyio

Те же шаги, но на кнопке

  1. Подключение сервера. Указываете IP и доступ по SSH: Kesyio ставит Apache, MariaDB и PHP 8.2, при необходимости добавляет подкачку и открывает порты 80 и 443. Ubuntu, Debian или CentOS.
  2. Домен. Подключается через ваш аккаунт Cloudflare, DNS и HTTPS настраиваются без ручных записей.
  3. Сайт на WordPress. Отдельная база и пользователь, установка WordPress, права на файлы.
< 2 мину половины установок за последние 60 дней, от запуска до готового сайта

Вопросы и ответы

Сколько стоит VPS для WordPress?

Для одного небольшого сайта хватает сервера с 1 vCPU и 1-2 ГБ памяти: у большинства провайдеров это несколько долларов в месяц. На сервере с 2 ГБ памяти без проблем работают несколько сайтов с умеренной посещаемостью.

Что лучше для WordPress: Nginx или Apache?

Оба варианта рабочие. Nginx расходует меньше памяти и быстрее отдаёт статику, поэтому выигрывает на маленьких серверах. Apache понимает файлы .htaccess, на которые рассчитаны многие плагины. Для одного сайта разница почти незаметна.

Можно ли установить WordPress без домена?

Да, по IP-адресу сервера. Но сертификат Let's Encrypt на IP не выпускается, а смена адреса сайта потом потребует замены ссылок в базе. Лучше сразу ставить на домен.

Нужна ли панель управления вроде ispmanager?

Нет. Панель удобна, если на сервере много сайтов на разных CMS. Но она занимает память и сама требует обновлений. Для сайтов на WordPress хватает WP-CLI.

Как перенести существующий сайт на свой VPS?

Установите WordPress по этой инструкции, перенесите wp-content и выгрузку базы, затем замените адрес командой wp search-replace. Пошагово - в статье о переносе сайта без простоя.

Итог

  • Установка укладывается в пять шагов: система, Nginx с PHP и MariaDB, база, домен с SSL, WordPress через WP-CLI.
  • Каждому сайту - своя база и свой пользователь.
  • Сразу после запуска настройте резервные копии и автообновления.