Хостинг с кнопкой «Установить WordPress» удобен, пока сайт один. Когда сайтов пять или двадцать, общий хостинг начинает мешать: лимиты на процессор, соседи по серверу, нет root-доступа. Свой VPS снимает эти ограничения и обычно стоит столько же.
Коротко
Что получится
- WordPress на своём сервере с HTTPS и отдельной базой данных
- Сервер, на который новый сайт добавляется за 5 минут
- Чек-лист защиты и резервных копий после запуска
Что понадобится
- VPS: 1 vCPU, 1-2 ГБ памяти, 20 ГБ SSD
- Ubuntu 24.04 LTS и доступ по SSH
- Домен с A-записью на IP сервера
Содержание
Как устроен сайт на своём сервере
Прежде чем ставить пакеты, полезно увидеть, из чего состоит результат. На сервере будут работать три программы, и у каждой своя роль.
| Компонент | Рекомендует WordPress | В Ubuntu 24.04 из коробки |
|---|---|---|
| PHP | 8.3 и новее | 8.3 |
| База данных | MariaDB 10.11+ или MySQL 8.0+ | MariaDB 10.11 |
| HTTPS | обязателен | Let's Encrypt через Certbot |
- 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
Каждый сайт с плагинами добавляет нагрузку. free -h покажет свободную память, htop - кто её занимает. Если свободно стабильно меньше 200 МБ, пора увеличивать тариф или разносить сайты.
Типичные ошибки и как их исправить
Nginx не находит PHP-FPM: в fastcgi_pass указана не та версия PHP.
Проверьте, какой сокет существует: ls /run/php/
Не совпадают имя базы, пользователь или пароль в wp-config.php.
Проверьте вход: mysql -u wpuser -p wordpress
После подключения Cloudflare выбран режим SSL Flexible, а сервер отправляет на HTTPS.
Режим Full (strict), подробнее в статье про Cloudflare
Не поднят client_max_body_size в Nginx или upload_max_filesize в PHP.
Лимиты должны совпадать в обоих местах
A-запись ещё не обновилась или указывает на другой IP.
dig +short example.com должен вернуть IP сервера
Когда ставить руками, а когда автоматизировать
Ручная установка стоит своих десяти минут, когда сайт один и хочется понимать, как он устроен. На десятом сайте это уже рутина, в которой легко забыть отдельного пользователя базы или проверку конфигурации.
| Общий хостинг | Свой VPS вручную | Свой VPS через Kesyio | |
|---|---|---|---|
| Контроль над сервером | нет root-доступа | полный | полный, сервер ваш |
| Время на один сайт | 5 минут | 10-15 минут | около 2 минут |
| Нужен ли Linux | нет | да | только IP и доступ |
| Несколько сайтов | ограничено тарифом | да, всё руками | да, по кнопке |
| Стоимость | тариф хостинга | только VPS | VPS плюс $2.5 за сайт |
Те же шаги, но на кнопке
- Подключение сервера. Указываете IP и доступ по SSH: Kesyio ставит Apache, MariaDB и PHP 8.2, при необходимости добавляет подкачку и открывает порты 80 и 443. Ubuntu, Debian или CentOS.
- Домен. Подключается через ваш аккаунт Cloudflare, DNS и HTTPS настраиваются без ручных записей.
- Сайт на WordPress. Отдельная база и пользователь, установка WordPress, права на файлы.
Вопросы и ответы
Сколько стоит 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.
- Каждому сайту - своя база и свой пользователь.
- Сразу после запуска настройте резервные копии и автообновления.


