BLACKBOXЦентр помощи

WordPress на LEMP (nginx, MariaDB, PHP)

Пошаговая установка сайта WordPress на сервер Ubuntu или Debian с HTTPS, ежедневными резервными копиями и базовыми настройками.

общееОбновлено 2026-10-09~9 мин чтения
На этой странице

В этом руководстве описана установка сайта 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 больше не обновляет: для нового сайта эти системы не подходят.

Перед установкой проверьте:

Во всех командах замените ДОМЕН на имя сайта без www, например example.com.

Шаг 1. Установите nginx, MariaDB и PHP

  1. Обновите список пакетов и установите компоненты. На 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
  2. Узнайте установленную версию PHP по имени сокета PHP-FPM:

    ls /run/php/
    Система PHP Сокет PHP-FPM Служба PHP-FPM
    Ubuntu 24.04 LTS 8.3 /run/php/php8.3-fpm.sock php8.3-fpm
    Debian 12 8.2 /run/php/php8.2-fpm.sock php8.2-fpm
    Ubuntu 22.04 LTS 8.1 /run/php/php8.1-fpm.sock php8.1-fpm

    Важно В примерах используется PHP 8.3 (Ubuntu 24.04 LTS). В другой системе замените 8.3 на свою версию везде: в путях /etc/php/8.3/…, в имени службы php8.3-fpm и в сокете в конфигурации nginx.

  3. Увеличьте максимальный размер файлов, загружаемых в 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. Создайте базу данных

  1. Запустите скрипт защиты MariaDB и ответьте на вопросы, как в таблице:

    mariadb-secure-installation
    Вопрос Ответ
    Enter current password for root (enter for none): Enter
    Switch to unix_socket authentication [Y/n] n
    Change 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, без пароля.

  2. Сгенерируйте надёжный пароль для пользователя базы данных и сохраните его. Ниже он обозначен как ПАРОЛЬ_БД:

    openssl rand -hex 20
  3. Откройте консоль MariaDB:

    mariadb
  4. Создайте базу данных 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

  1. Скачайте последнюю версию с 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
  2. Создайте 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
  3. Замените 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
  4. Проверьте результат. В выводе должны быть 3 строки DB_ с вашими данными и 8 строк, от AUTH_KEY до NONCE_SALT, с длинными случайными значениями.

    grep -E "DB_(NAME|USER|PASSWORD)|_KEY'|_SALT'" wp-config.php
  5. Передайте файлы пользователю 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

  1. Создайте файл сайта:

    nano /etc/nginx/sites-available/ДОМЕН
  2. Вставьте конфигурацию ниже, замените ДОМЕН, сохраните (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; путь должен точно совпадать с сокетом из шага 1
    client_max_body_size 64M; максимальный размер загружаемого файла, такой же, как в PHP
    location ~* /wp-content/uploads/.*\.php$ запрещает запуск PHP-скриптов из папки с загруженными файлами
    location ~ /\.(?!well-known) закрывает скрытые файлы (.htaccess, .git), но оставляет доступным /.well-known/ для Let's Encrypt
  3. Включите сайт, проверьте конфигурацию и перезагрузите 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

  1. Установите certbot с модулем для nginx:

    apt install -y certbot python3-certbot-nginx
  2. Получите сертификат для обоих имён:

    certbot --nginx -d ДОМЕН -d www.ДОМЕН
  3. При первом запуске certbot попросит адрес электронной почты и согласие с условиями Let's Encrypt. Если он спросит, перенаправлять ли HTTP на HTTPS, выберите перенаправление. В конце появится сообщение, которое начинается с «Congratulations!»: certbot добавил сертификат в конфигурацию nginx и перезагрузил nginx.

  4. Сертификат действует 90 дней и продлевается автоматически. Проверьте продление:

    certbot renew --dry-run

Подробности и частые ошибки: Веб-сервер с HTTPS: nginx или Apache и Let's Encrypt.

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

  1. Откройте https://ДОМЕН. Запустится мастер установки WordPress.
  2. Выберите язык сайта и продолжите.
  3. Укажите название сайта, имя администратора, пароль и адрес электронной почты. Не используйте имя admin и оставьте надёжный пароль, который предлагает WordPress.
  4. Подтвердите установку и войдите в панель администратора по адресу https://ДОМЕН/wp-admin.

Устанавливайте WordPress после шага 5: тогда сайт с самого начала сохранит свой адрес с https://.

Безопасность

Отключите также редактор кода в панели 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).

  1. Создайте папку для копий и файл скрипта:

    mkdir -p /root/backup
    nano /etc/cron.daily/wordpress-backup
  2. Вставьте содержимое ниже, замените ДОМЕН и сохраните:

    #!/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
  3. Сделайте скрипт исполняемым и один раз запустите его для проверки:

    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 включён: не отключайте его, а выставьте правильные метки.

  1. Включите 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
  2. Используйте пути и имена из правого столбца:

    Что Ubuntu и Debian AlmaLinux и CentOS Stream
    Пользователь PHP-FPM и владелец файлов www-data apache
    Сокет 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-fpm php-fpm
  3. MariaDB здесь слушает все интерфейсы: привяжите её к 127.0.0.1, как описано в статье Базы данных: MariaDB/MySQL и PostgreSQL.

  4. В конфигурации 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;
    }
  5. Передайте файлы пользователю 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/ДОМЕН
  6. Установите certbot из репозитория EPEL и запустите таймер продления — здесь он сам не включается:

    dnf install -y epel-release
    dnf install -y certbot python3-certbot-nginx
    systemctl enable --now certbot-renew.timer
  7. OPcache проверяется командой 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, миграция.

Не нашли ответ?Напишите нам — служба поддержки ответит. support@blackbox.md
Открыть тикет