← Все статьи
Полезные статьи

Как разместить сайт на VPS: от чистого сервера до HTTPS

Полная установка веб-сервера на чистый VPS: nginx, PHP-FPM, MySQL, привязка домена, бесплатный SSL от Let's Encrypt и проверка после запуска.

Свежий 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, без лимитов и соседей. Дальше останется настроить бэкапы и забыть про сервер до следующего проекта.

Выбрать VPS под сайт →

Команда Puws.Cloud
Puws.Cloud
Начать

СЕРВЕР ДЛЯ ВАШЕГО ПРОЕКТА

Начните
с тарифа.

ПОЛЕЗНОЕ О СЕРВЕРАХИнструкции
и советы.
Открыть блог
Наш Аптайм