MHOSTMHOST

Как установить WordPress на VPS: Nginx, PHP, MySQL

WordPress на VPS работает быстрее, чем на обычном хостинге: ресурсы сервера закреплены за вами, а настройки PHP, базы данных и кеша можно менять под свой сайт. Никто не ограничивает число сайтов, плагины и нагрузку.

В инструкции ставим WordPress на связку LEMP: Linux, Nginx, MySQL и PHP. На всё уходит 20–30 минут. В конце у вас будет сайт на HTTPS с настроенными лимитами загрузки, базовой защитой и кешированием статики.

Требования:

  • VPS на Ubuntu 22.04, 24.04 или 26.04. Для небольшого сайта хватит 1 ГБ RAM, для интернет-магазина на WooCommerce берите от 2 ГБ.
  • Пользователь с sudo и настроенный firewall. Если сервер новый, сначала пройдите базовую настройку VPS.
  • Домен, A-записи которого (для example.com и www) указывают на IP сервера.

Во всех командах заменяйте example.com на свой домен.

Шаг 1. Установите Nginx, MySQL и PHP

Одна команда ставит веб-сервер, базу данных, PHP и модули, которые нужны WordPress:

sudo apt update

sudo apt install -y nginx mysql-server php-fpm php-mysql php-curl php-gd php-intl php-mbstring php-xml php-zip php-imagick

Откройте веб-порты в firewall:

sudo ufw allow 'Nginx Full'

Узнайте установленную версию PHP — она понадобится в конфиге Nginx:

ls /run/php/

В выводе будет файл вроде php8.3-fpm.sock. Число в названии зависит от версии Ubuntu: в 22.04 это 8.1, в 24.04 — 8.3. Дальше в статье используется 8.3, подставляйте свою версию.

Вместо MySQL можно поставить MariaDB (mariadb-server): WordPress работает с обеими, команды ниже одинаковые.

Шаг 2. Создайте базу данных

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

Сначала сгенерируйте пароль и сохраните его:

openssl rand -base64 24

Войдите в консоль MySQL:

sudo mysql

Выполните команды по одной, подставив свой пароль:

CREATE DATABASE wordpress DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

CREATE USER 'wpuser'@'localhost' IDENTIFIED BY 'ВАШ_ПАРОЛЬ';

GRANT ALL PRIVILEGES ON wordpress.* TO 'wpuser'@'localhost';

FLUSH PRIVILEGES;

EXIT;

Запомните три значения: имя базы wordpress, пользователь wpuser и пароль. Они понадобятся на шаге 6.

В Ubuntu база данных по умолчанию слушает только localhost и из интернета недоступна. Не открывайте порт 3306 в firewall.

Шаг 3. Скачайте WordPress

Скачайте последнюю версию с официального сайта и распакуйте в папку сайта:

cd /tmp

curl -LO https://wordpress.org/latest.tar.gz

tar xzf latest.tar.gz

sudo mkdir -p /var/www/example.com

sudo cp -a /tmp/wordpress/. /var/www/example.com/

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

Передайте файлы пользователю www-data, от имени которого работают Nginx и PHP:

sudo chown -R www-data:www-data /var/www/example.com

Без этого WordPress не сможет загружать картинки, ставить плагины и обновляться и будет спрашивать данные FTP.

Шаг 4. Настройте Nginx

Создайте конфиг сайта:

sudo nano /etc/nginx/sites-available/example.com

Вставьте содержимое. Замените домен и версию PHP в строке fastcgi_pass:

server {

listen 80;

server_name example.com www.example.com;

root /var/www/example.com;

index index.php;

client_max_body_size 64m;

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 ~* \.(css|js|jpg|jpeg|png|gif|webp|svg|ico|woff2)$ {

expires 30d;

}

location = /xmlrpc.php {

deny all;

}

}

Что делают ключевые строки:

  • try_files ... /index.php?$args — отправляет все запросы в WordPress. Без неё красивые ссылки вроде /blog/my-post/ отдают ошибку 404.
  • fastcgi_pass — передаёт PHP-файлы на обработку в PHP-FPM.
  • client_max_body_size 64m — разрешает загружать файлы до 64 МБ: темы, плагины, видео.
  • expires 30d — браузер кеширует картинки, стили и скрипты на 30 дней, повторные визиты загружаются быстрее.
  • location = /xmlrpc.php — закрывает устаревший интерфейс, через который боты подбирают пароли. Уберите этот блок, только если пользуетесь мобильным приложением WordPress или плагином Jetpack.

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

sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/

sudo nginx -t && sudo systemctl reload nginx

Шаг 5. Включите HTTPS

Получите бесплатный сертификат Let's Encrypt до установки WordPress: тогда сайт сразу запомнит адрес с https://, и его не придётся менять в настройках.

sudo apt install -y certbot python3-certbot-nginx

sudo certbot --nginx -d example.com -d www.example.com

Certbot сам допишет в конфиг настройки SSL, включит перенаправление на HTTPS и автопродление. Подробности и проверка автопродления — в статье как установить SSL-сертификат Let's Encrypt на Nginx.

Шаг 6. Завершите установку в браузере

Откройте https://example.com. Появится мастер установки WordPress:

  1. Выберите язык сайта и админки.
  2. Введите данные базы из шага 2: имя базы wordpress, пользователь wpuser, ваш пароль, сервер localhost. Префикс таблиц замените со стандартного wp_ на свой, например s7k_: это мешает типовым автоматическим атакам.
  3. Создайте администратора. Не называйте его admin: этот логин боты пробуют первым. Используйте пароль, который предложил WordPress, и сохраните его в менеджере паролей.
  4. Войдите в админку по адресу https://example.com/wp-admin/.

После входа откройте Настройки → Постоянные ссылки и выберите «Название записи». Ссылки вида /nazvanie-stati/ лучше для SEO, чем /?p=123.

Шаг 7. Настройте лимиты PHP и планировщик

Лимиты PHP. По умолчанию PHP принимает файлы до 2 МБ — этого не хватит даже на фотографию с телефона. Создайте файл с настройками (подставьте свою версию PHP):

printf '%s\n' 'upload_max_filesize = 64M' 'post_max_size = 64M' 'memory_limit = 256M' 'max_execution_time = 300' | sudo tee /etc/php/8.3/fpm/conf.d/99-wordpress.ini

sudo systemctl restart php8.3-fpm

Проверьте в админке: Медиафайлы → Добавить должно показывать максимальный размер 64 МБ.

Планировщик задач. WordPress выполняет фоновые задачи (отложенные публикации, проверку обновлений, рассылки) только в момент, когда кто-то открывает сайт. На сайте с малой посещаемостью задачи опаздывают, на нагруженном — замедляют страницы. Надёжнее запускать их системным cron.

Откройте файл настроек WordPress:

sudo nano /var/www/example.com/wp-config.php

Добавьте строку выше комментария /* That's all, stop editing! */:

define('DISABLE_WP_CRON', true);

Откройте cron пользователя www-data:

sudo crontab -u www-data -e

Добавьте запуск каждые 5 минут:

*/5 * * * * php /var/www/example.com/wp-cron.php > /dev/null 2>&1

Как защитить WordPress

WordPress — самая популярная CMS, поэтому её атакуют чаще всего. Почти все взломы происходят через устаревшие плагины и слабые пароли.

  • Обновляйте всё. Включите автообновление плагинов и тем в админке. Удалите плагины и темы, которыми не пользуетесь: отключённый плагин тоже можно взломать.
  • Ставьте плагины только из официального каталога. «Бесплатные» копии платных тем и плагинов с пиратских сайтов почти всегда содержат вредоносный код.
  • Включите двухфакторную аутентификацию для администраторов с помощью плагина.
  • Запретите редактор файлов в админке. Если злоумышленник попадёт в админку, он не сможет вписать свой код в тему. Добавьте в wp-config.php строку: define('DISALLOW_FILE_EDIT', true);
  • Ограничьте подбор паролей. Поставьте плагин для ограничения попыток входа или подключите Cloudflare с правилом для /wp-login.php. Как это сделать — в статье как защитить VPS от DDoS-атак.
  • Делайте бэкапы. Нужны две вещи: база данных и папка wp-content с картинками, темами и плагинами. Храните копии вне сервера.

Дамп базы одной командой:

sudo mysqldump wordpress | gzip > ~/wordpress-$(date +%F).sql.gz

Архив файлов сайта:

sudo tar -czf ~/wp-content-$(date +%F).tar.gz -C /var/www/example.com wp-content

Как ускорить WordPress

  • Поставьте плагин кеширования страниц. Это даёт самый большой эффект: готовая страница отдаётся без запуска PHP и запросов к базе.
  • Проверьте OPcache. Он кеширует скомпилированный PHP-код и обычно уже включён. Проверка: php -m | grep -i opcache.
  • Подключите объектный кеш Redis для магазинов и сайтов с большим числом запросов к базе: sudo apt install -y redis-server php-redis, затем плагин Redis Object Cache.
  • Сжимайте картинки. Изображения — самая тяжёлая часть страницы. Загружайте их в WebP и не шире, чем нужно дизайну.
  • Следите за числом плагинов. Каждый плагин добавляет код, который выполняется на каждой странице.

Частые ошибки

  • 502 Bad Gateway. Nginx не может подключиться к PHP. Чаще всего в fastcgi_pass указана не та версия PHP. Сверьте с выводом ls /run/php/ и проверьте службу: sudo systemctl status php8.3-fpm.
  • «Error establishing a database connection». Неверное имя базы, пользователь или пароль в wp-config.php, либо MySQL не запущен: sudo systemctl status mysql. На серверах с 1 ГБ RAM базу может убивать система из-за нехватки памяти — добавьте swap.
  • Страницы записей отдают 404, главная работает. В конфиге Nginx нет строки try_files $uri $uri/ /index.php?$args;.
  • 413 Request Entity Too Large при загрузке файла. Увеличьте client_max_body_size в Nginx и лимиты PHP из шага 7.
  • WordPress просит данные FTP при установке плагина. Файлы сайта принадлежат не тому пользователю. Повторите sudo chown -R www-data:www-data /var/www/example.com.
  • Белый экран. Ошибка в PHP, обычно из-за плагина или нехватки памяти. Причина будет в логе: sudo tail -n 50 /var/log/nginx/error.log.
  • Сайт открывается без стилей или браузер пишет о смешанном содержимом. WordPress установили по HTTP, а потом включили HTTPS. Исправьте оба адреса в Настройки → Общие на https://.

Чек-лист

Частые вопросы

Какой VPS нужен для WordPress? Блогу или сайту компании хватит 1 vCPU и 1 ГБ RAM. Для WooCommerce или сайта с тысячами посетителей в день берите 2 vCPU и 2–4 ГБ RAM.

Нужна ли панель управления? Нет. Всё из этой статьи делается в консоли, а сайтом вы управляете из админки WordPress. Панель удобна, если сайтов много и не хочется работать с конфигами вручную.

Можно ли разместить несколько сайтов на одном VPS? Да. Для каждого сайта повторите шаги 2–6: своя база, своя папка в /var/www и свой конфиг Nginx.

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

Как перенести сайт с обычного хостинга? Подготовьте сервер по шагам 1–5, затем перенесите папку wp-content и дамп базы или воспользуйтесь плагином миграции. Домен переключайте на новый IP в последнюю очередь, когда проверили сайт на новом сервере.