WordPress на LEMP (nginx, MariaDB, PHP)
Пошаговая установка сайта WordPress на сервер Ubuntu или Debian с HTTPS, ежедневными резервными копиями и базовыми настройками.
На этой странице
В этом руководстве описана установка сайта WordPress на стек LEMP: Linux, nginx (веб-сервер), MariaDB (база данных) и PHP-FPM, с бесплатным HTTPS-сертификатом Let's Encrypt. Все команды выполняются на сервере под пользователем root в SSH-сессии: Подключение к серверу по SSH (Windows, macOS, Linux). IP-адрес сервера указан в панели app.blackbox.md: «Инфраструктура» → «Мои серверы» (app.blackbox.md/my-servers), поле «IP» на карточке сервера.
Доступно: владельцу VPS BLACKBOX без панели управления, с root-доступом по SSH. Шаги написаны для Ubuntu 24.04 LTS и Debian 12; отличия для AlmaLinux 9 и CentOS Stream 9 собраны в отдельном разделе. На тарифе «VPS hosting» с панелью управления сайты создают в самой панели: Тарифы «VPS hosting» с панелью управления.
Какой тариф и какую систему выбрать
Для обычного сайта хорошая отправная точка — тариф Standard S или Standard M:
| Тариф | vCPU | RAM | Диск | Цена | Подходит для |
|---|---|---|---|---|---|
| Standard S | 1 | 2 GB | 20 GB | 443 MDL/мес. | сайт-визитка, блог |
| Standard M | 2 | 4 GB | 40 GB | 578 MDL/мес. | интернет-магазин, сайт с большим числом плагинов |
Все тарифы — в статье Тарифы VPS: как выбрать. Когда сайт вырастет, перейдите на более мощный тариф: Апгрейд сервера: переход на больший тариф.
В качестве операционной системы выберите Ubuntu 24.04 LTS (при заказе она выбрана по умолчанию) или Debian 12. В Ubuntu 20.04 LTS и Debian 11 устанавливается PHP 7.4, который проект PHP больше не обновляет: для нового сайта эти системы не подходят.
Перед установкой проверьте:
- A-записи для
ДОМЕНиwww.ДОМЕНуказывают на IP-адрес сервера, иначе HTTPS-сертификат не будет выпущен: Как направить домен на сервер; - порты 80 и 443 открыты. Сетевой фильтр BLACKBOX по умолчанию их пропускает, а файрвол в системе (ufw или firewalld) на новом сервере не включён. Если вы его включили, разрешите порты 80 и 443 и в нём: Файрвол: сетевая фильтрация и ufw/firewalld на сервере.
Во всех командах замените ДОМЕН на имя сайта без www, например example.com.
Шаг 1. Установите nginx, MariaDB и PHP
Обновите список пакетов и установите компоненты. На Ubuntu и Debian службы запускаются автоматически сразу после установки.
apt update apt install -y nginx mariadb-server php-fpm php-mysql php-curl php-gd php-mbstring php-xml php-zip php-intl curlУзнайте установленную версию PHP по имени сокета PHP-FPM:
ls /run/php/Система PHP Сокет PHP-FPM Служба PHP-FPM Ubuntu 24.04 LTS 8.3 /run/php/php8.3-fpm.sockphp8.3-fpmDebian 12 8.2 /run/php/php8.2-fpm.sockphp8.2-fpmUbuntu 22.04 LTS 8.1 /run/php/php8.1-fpm.sockphp8.1-fpmВажно В примерах используется PHP 8.3 (Ubuntu 24.04 LTS). В другой системе замените
8.3на свою версию везде: в путях/etc/php/8.3/…, в имени службыphp8.3-fpmи в сокете в конфигурации nginx.Увеличьте максимальный размер файлов, загружаемых в WordPress (по умолчанию PHP принимает не больше 2 MB), и перезапустите PHP-FPM:
printf 'upload_max_filesize = 64M\npost_max_size = 64M\n' > /etc/php/8.3/fpm/conf.d/99-wordpress.ini systemctl restart php8.3-fpm
Шаг 2. Создайте базу данных
Запустите скрипт защиты MariaDB и ответьте на вопросы, как в таблице:
mariadb-secure-installationВопрос Ответ Enter current password for root (enter for none):Enter Switch to unix_socket authentication [Y/n]nChange the root password? [Y/n]n, если скрипт написал «You already have your root account protected, so you can safely answer 'n'.»; иначеYи надёжный парольRemove anonymous users?,Disallow root login remotely?,Remove test database and access to it?,Reload privilege tables now?Yна всеПользователь
rootв MariaDB входит через системную учётную записьroot(аутентификацияunix_socket) командойmariadb, без пароля.Сгенерируйте надёжный пароль для пользователя базы данных и сохраните его. Ниже он обозначен как
ПАРОЛЬ_БД:openssl rand -hex 20Откройте консоль MariaDB:
mariadbСоздайте базу данных
wordpressи пользователяwpuserс правами только на эту базу, затем выйдите: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; EXIT;
Пользователь wpuser может подключаться только с самого сервера (localhost). Не открывайте порт 3306 для доступа из интернета. Подробнее о MariaDB: Базы данных: MariaDB/MySQL и PostgreSQL.
Шаг 3. Скопируйте файлы WordPress
Скачайте последнюю версию с wordpress.org и распакуйте её в
/var/www/ДОМЕН:mkdir -p /var/www/ДОМЕН cd /tmp curl -O https://wordpress.org/latest.tar.gz tar -xzf latest.tar.gz -C /var/www/ДОМЕН --strip-components=1 rm latest.tar.gzСоздайте
wp-config.phpи впишите в него данные базы. ЗаменитеПАРОЛЬ_БДпаролем из шага 2.cd /var/www/ДОМЕН cp wp-config-sample.php wp-config.php sed -i "s/database_name_here/wordpress/; s/username_here/wpuser/; s/password_here/ПАРОЛЬ_БД/" wp-config.phpЗамените 8 ключей безопасности (salts) уникальными значениями от сервиса WordPress.org:
curl -s https://api.wordpress.org/secret-key/1.1/salt/ -o /tmp/wp-salts.txt sed -i '/put your unique phrase here/d' wp-config.php sed -i '/#@-/r /tmp/wp-salts.txt' wp-config.php rm /tmp/wp-salts.txtПроверьте результат. В выводе должны быть 3 строки
DB_с вашими данными и 8 строк, отAUTH_KEYдоNONCE_SALT, с длинными случайными значениями.grep -E "DB_(NAME|USER|PASSWORD)|_KEY'|_SALT'" wp-config.phpПередайте файлы пользователю
www-data, от имени которого работают nginx и PHP-FPM, и выставьте права:chown -R www-data:www-data /var/www/ДОМЕН find /var/www/ДОМЕН -type d -exec chmod 755 {} + find /var/www/ДОМЕН -type f -exec chmod 644 {} + chmod 640 /var/www/ДОМЕН/wp-config.phpТак WordPress сможет сам устанавливать обновления и плагины, а
wp-config.phpс паролем базы и ключами не прочитают другие пользователи системы.
Шаг 4. Настройте nginx
Создайте файл сайта:
nano /etc/nginx/sites-available/ДОМЕНВставьте конфигурацию ниже, замените
ДОМЕН, сохраните (Ctrl+O, затем Enter) и выйдите (Ctrl+X):server { listen 80; server_name ДОМЕН www.ДОМЕН; root /var/www/ДОМЕН; index index.php index.html; client_max_body_size 64M; location / { try_files $uri $uri/ /index.php?$args; } location ~* /wp-content/uploads/.*\.php$ { deny all; } location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/run/php/php8.3-fpm.sock; } location ~ /\.(?!well-known) { deny all; } }Строка Что делает try_files $uri $uri/ /index.php?$args;отдаёт существующие файлы, а остальные запросы передаёт WordPress (это нужно для постоянных ссылок) fastcgi_pass unix:/run/php/php8.3-fpm.sock;передаёт файлы .phpв PHP-FPM; путь должен точно совпадать с сокетом из шага 1client_max_body_size 64M;максимальный размер загружаемого файла, такой же, как в PHP location ~* /wp-content/uploads/.*\.php$запрещает запуск PHP-скриптов из папки с загруженными файлами location ~ /\.(?!well-known)закрывает скрытые файлы ( .htaccess,.git), но оставляет доступным/.well-known/для Let's EncryptВключите сайт, проверьте конфигурацию и перезагрузите nginx:
ln -s /etc/nginx/sites-available/ДОМЕН /etc/nginx/sites-enabled/ nginx -t systemctl reload nginxКоманда
nginx -tдолжна вывестиsyntax is okиtest is successful. Если она показывает ошибку, исправьте указанную строку и повторите проверку до перезагрузки.
Шаг 5. Включите HTTPS
Установите certbot с модулем для nginx:
apt install -y certbot python3-certbot-nginxПолучите сертификат для обоих имён:
certbot --nginx -d ДОМЕН -d www.ДОМЕНПри первом запуске certbot попросит адрес электронной почты и согласие с условиями Let's Encrypt. Если он спросит, перенаправлять ли HTTP на HTTPS, выберите перенаправление. В конце появится сообщение, которое начинается с «Congratulations!»: certbot добавил сертификат в конфигурацию nginx и перезагрузил nginx.
Сертификат действует 90 дней и продлевается автоматически. Проверьте продление:
certbot renew --dry-run
Подробности и частые ошибки: Веб-сервер с HTTPS: nginx или Apache и Let's Encrypt.
Шаг 6. Завершите установку в браузере
- Откройте
https://ДОМЕН. Запустится мастер установки WordPress. - Выберите язык сайта и продолжите.
- Укажите название сайта, имя администратора, пароль и адрес электронной почты. Не используйте имя
adminи оставьте надёжный пароль, который предлагает WordPress. - Подтвердите установку и войдите в панель администратора по адресу
https://ДОМЕН/wp-admin.
Устанавливайте WordPress после шага 5: тогда сайт с самого начала сохранит свой адрес с https://.
Безопасность
- Обновления WordPress. Минорные обновления безопасности устанавливаются автоматически. Мажорные версии, плагины и темы обновляйте из панели администратора WordPress; для плагинов можно включить автообновление в списке плагинов. Удалите плагины и темы, которыми не пользуетесь.
- Права на файлы. После загрузки файлов по SFTP под
rootснова выполните все четыре команды из шага 3, пункт 5 (на AlmaLinux — сapache:apache): Передача файлов на сервер (scp, rsync, SFTP). - Система. Включите автоматические обновления безопасности и fail2ban: Обновления системы и автоматические обновления безопасности, Защита от подбора паролей с помощью fail2ban.
Отключите также редактор кода в панели WordPress, чтобы взломанная учётная запись администратора не могла напрямую менять PHP-файлы:
sed -i "/That's all, stop editing/i define( 'DISALLOW_FILE_EDIT', true );" /var/www/ДОМЕН/wp-config.phpЕжедневные резервные копии
Каждый день сохраняйте базу данных и папку wp-content с темами, плагинами и загруженными файлами. Скрипт ниже запускается ежедневно через cron. Если папки /etc/cron.daily на сервере нет, сначала установите пакет cron (Ubuntu, Debian) или cronie (AlmaLinux, CentOS Stream).
Создайте папку для копий и файл скрипта:
mkdir -p /root/backup nano /etc/cron.daily/wordpress-backupВставьте содержимое ниже, замените
ДОМЕНи сохраните:#!/bin/sh D=$(date +%F) mysqldump --single-transaction wordpress | gzip > /root/backup/wordpress-db-$D.sql.gz tar -czf /root/backup/wp-content-$D.tar.gz -C /var/www/ДОМЕН wp-content find /root/backup -type f -mtime +7 -deleteСделайте скрипт исполняемым и один раз запустите его для проверки:
chmod +x /etc/cron.daily/wordpress-backup /etc/cron.daily/wordpress-backup ls -lh /root/backupДолжны появиться два файла с сегодняшней датой. Дальше скрипт запускается каждый день, а копии старше 7 дней удаляются сами. На небольшом диске (у Standard S — 20 GB) следите за свободным местом: Диск сервера заполнен.
Внимание Копии в
/root/backupлежат на том же сервере и пропадут вместе с ним. Регулярно копируйте их в другое место: на другой сервер или во внешнее хранилище. BLACKBOX не делает автоматических резервных копий данных на сервере: Стратегия резервного копирования для вашего сервера.
Производительность
OPcache. Кеш PHP-кода включён по умолчанию. Проверьте: в выводе должна быть строка Zend OPcache.
php-fpm8.3 -m | grep -i opcacheКеш страниц. Установите в панели WordPress один плагин кеширования страниц, например WP Super Cache. Плагин сохраняет готовые страницы и отдаёт их повторно без запросов к базе данных, то есть намного быстрее.
Файл подкачки. На тарифах с 2 GB RAM, таких как Standard S, добавьте 1–2 GB swap, чтобы пики нагрузки не останавливали MariaDB из-за нехватки памяти: Добавление файла подкачки (swap). Если сервер постоянно использует swap, перейдите на более мощный тариф. Как оценить нагрузку: Диагностика нагрузки сервера (CPU, RAM, диск, сеть).
AlmaLinux 9 и CentOS Stream 9
Шаги те же, с отличиями ниже. SELinux включён: не отключайте его, а выставьте правильные метки.
Включите PHP 8.3 (по умолчанию система ставит PHP 8.0), установите пакеты и запустите службы — здесь они сами не запускаются. Расширение curl входит в базовый пакет PHP.
dnf module enable -y php:8.3 dnf install -y nginx mariadb-server php-fpm php-mysqlnd php-gd php-mbstring php-xml php-intl php-opcache php-pecl-zip nano tar systemctl enable --now nginx mariadb php-fpmИспользуйте пути и имена из правого столбца:
Что Ubuntu и Debian AlmaLinux и CentOS Stream Пользователь PHP-FPM и владелец файлов www-dataapacheСокет PHP-FPM /run/php/php8.3-fpm.sock/run/php-fpm/www.sockФайл сайта nginx /etc/nginx/sites-available/ДОМЕНи ссылка вsites-enabled/etc/nginx/conf.d/ДОМЕН.conf, без ссылкиЛимиты загрузки PHP /etc/php/8.3/fpm/conf.d/99-wordpress.ini/etc/php.d/99-wordpress.iniСлужба PHP-FPM php8.3-fpmphp-fpmMariaDB здесь слушает все интерфейсы: привяжите её к
127.0.0.1, как описано в статье Базы данных: MariaDB/MySQL и PostgreSQL.В конфигурации nginx замените блок
location ~ \.php$на этот (файлаsnippets/fastcgi-php.confздесь нет):location ~ \.php$ { try_files $uri =404; fastcgi_pass unix:/run/php-fpm/www.sock; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; }Передайте файлы пользователю
apache, затем разрешите в SELinux запись в папку сайта (загрузки, обновления) и исходящие соединения PHP (скачивание обновлений и плагинов):chown -R apache:apache /var/www/ДОМЕН dnf install -y policycoreutils-python-utils semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/ДОМЕН(/.*)?" restorecon -Rv /var/www/ДОМЕН setsebool -P httpd_can_network_connect 1Если позже вы переместите (
mv) в папку сайта файлы из другой папки, восстановите метки SELinux:restorecon -Rv /var/www/ДОМЕНУстановите certbot из репозитория EPEL и запустите таймер продления — здесь он сам не включается:
dnf install -y epel-release dnf install -y certbot python3-certbot-nginx systemctl enable --now certbot-renew.timerOPcache проверяется командой
php-fpmвместоphp-fpm8.3:php-fpm -m | grep -i opcache
Частые проблемы
| Сообщение или симптом | Причина | Что делать |
|---|---|---|
502 Bad Gateway |
PHP-FPM остановлен или fastcgi_pass указывает на другой сокет |
проверьте systemctl status php8.3-fpm и сравните fastcgi_pass с выводом ls /run/php/ |
| Браузер скачивает PHP-файл или показывает стандартную страницу nginx | файл сайта не включён или в нём нет блока для .php |
проверьте ссылку в sites-enabled, выполните nginx -t и перезагрузите nginx |
| «Error establishing a database connection» (или его перевод) | неверные данные в wp-config.php либо MariaDB остановлена |
сверьте строки DB_ с шагом 2; проверьте systemctl status mariadb |
413 Request Entity Too Large |
файл больше, чем client_max_body_size |
увеличьте лимит в nginx и в файле 99-wordpress.ini, затем перезагрузите nginx и перезапустите PHP-FPM |
| WordPress просит данные FTP при установке плагина | файлы не принадлежат пользователю PHP-FPM | снова выполните chown из шага 3 (apache:apache на AlmaLinux) |
| На AlmaLinux не работают загрузки или обновления, в ошибке «Permission denied» | метки SELinux | повторите команды semanage, restorecon и setsebool выше |
| certbot не может получить сертификат | домен не указывает на сервер или порт 80 закрыт | проверьте A-записи; см. Сайт не открывается |
Ошибки nginx записываются в /var/log/nginx/error.log.
Частые вопросы
Можно ли разместить на одном сервере несколько сайтов WordPress?
Да. Для каждого сайта повторите шаги 2–6 с отдельными базой данных, пользователем, папкой в /var/www/ и файлом nginx; скрипт mariadb-secure-installation повторно запускать не нужно. Добавьте базу данных и папку нового сайта в скрипт резервного копирования. Следите за памятью и местом на диске.
WordPress не отправляет письма (сброс пароля, контактные формы). На новом сервере сервис отправки почты, как правило, не настроен. Установите SMTP-плагин и подключите его к аккаунту почтового сервиса.
У меня уже есть сайт WordPress у другого провайдера. Как перенести его сюда? Подготовьте сервер по шагам 1, 2 и 4, затем следуйте статье Перенос сайта на сервер BLACKBOX: скопируйте файлы, импортируйте базу данных и в конце переключите DNS.
Может ли BLACKBOX установить WordPress за меня? Да, как профессиональную услугу по запросу через поддержку. Объём работ, цену и условия вы получите в предложении команды: Профессиональные услуги по запросу: администрирование, DevOps, миграция.