Свежий VPS — это пустая операционная система. Ни веб-сервера, ни PHP, ни базы: всё ставится под задачу. Звучит сложнее, чем есть: полный цикл занимает около часа, и большая часть времени уходит на ожидание установки пакетов.
Разбираем связку nginx + PHP-FPM + MySQL — самую распространённую под сайты на WordPress, Bitrix, Laravel и почти любом другом PHP-движке.
Что понадобится
- VPS с Ubuntu 24.04 — для сайта-визитки или блога хватает тарифа «Старт» (1 ядро, 2 ГБ, 5 €), для магазина берите от «Лёгкого» (2 ядра, 4 ГБ)
- Домен с доступом к его DNS-записям
- Файлы сайта и дамп базы, если сайт уже существует
Перед установкой пройдите базовую защиту сервера — это двадцать минут, которые избавляют от перебора паролей и открытых наружу служб: 7 шагов безопасности.
Шаг 1. Направить домен на сервер
Начинаем с DNS, потому что записи расходятся по интернету не мгновенно — пока вы настраиваете сервер, они как раз успеют примениться.
В панели регистратора домена создайте две записи:
| Тип | Имя | Значение |
|---|---|---|
| A | @ | IP вашего сервера |
| A | www | IP вашего сервера |
Проверить, что запись применилась:
nslookup example.com
В ответе должен быть IP вашего сервера. Обычно это занимает от нескольких минут до часа.
Шаг 2. Установить nginx
Подключитесь к серверу — если делаете это впервые, порядок описан здесь: Как подключиться к VPS по SSH.
apt update && apt upgrade -y
apt install nginx -y
Откройте порты в firewall:
ufw allow 'Nginx Full'
ufw allow OpenSSH
ufw enable
Откройте в браузере http://ВАШ_IP — должна появиться стандартная страница «Welcome to nginx». Значит, веб-сервер работает.
Шаг 3. Установить PHP
apt install php8.3-fpm php8.3-mysql php8.3-mbstring php8.3-xml php8.3-curl php8.3-gd php8.3-zip php8.3-intl -y
Набор модулей закрывает требования большинства движков: работа с базой, строками, XML, изображениями и архивами.
Проверка:
php -v
systemctl status php8.3-fpm
Если переносите существующий сайт, ставьте ту же версию PHP, что была на старом хостинге. Обновлять версию заодно с переездом — верный способ получить белый экран и не понять, из-за чего.
Шаг 4. Установить MySQL
apt install mysql-server -y
mysql_secure_installation
Мастер задаст несколько вопросов. Отвечайте так:
- удалить анонимных пользователей — да
- запретить удалённый вход для root — да
- удалить тестовую базу — да
- перезагрузить привилегии — да
Создайте базу и пользователя под сайт:
mysql
CREATE DATABASE site_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'site_user'@'localhost' IDENTIFIED BY 'длинный_пароль';
GRANT ALL PRIVILEGES ON site_db.* TO 'site_user'@'localhost';
FLUSH PRIVILEGES;
EXIT;
Отдельный пользователь под каждый сайт — не формальность. Если один проект скомпрометируют, чужие базы останутся недоступны.
База должна слушать только
localhost. Наружу порт 3306 открывать не нужно никогда — приложение на том же сервере подключается локально.
Шаг 5. Создать конфиг сайта
mkdir -p /var/www/example.com
nano /etc/nginx/sites-available/example.com
server {
listen 80;
server_name example.com www.example.com;
root /var/www/example.com;
index index.php index.html;
client_max_body_size 64M;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
}
location ~ /\.(?!well-known) {
deny all;
}
location ~* \.(jpg|jpeg|png|gif|webp|svg|css|js|woff2)$ {
expires 30d;
access_log off;
}
}
Что здесь важно:
client_max_body_size 64M— иначе загрузка файлов больше мегабайта упрётся в ошибку 413- блок
location ~ /\.закрывает доступ к.env,.gitи другим скрытым файлам, исключая папку для проверки сертификата - последний блок включает кэширование статики в браузере — заметно ускоряет повторные заходы
Включите сайт и отключите стандартный:
ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
rm /etc/nginx/sites-enabled/default
nginx -t
systemctl reload nginx
Команда nginx -t проверяет конфиг на ошибки. Делайте это всегда перед перезагрузкой — иначе с опечаткой в конфиге веб-сервер просто не поднимется.
Шаг 6. Загрузить файлы сайта
Если сайт уже существует, копируйте с прежнего сервера:
rsync -avz /var/www/ root@НОВЫЙ_IP:/var/www/
Если начинаете с нуля, создайте проверочный файл:
echo "<?php phpinfo();" > /var/www/example.com/index.php
Выставьте владельца — без этого сайт не сможет писать в папку загрузок:
chown -R www-data:www-data /var/www/example.com
find /var/www/example.com -type d -exec chmod 755 {} \;
find /var/www/example.com -type f -exec chmod 644 {} \;
Откройте http://example.com — должна появиться таблица с информацией о PHP. Проверили — сразу удаляйте этот файл, он раскрывает лишнее о сервере:
rm /var/www/example.com/index.php
Шаг 7. Выпустить SSL-сертификат
Бесплатный сертификат Let's Encrypt выпускается одной командой и продлевается автоматически.
apt install certbot python3-certbot-nginx -y
certbot --nginx -d example.com -d www.example.com
Certbot спросит почту (на неё приходят уведомления об истечении) и предложит настроить редирект с HTTP на HTTPS — соглашайтесь.
Проверьте автопродление:
certbot renew --dry-run
Сертификат действует 90 дней и обновляется сам, за месяц до истечения. Никаких напоминаний в календаре заводить не нужно.
Сертификат выпускается только после того, как домен уже указывает на этот сервер. Если DNS ещё не применились, Let's Encrypt не сможет подтвердить владение доменом — подождите и повторите.
Шаг 8. Перенести базу, если сайт не новый
scp dump.sql root@ВАШ_IP:/root/
mysql -u root site_db < /root/dump.sql
Пропишите доступы в конфиге движка — wp-config.php для WordPress, .env для Laravel, configuration.php для Joomla.
Что проверить после запуска
- сайт открывается по HTTPS, в браузере замок
- работают оба адреса — с
wwwи без - HTTP перенаправляет на HTTPS
- загрузка файлов в админке проходит
- формы отправляются и письма доходят
- перенесены задания cron:
crontab -lна старом сервере - настроены бэкапы — автоматические копии за 10 минут
Если сайт открывается медленнее ожидаемого, причину ищут по порядку — от сервера к коду: Сайт тормозит: как найти причину.
Несколько сайтов на одном сервере
Второй сайт добавляется тем же путём: своя папка в /var/www, свой конфиг в sites-available, своя база, свой сертификат. Ограничение только в ресурсах.
Если у сайтов разные требования к версиям PHP, удобнее разнести их по контейнерам — тогда окружения не пересекаются вовсе: Docker на VPS.
Частые ошибки
502 Bad Gateway. Nginx не может достучаться до PHP. Проверьте, что путь к сокету в конфиге совпадает с версией PHP: ls /run/php/.
403 Forbidden. Неверные права или владелец файлов. Вернитесь к шагу 6.
Сайт открывается по IP, но не по домену. DNS ещё не применились либо в server_name опечатка.
Ошибка 413 при загрузке файла. Не хватает client_max_body_size в nginx и upload_max_filesize с post_max_size в /etc/php/8.3/fpm/php.ini. Менять нужно в обоих местах.
Белый экран без ошибок. Смотрите логи: tail -f /var/log/nginx/error.log и /var/log/php8.3-fpm.log. Чаще всего не хватает модуля PHP.
Частые вопросы
Какой тариф взять под сайт? Визитка и блог — «Старт» за 5 €. WordPress с посещаемостью и плагинами — «Лёгкий» за 10 €. Магазин — «Оптимальный» за 20 €.
Apache или nginx?
Nginx быстрее отдаёт статику и экономнее по памяти — на небольших тарифах это заметно. Apache нужен, если движок требует .htaccess и переписать правила некому.
Сколько сайтов поместится на одном VPS? Десяток визиток спокойно живёт на 2 ГБ. Вопрос не в количестве, а в суммарной посещаемости и тяжести движков.
Нужна ли панель управления? Не обязательно. Она удобна, если привычен интерфейс хостинга, но съедает ресурсы. Сравнение вариантов: Панель управления на VPS.
Сертификат правда бесплатный? Да, Let's Encrypt бесплатен и признаётся всеми браузерами. Платные сертификаты отличаются страховкой и проверкой организации, для обычного сайта разницы нет.
Как обновлять PHP потом? Ставите новую версию рядом, меняете сокет в конфиге nginx, проверяете сайт. Старая версия остаётся — откатиться можно в одну строку.
Итог
Порядок всегда один: DNS → веб-сервер → PHP → база → конфиг сайта → файлы → сертификат. Каждый шаг проверяется отдельно, поэтому, если что-то пошло не так, понятно, где именно.
Час работы — и у вас сайт на своём сервере с бесплатным HTTPS, без лимитов и соседей. Дальше останется настроить бэкапы и забыть про сервер до следующего проекта.

