Ниже — практичный маршрут, который обычно проходит без “магии”: от подготовки VPS в Беларуси и веб-сервера до корректной выдачи сертификата и перевода WordPress на HTTPS. Подходит для типичной связки Nginx + MariaDB + PHP-FPM (LEMP).
Термины, которые дальше встретятся: VPS — виртуальный сервер; WordPress — CMS; HTTPS — защищённый протокол с сертификатом (часто Let’s Encrypt); домен — имя сайта, например example.by.
Подготовка VPS в Беларуси: доступ, DNS и базовая схема
Выбор ОС, пользователь и обновления
Начните с управляемого Linux-дистрибутива, где вы уверены в пакетах (часто это Ubuntu или Debian). Под WordPress критичны не “бренд ОС”, а стабильность обновлений и поддержка нужных модулей PHP.
Создайте отдельного пользователя для работы (не используйте root для ежедневных команд), затем обновите систему и включите базовые утилиты:
«`bash sudo apt update && sudo apt -y upgrade sudo apt -y install curl unzip zip ufw ca-certificates «`
Если VPS выдают без настроенного firewall, это не проблема, но его лучше включить сразу: ошибки “HTTPS не выдаётся” часто связаны с закрытым портом 80.
Домен и DNS-записи: что должно получиться в итоге
Чтобы Let’s Encrypt выдал сертификат по HTTP-01, доменное имя должно резолвиться в IP вашего VPS и быть доступным извне.
Обычно нужно:
- A-запись домена на IPv4 вашего сервера
- (опционально) AAAA-запись на IPv6, если он есть
Проверьте резолв локально и с другой сети, если есть возможность:
«`bash nslookup example.by «`
Типичная ошибка на этом шаге: домен указывает на один IP, а VPS имеет другой (например, после пересоздания). Сертификат в таком случае либо не выдастся, либо будет выдаваться “не на тот” сервер.
Firewall: открываем только нужное
Для WordPress и HTTPS обычно нужны:
- 22/tcp (SSH)
- 80/tcp (HTTP для проверки Let’s Encrypt)
- 443/tcp (HTTPS)
Если используете ufw, стартовая настройка выглядит так:
«`bash sudo ufw default deny incoming sudo ufw default allow outgoing sudo ufw allow 22/tcp sudo ufw allow 80/tcp sudo ufw allow 443/tcp sudo ufw enable sudo ufw status «`
Если вы планируете получать сертификат позже, всё равно держите 80 открытым до момента выпуска SSL. На практике закрытый 80 — одна из самых частых причин “certbot падает”.
Установка LEMP на VPS: Nginx, PHP-FPM и MariaDB для WordPress
Установка Nginx
Поставьте Nginx и убедитесь, что он слушает порт 80:
«`bash sudo apt -y install nginx sudo systemctl enable nginx —now sudo ss -lntp | grep :80 «`
Проверьте, что сайт в принципе отвечает: временно создайте “заглушку” и откройте домен в браузере. Это нужно, чтобы понять: проблема потом в WordPress, а не в сети или конфигурации Nginx.
PHP и расширения, которые реально нужны WordPress
WordPress потребляет PHP и ряд расширений. Минимальный набор обычно включает:
- mysqli (или pdo_mysql)
- mbstring
- xml
- cURL
- zip
- gd (если планируете обработку изображений)
- opcache (для производительности)
На Ubuntu часто встречается php8.1-fpm. Если у вас другая версия, замените номер соответствующим пакетом:
«`bash sudo apt -y install php8.1-fpm php8.1-mysql php8.1-mbstring php8.1-xml php8.1-curl php8.1-zip php8.1-gd php8.1-opcache sudo systemctl enable php8.1-fpm —now sudo ss -lntp | grep :9000 «`
Nginx обычно ходит в PHP-FPM через сокет или TCP. В конфигурациях ниже будем использовать сокет, но если у вас он отличается — подправьте fastcgi_pass под вашу среду.
MariaDB: база данных и права для WordPress
Установите MariaDB, затем создайте базу и пользователя с правами только на нужную БД.
«`bash sudo apt -y install mariadb-server sudo systemctl enable mariadb —now sudo mariadb-secure-installation «`
Дальше в MariaDB выполните:
«`sql CREATE DATABASE wordpressdb CHARACTER SET utf8mb4 COLLATE utf8mb4unicode_ci; CREATE USER ‘wordpressuser’@’localhost’ IDENTIFIED BY ‘strongpassword’; GRANT ALL PRIVILEGES ON wordpressdb.* TO ‘wordpressuser’@’localhost’; FLUSH PRIVILEGES; «`
Самая частая ошибка тут: пользователь создан для localhost, а вы затем настраиваете WordPress так, будто БД доступна удалённо. Если база на том же сервере — оставляйте localhost, это безопаснее и проще.
Директория сайта и права
Для удобства дальше будем считать, что сайт лежит в /var/www/example.by. Создайте структуру:
«`bash sudo mkdir -p /var/www/example.by sudo chown -R $USER:$USER /var/www/example.by «`
После распаковки WordPress поменяйте владельца на пользователя веб-сервера (часто это www-data). Права важны: слишком “широкие” — это риск, слишком “узкие” — 403 и 500 при обновлениях плагинов.
Развёртывание WordPress: установка и wp-config.php без лишних проблем
Установка WordPress из официального архива
Скачайте свежий архив WordPress и распакуйте в директорию сайта:
«`bash cd /tmp curl -O https://wordpress.org/latest.zip unzip latest.zip sudo rsync -av wordpress/ /var/www/example.by/ «`
Затем выставьте права:
«`bash sudo chown -R www-data:www-data /var/www/example.by «`
Если ваш процесс отличается (например, вы используете не www-data), приведите владельца к вашему реальному пользователю Nginx.
Подключение базы: wp-config.php
Создайте wp-config.php на основе шаблона и подставьте данные для БД:
«`bash cd /var/www/example.by sudo cp wp-config-sample.php wp-config.php «`
Отредактируйте wp-config.php (nano, vim — как удобнее). В блоке подключения базы должны быть:
- DBNAME: wordpressdb
- DBUSER: wordpressuser
- DBPASSWORD: strongpassword
- DB_HOST: localhost
После этого можно открыть домен в браузере и завершить установку через веб-интерфейс: название сайта, логин админа, почта.
Если на шаге установки WordPress ругается на доступ к файлам, чаще всего виноваты права на директорию и файлы. Убедитесь, что Nginx может читать файлы, а WordPress при необходимости может создавать/обновлять свои файлы.
Настройки wp-config для стабильной работы
Минимально полезные определения:
- ключи безопасности WordPress (их можно сгенерировать через официальный генератор)
- корректные URL (особенно перед включением HTTPS)
- выключение отображения ошибок наружу в production
Пример безопасных ориентиров:
«`php define(‘WP_DEBUG’, false); «`
И не забывайте: время на сервере влияет на задачи по расписанию. Проверьте часовой пояс и синхронизацию NTP:
«`bash timedatectl «`
Типичные ошибки на старте и как их распознать
1. 500 Internal Server Error
Чаще всего это PHP-ошибка или неверные права/владельцы. В Nginx смотрите error_log, а в PHP-FPM — соответствующие логи.
2. 403 Forbidden
Обычно Nginx не пускает из-за root/alias путей или прав на директории. Часто помогает проверить владельца и права на /var/www/example.by и вложенные папки.
3. 502 Bad Gateway
Почти всегда проблема между Nginx и PHP-FPM: сокет не существует, fastcgi_pass неверный, PHP-FPM не запущен. Сначала проверьте systemctl status php-fpm, затем конфиг Nginx.
Настройка Nginx для WordPress: корректная конфигурация server и location
Базовый server block для WordPress
Сконфигурируйте Nginx так, чтобы он отдавал статические файлы напрямую, а PHP отправлял в PHP-FPM. Пример для /etc/nginx/sites-available/example.by.conf (путь и имя файла выбирайте по стандартам вашей системы):
«`nginx server { listen 80; listen [::]:80; server_name example.by;
root /var/www/example.by; index index.php index.html;
clientmaxbody_size 64M;
access_log /var/log/nginx/example.by.access.log; error_log /var/log/nginx/example.by.error.log;
location / { try_files $uri $uri/ /index.php?$args; }
location ~ \.php$ { include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.1-fpm.sock; fastcgiparam SCRIPTFILENAME $documentroot$fastcgiscript_name; }
location ~* \.(jpg|jpeg|png|gif|ico|css|js|woff2?)$ { expires 30d; access_log off; }
location = /favicon.ico { accesslog off; lognot_found off; }
location = /robots.txt { accesslog off; lognot_found off; } } «`
Важно: fastcgi_pass должен указывать на ваш реальный сокет. Если в системе сокет отличается, получите 502. Быстро проверить можно так:
«`bash ls -l /run/php/ | grep fpm «`
Дальше включите конфиг и проверьте синтаксис:
«`bash sudo ln -s /etc/nginx/sites-available/example.by.conf /etc/nginx/sites-enabled/ sudo nginx -t sudo systemctl reload nginx «`
Ограничения, которые избавляют от “странных” падений
WordPress иногда загружает изображения, плагины и темы. Если clientmaxbody_size слишком мал, при загрузке появятся ошибки формы. 64M — рабочий уровень для большинства сценариев, но если у вас большие файлы, поднимайте с учётом ресурсов VPS и ограничений хостинга.
Также имеет смысл ограничить доступ к чувствительным файлам и отключить выполнение PHP в папках кэша и загрузок. Однако аккуратно: некоторые плагины и сценарии могут хранить php в нестандартных директориях. Делайте это точечно, когда понимаете, что именно защищаете.
Gzip и базовый кэш: где грань между полезно и сломано
Включение gzip обычно не мешает. Но агрессивные кэши для WordPress могут приводить к “старым” страницам или конфликтовать с плагинами. На старте ограничьтесь корректной компрессией и короткими expires для статики (как в примере выше).
Если позже подключите кэширование (например, через плагин), включайте его по инструкции самого плагина и тестируйте: после очистки кэша сайт должен обновляться мгновенно.
HTTPS для WordPress: Let’s Encrypt, редиректы и перевод в WordPress без циклов
Let’s Encrypt на VPS в Беларуси: получение сертификата по HTTP-01
Наиболее простой путь без ручной возни — использовать certbot и режим для Nginx. Установите certbot:
«`bash sudo apt -y install certbot python3-certbot-nginx «`
Убедитесь, что Nginx доступен извне по 80 (firewall открыт, домен указывает верно). Затем выполните:
«`bash sudo certbot —nginx -d example.by «`
Если всё правильно, certbot сам поправит конфигурацию Nginx и добавит listen 443 + сертификаты.
Если certbot ругается на невозможность проверить домен, почти всегда причина одна из трёх:
- DNS не совпадает с IP VPS
- порт 80 закрыт или блокируется
- Nginx не слушает 80 для этого server_name
Проверка сертификата и цепочки
Даже когда certbot “успешен”, стоит быстро проверить, что цепочка корректная и браузер не показывает предупреждения.
Проверка через openssl:
«`bash echo | openssl s_client -connect example.by:443 -servername example.by 2>/dev/null | grep -E «subject=|issuer=|Verify» «`
Если видите ошибки проверки или предупреждения в браузере, иногда помогает повторный выпуск или убедиться, что нужные файлы сертификата подключены в конфиг.
Включение HTTPS в WordPress: home и siteurl
После выдачи сертификата сайт может быть доступен по https, но WordPress продолжит генерировать ссылки на http. Это приведёт к смешанному контенту и нестабильной работе некоторых страниц.
Есть три подхода:
1. Ручная правка wp-config.php через WPHOME и WPSITEURL
Это удобно, если вы хотите жёстко закрепить URL.
2. Обновление параметров в базе данных (siteurl и home)
Подходит, но легче ошибиться, если нет бэкапа.
3. WP-CLI (если вы его настроили)
Быстро и повторяемо.
Если WPHOME/WPSITEURL хотите в wp-config.php, добавьте до строки, где определяется абсолютный путь, пример логики:
«`php define(‘WP_HOME’, ‘https://example.by’); define(‘WP_SITEURL’, ‘https://example.by’); «`
После этого обновите WordPress админку, проверьте, что редиректы не прыгают между http и https.
Устранение проблем после включения HTTPS
1. Редирект-цикл (слишком много переадресаций)
Почти всегда причина: siteurl/home не совпали с тем, что отдаёт Nginx, или в цепочке есть лишние редиректы. Временно переключите всё на один источник истины: либо параметры WordPress, либо настройки Nginx, и уберите дубли.
2. Ошибки в админке, но сайт открывается
Часто админка загружается по https, но в базе по-прежнему http, или браузер кеширует старые редиректы. Очистите кэш браузера, проверьте siteurl/home, и убедитесь, что переменная HTTPS правильно распознаётся Nginx (fastcgi_param по умолчанию обычно ок).
3. Mixed content (часть ресурсов остаётся http)
Ищите ссылки на изображения/скрипты, которые WordPress продолжает выдавать как http. Полезный метод: проверить исходный HTML страницы и найти источник. Иногда это следствие старых записей, а иногда — настройка конкретного плагина.
Безопасность и эксплуатация: что сделать на VPS в Беларуси после запуска
Права, обновления и минимизация поверхности
Держите систему и компоненты обновлёнными: пакеты, Nginx, PHP, MariaDB. WordPress тоже обновляйте регулярно, но делайте это после бэкапа.
Не храните админку на “случайном” совпадении. Настройте:
- длинный пароль администратора
- двухфакторную аутентификацию (если поддерживается вашим набором)
- смену логина админа (если вы понимаете последствия для старых авторов и ролей)
Проверьте, что в директории сайта нет лишних прав на запись для “чужих” пользователей. Владелец файлов и владелец процесса PHP-FPM должны совпадать по логике: обычно www-data для обоих в LEMP.
Бэкапы: делайте не “по плану”, а так, чтобы можно было восстановить
Бэкап — это не файл “в облаке”, а гарантированное восстановление. Минимальный набор: бэкап базы MariaDB и бэкап директории wp-content (иногда и всего сайта).
Хорошая практика:
- делать регулярные дампы БД
- архивировать wp-content
- хранить бэкапы отдельно от VPS (S3/другой сервер/репозиторий)
- тестировать восстановление раз в период (хотя бы на тестовом VPS или в контейнере)
Если вы используете плагин бэкапа, всё равно держите “нижний уровень” в виде дампа БД. Плагин может перестать работать из-за повреждения файлов или конфликтов после обновления.
Логи и мониторинг: что смотреть при проблемах
Два главных файла для старта — accesslog и errorlog Nginx. По ним можно быстро понять: PHP не работает, отдача статических файлов сломалась или Nginx неверно обрабатывает запросы.
Дополнительно полезно:
- логи php-fpm
- журнал systemd для php-fpm и nginx
- метрики загрузки VPS (CPU, RAM, диски), чтобы понимать, где “узкое место”
Команды, которые обычно помогают: «`bash sudo tail -n 200 /var/log/nginx/example.by.error.log sudo systemctl status nginx php8.1-fpm «`
Производительность: OPcache, статическая оптимизация и CDN
Для WordPress на VPS основной выигрыш часто дают:
- OPcache в PHP
- корректная настройка заголовков для статики
- сжатие (gzip)
- CDN для изображений и статических ресурсов, если ваш трафик разный по регионам
OPcache включается через параметры php.ini или отдельный конфиг. Убедитесь, что он не конфликтует с вашим стилем деплоя: при обновлениях PHP-кода важно, чтобы кэш обновлялся.
Чек-лист перед запуском и контроль после включения HTTPS
Перед тем как считать настройку WordPress завершённой
Проверьте по пунктам:
- Домен резолвится на IP VPS
- Nginx отдаёт главную страницу по http без ошибок
- WordPress установился и подключился к MariaDB
- wp-config.php содержит корректные данные БД
- PHP-FPM работает, 502 отсутствуют
- Загрузки изображений и файлов не падают по лимитам
Если хотя бы один пункт “не проходит”, не переходите дальше к HTTPS. Иначе вы потратите время на поиск SSL-ошибки, которая на самом деле была HTTP/права/fastcgi.
После выдачи сертификата и включения HTTPS
Дальше проверьте:
- сайт открывается по https без предупреждений браузера
- редирект с http на https работает один раз и не зацикливается
- WordPress генерирует https-ссылки (home/siteurl совпали)
- нет mixed content (в консоли браузера по странице)
- админка открывается по https и корректно загружает ресурсы
И обязательно проверьте автоматическое продление сертификата. Certbot обычно добавляет systemd timer, но убедиться не помешает:
«`bash systemctl list-timers | grep certbot «`
Итог: как довести WordPress на VPS в Беларуси до HTTPS без ошибок
Большинство проблем при настройке WordPress на VPS связано не с “редкими багами”, а с предсказуемыми расхождениями: DNS не совпал с IP, закрыт порт 80, fastcgi_pass указан неправильно, siteurl/home не перевели на https, а в итоге получаются редирект-циклы или смешанный контент.
Пройдите путь в указанной последовательности: сначала Nginx и WordPress в http, затем HTTPS через Let’s Encrypt, и только после этого закрепляйте URL в WordPress. Такой порядок экономит время и делает результат воспроизводимым. Если хотите, напишите вашу ОС (Ubuntu/Debian и версию), используете ли Nginx или Apache, и есть ли IPv6 — подстрою команды под вашу конкретику.
