Короткий ответ: на чистом Ubuntu 24.04 VPS ставите стек из репозитория дистрибутива — php8.3-fpm (ветка 8.3.6) и mysql-server 8.0.46 из main, либо MariaDB 10.11 из universe. WordPress берёте только как wordpress.org/latest.zip — на 13–14 сентября 2026 это ветка 7.1 (релиз 19 августа 2026). PHP отдаёте через nginx и сокет FPM, в location / обязательно try_files $uri $uri/ /index.php?$args;. Сокет проверяете в пуле: обычно /run/php/php8.3-fpm.sock. HTTPS включаете сразу после Certbot. PHP 8.4 и 8.5 в noble нет — Ondřej PPA для этой установки не нужен.
Гайд рассчитан на один сайт на одном VPS. Предполагается, что сервер уже обновлён, создан пользователь с sudo, настроены SSH-ключи и firewall, как в первой настройке Ubuntu 24.04. Домен должен указывать A-записью на IPv4 сервера. Все команды ниже выполняйте от пользователя с sudo, если не сказано иначе.
Что ставим: версии на 13–14 сентября 2026
Официальные требования WordPress — PHP 8.3 или новее, MySQL 8.0+ или MariaDB 10.11+, HTTPS обязателен. Источник: wordpress.org/about/requirements. На Ubuntu 24.04 это закрывается пакетами дистрибутива, без сторонних репозиториев PHP.
| Компонент | Откуда | Что должно получиться |
|---|---|---|
| WordPress | latest.zip | ветка 7.1, 19 августа 2026 |
| PHP-FPM | universe Ubuntu 24.04 | пакет php8.3-fpm, ветка 8.3.6 |
| СУБД | main / universe | mysql-server 8.0.46 или MariaDB 10.11 |
| Веб-сервер | пакет nginx | try_files + unix-сокет FPM |
| TLS | Certbot | HTTPS сразу после выпуска сертификата |
| CLI | официальный phar WP-CLI | команда wp в /usr/local/bin |
Проверьте, что PHP 8.4/8.5 действительно нет в noble:
apt-cache search '^php8\.[0-9]-fpm$'
apt-cache policy php8.3-fpm php8.4-fpm php8.5-fpm
Кандидат должен быть только у php8.3-fpm. Если пакет «не найден», включите universe и обновите индекс: sudo add-apt-repository universe && sudo apt update. На большинстве облачных образов 24.04 universe уже включён.
PHP 8.3-FPM и база данных
Ставьте интерпретатор, FPM и расширения, без которых ядро WordPress и типовые темы не собирают картинки, XML-RPC, REST и загрузки. Imagick не обязателен — достаточно GD.
sudo apt update
sudo apt install -y nginx php8.3-fpm php8.3-cli php8.3-mysql php8.3-xml \
php8.3-gd php8.3-curl php8.3-mbstring php8.3-zip php8.3-intl php8.3-bcmath \
unzip curl
php -v
php-fpm8.3 -v
В выводе обеих команд должна быть ветка 8.3.6. Сокет и пользователя пула смотрите в файле, а не в статьях: разные образы иногда меняют только комментарии, но listen обязан совпасть с nginx.
grep -E '^(listen|user|group|listen.owner|listen.group)' \
/etc/php/8.3/fpm/pool.d/www.conf
systemctl enable --now php8.3-fpm
systemctl is-active php8.3-fpm
ls -l /run/php/php8.3-fpm.sock
Типичные значения: listen = /run/php/php8.3-fpm.sock, user = www-data, group = www-data. Если сокета нет — journalctl -u php8.3-fpm -n 50 --no-pager и не идите дальше, пока FPM не слушает.
База: проще взять MySQL из main. MariaDB 10.11 из universe тоже удовлетворяет требованиям wordpress.org; не ставьте оба сервера на один порт 3306.
sudo apt install -y mysql-server
mysqld --version
sudo systemctl enable --now mysql
sudo mysql --protocol=socket
В клиенте MySQL создайте отдельную базу и пользователя только с правами на неё. Пароль сгенерируйте сами (openssl rand -base64 24) и никуда не копируйте из гайдов.
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;
QUIT;
Проверка входа этим пользователем: mysql -u wpuser -p -e 'SHOW DATABASES;'. Должна быть видна только wordpress плюс служебные схемы, к которым у него нет прав на запись.
Каталог сайта и WordPress 7.1
Не распаковывайте архив в /var/www/html поверх заглушки nginx, если собираетесь держать несколько сайтов. Один домен — один корень. Ниже example.com замените на свой FQDN.
sudo mkdir -p /var/www/example.com
cd /tmp
curl -fL -o wordpress.zip https://wordpress.org/latest.zip
unzip -t wordpress.zip
sudo unzip -q wordpress.zip -d /var/www/example.com
sudo sh -c 'mv /var/www/example.com/wordpress/* /var/www/example.com/'
sudo rmdir /var/www/example.com/wordpress
ls /var/www/example.com/wp-load.php /var/www/example.com/wp-admin/index.php
curl -fL обязателен: без -f вы можете сохранить HTML-страницу ошибки как zip. Контрольная точка — наличие wp-load.php в корне, не во вложенной папке wordpress/. Версию пакета проверьте так:
grep wp_version /var/www/example.com/wp-includes/version.php
Должно быть $wp_version = '7.1'; или патч той же ветки, если wordpress.org уже отдал 7.1.x в latest.zip. Не подменяйте архив «сборками» с зеркал.
nginx: try_files и FastCGI
Пока нет сертификата, слушайте 80. После Certbot этот же server-блок получит 443. Рецепт постоянных ссылок — из документации WordPress по nginx: статика отдаётся с диска, остальное уходит в index.php. Не используйте try_files ... /index.php; без ?$args — сломаются query string у постоянных ссылок.
Создайте /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;
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 ~* /\.ht {
deny all;
}
}
Если grep ^listen в пуле показал не unix-сокет, а 127.0.0.1:9000, в fastcgi_pass пишите 127.0.0.1:9000. Не копируйте сокет из памяти. Включайте сайт только после теста конфигурации.
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
curl -sI -H 'Host: example.com' http://127.0.0.1/ | head
Ожидаете HTTP 302 на /wp-admin/install.php или 200 с установщиком — не 404 и не «File not found». «File not found» почти всегда значит, что nginx бьёт не в тот сокет или root не совпадает с каталогом, где лежит index.php.
wp-config.php, соли и права
Соли и ключи не копируйте из статей. Их выдаёт только api.wordpress.org/secret-key/1.1/salt/. Сначала файл конфигурации из образца, затем вставка солей и реквизитов БД.
cd /var/www/example.com
sudo cp wp-config-sample.php wp-config.php
curl -fsS https://api.wordpress.org/secret-key/1.1/salt/
Откройте wp-config.php и замените блок AUTH_KEY … NONCE_SALT целиком выводом curl. В том же файле:
DB_NAME—wordpressDB_USER—wpuserDB_PASSWORD— пароль, который задали в MySQLDB_HOST—localhostDB_CHARSET—utf8mb4table_prefixоставьтеwp_, если это единственный сайт в базе
Права — как в каноне администрирования: каталоги 755, файлы 644, wp-config.php 400 или 440. Владелец дерева — www-data, чтобы работали загрузки и автообновления тем/плагинов. Конфиг лучше сделать читаемым группе www-data, но не всем.
sudo chown -R www-data:www-data /var/www/example.com
sudo find /var/www/example.com -type d -exec chmod 755 {} \;
sudo find /var/www/example.com -type f -exec chmod 644 {} \;
sudo chown root:www-data /var/www/example.com/wp-config.php
sudo chmod 440 /var/www/example.com/wp-config.php
Проверка, что FPM читает конфиг: sudo -u www-data test -r /var/www/example.com/wp-config.php && echo ok. Посторонний пользователь без группы www-data читать его не должен.
HTTPS, WP-CLI и установка ядра
Не оставляйте установщик на голом HTTP. Выпустите сертификат по гайду Certbot + nginx + Let’s Encrypt, затем проверьте, что сайт отвечает 200 по HTTPS на обоих именах, если используете www.
curl -sI https://example.com/ | head
curl -sI https://www.example.com/ | head
WP-CLI ставьте официальным phar, не пакетом из случайного PPA. Проверка подписи — на странице установки WP-CLI; ниже минимальный путь, который использует тот же phar.
cd /tmp
curl -fO https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
php wp-cli.phar --info
chmod +x wp-cli.phar
sudo mv wp-cli.phar /usr/local/bin/wp
wp --info
Установку ядра выполняйте от www-data, иначе файлы создадутся от root и админка не сможет писать в wp-content.
sudo -u www-data wp --path=/var/www/example.com core is-installed || \
sudo -u www-data wp --path=/var/www/example.com core install \
--url='https://example.com' \
--title='Сайт' \
--admin_user='admin' \
--admin_email='you@example.com' \
--prompt=admin_password
sudo -u www-data wp --path=/var/www/example.com core version
sudo -u www-data wp --path=/var/www/example.com option get siteurl
Пароль администратора вводите в prompt, не в историю shell. siteurl и home должны быть с https://. Если поставили сайт по HTTP и только потом включили TLS, исправьте URL:
sudo -u www-data wp --path=/var/www/example.com option update siteurl 'https://example.com'
sudo -u www-data wp --path=/var/www/example.com option update home 'https://example.com'
Финальная проверка с сервера:
curl -sI https://example.com/— 200, не редирект на IP.curl -sI https://example.com/wp-login.php— 200.sudo -u www-data wp --path=/var/www/example.com core verify-checksums— checksums ядра совпадают с wordpress.org.- В браузере откройте
/wp-admin/и войдите созданным пользователем.
Если checksums «failed», архив битый или файлы правили вручную — скачайте latest.zip заново, не «чините» ядро плагинами. Дальше темы, постоянные ссылки и плагины настраиваются уже в админке; этот гайд заканчивается на воспроизводимом ядре 7.1 за nginx + PHP 8.3 + MySQL 8.0.
Частые вопросы
Почему не PHP 8.4 или 8.5, если wordpress.org пишет «8.3 или новее»?
Рекомендация wordpress.org — PHP 8.3+. В Ubuntu 24.04 (noble) из репозитория ставится php8.3-fpm ветки 8.3.6. Пакетов php8.4-fpm и php8.5-fpm в noble нет. PPA Ondřej Surý для этой задачи не обязателен: ядро 7.1 штатно работает на 8.3. Если позже переедете на другой релиз Ubuntu, где есть 8.4/8.5, это будет уже другой чеклист.
MySQL или MariaDB?
Оба варианта входят в требования: MySQL 8.0+ или MariaDB 10.11+. На Ubuntu 24.04 mysql-server 8.0.46 лежит в main и обычно проще. MariaDB 10.11 — universe. Не слушайте оба на 3306 одновременно. Для WordPress разницы в этом гайде нет: те же utf8mb4, тот же пользователь с GRANT только на одну базу.
Зачем 440 на wp-config.php, если тогда «не пишутся настройки»?
Файл содержит пароль БД и соли. 644 с владельцем www-data читает любой локальный пользователь. 440 с владельцем root:www-data даёт чтение PHP и запрещает запись: WordPress не должен сам переписывать конфиг из админки. Меняете соли и реквизиты — правите файл вручную под sudo, затем снова chmod 440.
WP-CLI пишет Permission denied на wp-content
Вы запускаете wp от root или от своего sudo-пользователя, а каталог принадлежит www-data. Всегда: sudo -u www-data wp --path=/var/www/example.com .... Если уже насоздавали файлов от root, верните владельца: sudo chown -R www-data:www-data /var/www/example.com/wp-content, не трогая режим 440 у wp-config.php.
Установщик открывается, но стили и постоянные ссылки «ломаются»
Смотрите nginx: в location / должна быть строка try_files $uri $uri/ /index.php?$args; из документации WordPress по nginx. Проверьте, что Certbot не завёл второй server-блок без этой строки. После смены постоянных ссылок в админке nginx не нужно «генерировать .htaccess» — на nginx его нет.