
Как установить WordPress на VPS без лишних прав
Скачиваем WordPress из официального источника, разделяем владельца кода и PHP-FPM, создаём wp-config, подключаем базу и завершаем установку.
Содержание
Устанавливать WordPress нужно после проверки Nginx, PHP-FPM и MariaDB. Тогда ошибка каждого слоя уже отделена от следующего. Код размещает административный пользователь, PHP-FPM получает чтение и точечную запись, а пароль базы хранится вне публичного доступа.
Пример использует каталог /srv/www/example.com. Замените домен и пути на свои до выполнения команд. Если на адресе уже работает сайт, сначала сделайте резервную копию и подготовьте отдельный релизный каталог — не распаковывайте архив поверх production.
Создайте каталог под владельцем публикации
Пользователь deploy в примере отвечает за обновление кода, группа www-data позволяет Nginx и PHP читать файлы. Команды создают каталог без доступа для остальных пользователей:
sudo install -d -o deploy -g www-data -m 0750 /srv/www/example.com
sudo -u deploy install -d -m 0750 /srv/www/example.com/releases
sudo -u deploy install -d -m 0750 /srv/www/example.com/shared
Если пользователя deploy нет, сначала создайте отдельную учётную запись и настройте её доступ. Не заменяйте её www-data: сервисная учётная запись веб-процесса не предназначена для интерактивного входа и владения всем приложением.
Скачайте WordPress во временный каталог
Работайте не внутри веб-корня. Официальный адрес ниже всегда указывает на актуальный стабильный архив; перед эксплуатацией запишите фактически установленную версию:
sudo -u deploy mkdir -p /srv/www/example.com/releases/initial
cd /tmp
curl --fail --location --remote-name https://wordpress.org/latest.tar.gz
tar -tzf latest.tar.gz | sed -n '1,20p'
curl --fail завершится ошибкой при HTTP-сбое, --location разрешит официальный redirect, а tar -t покажет содержимое без распаковки. Ожидается один верхний каталог wordpress/. Не продолжайте, если архив получен с другого домена или содержит неожиданные абсолютные пути.
Для строгой воспроизводимости выбирайте конкретный релиз из официального архива выпусков и проверяйте опубликованную контрольную сумму. Адрес latest удобен для первоначальной установки, но сам по себе не фиксирует версию.
Распакуйте код без передачи владения PHP
Опция --strip-components=1 убирает верхний каталог wordpress, поэтому файлы попадают прямо в каталог релиза. Команда выполняется от deploy, а не от root:
sudo -u deploy tar -xzf /tmp/latest.tar.gz \
--strip-components=1 \
-C /srv/www/example.com/releases/initial
sudo -u deploy find /srv/www/example.com/releases/initial -maxdepth 1 -type f -printf '%f\n'
В списке должны быть index.php, wp-load.php, wp-settings.php и пример конфигурации. Если каталог уже содержал файлы, остановитесь и сравните их: повторная распаковка не является контролируемым обновлением.
Отделите изменяемые загрузки
Каталог wp-content/uploads меняется при добавлении медиа. Создайте его в shared, дайте запись веб-группе и подключите символической ссылкой. Для одного PHP-пула группа www-data обычно соответствует процессам FPM:
sudo install -d -o deploy -g www-data -m 2770 /srv/www/example.com/shared/uploads
sudo -u deploy rm -rf /srv/www/example.com/releases/initial/wp-content/uploads
sudo -u deploy ln -s /srv/www/example.com/shared/uploads \
/srv/www/example.com/releases/initial/wp-content/uploads
Режим 2770 включает setgid: новые файлы наследуют группу каталога. Команда rm -rf допустима здесь только для нового пустого релиза после проверки точного абсолютного пути. На существующем сайте сначала перенесите содержимое uploads, проверьте копию и лишь затем меняйте каталог на ссылку.
Темы и плагины оставьте без записи PHP, если обновления выполняются управляемо через пользователя публикации. Если нужны обновления из панели, спроектируйте права отдельно и примите больший риск изменения исполняемого кода веб-процессом.
Создайте wp-config из примера
Скопируйте шаблон и ограничьте чтение владельцем и группой веб-процесса. Затем откройте файл редактором и укажите реквизиты созданной базы:
sudo -u deploy cp /srv/www/example.com/releases/initial/wp-config-sample.php \
/srv/www/example.com/releases/initial/wp-config.php
sudo chown deploy:www-data /srv/www/example.com/releases/initial/wp-config.php
sudo chmod 0640 /srv/www/example.com/releases/initial/wp-config.php
Внутри замените DB_NAME, DB_USER, DB_PASSWORD и при необходимости DB_HOST. Для локальной базы начните с localhost. Не помещайте реальный пароль в команду shell и не коммитьте конфигурацию в публичный Git.
Ключи аутентификации получите с официального WordPress Salt API по защищённому соединению и вставьте вместо примеров. Эти значения делают существующие cookie недействительными при замене, поэтому храните их как секрет и меняйте осознанно.
Подключите релиз и Nginx
Символическая ссылка current позволяет переключить весь набор файлов одним действием. Сначала создайте ссылку, затем проверьте, куда она ведёт:
sudo -u deploy ln -s /srv/www/example.com/releases/initial /srv/www/example.com/current
readlink -f /srv/www/example.com/current
sudo namei -l /srv/www/example.com/current/index.php
readlink должен показать каталог initial, а namei — права на каждом уровне пути. В конфигурации Nginx укажите root /srv/www/example.com/current;, подключите PHP-FPM по фактическому сокету и запретите выполнение PHP внутри wp-content/uploads.
До применения выполните sudo nginx -t. Если тест успешен, примените reload и проверьте домен командой curl. При ошибке верните прежний root или ссылку current и снова протестируйте конфигурацию.
Завершите веб-установку без открытого окна
Пока таблицы не созданы, ограничьте сайт своим IP средствами Nginx или firewall. Откройте домен по HTTPS, выберите язык, задайте название и создайте администратора с уникальным именем и длинным паролем. Не используйте пароль базы для учётной записи WordPress.
Сразу после завершения войдите в панель, проверьте постоянные ссылки, часовой пояс и наличие обновлений. Удалите архив из /tmp, если он больше не нужен, и сделайте согласованную копию базы и shared/uploads.
Проверьте установку по слоям
Откройте главную, административную часть и тестовую запись. Загрузите небольшое изображение и убедитесь, что файл появился в shared/uploads, а не в каталоге релиза. Затем проверьте журналы Nginx и PHP-FPM за время теста.
При 502 вернитесь к настройке сокета PHP-FPM. При ошибке соединения с базой проверьте вход под учётной записью из инструкции MariaDB. Права дерева подробно разобраны в отдельной статье.
Источники
Самопроверка
Проверьте, что материал усвоен
Ответьте на все вопросы. Результат сохранится только в этом браузере и будет учтён в статистике прочитанных материалов.
Разбираем коротко
Частые вопросы
Кому должны принадлежать файлы WordPress?
Кодом должен владеть пользователь публикации, а PHP-FPM обычно достаточно чтения. Запись разрешают только там, где она нужна, например в uploads; автоматическое обновление из панели требует отдельной модели прав.
Можно ли оставить установщик WordPress открытым до следующего дня?
Не следует. Как только домен направлен на пустую установку, любой посетитель может попытаться пройти начальную настройку. Ограничьте доступ своим IP или завершите установку сразу.
Нужно ли хранить архив latest.tar.gz на сервере?
После проверки и установки он не нужен. Для воспроизводимости лучше записать установленную версию и хранить код в управляемом процессе обновления, а не случайный архив в веб-каталоге.


