Это руководство проведет вас через полный цикл развертывания веб-сервера на Ubuntu 2026. Вы выполните установку Nginx или Apache, подключите PHP-FPM и MariaDB, настроите виртуальный хост и опубликуете первый сайт. Все команды проверены на актуальных версиях пакетов, а типовые ошибки разобраны с конкретными решениями.
Через 30-40 минут вы получите готовый к работе сервер с поддержкой динамических страниц и баз данных. Инструкция подходит для тестовой среды и для production при условии выполнения шагов по безопасности из седьмого раздела.
Что вы получите после этого руководства
После выполнения всех шагов у вас будет полностью настроенный веб-сервер с привязанным доменом, работающим PHP и базой данных. Вы сможете размещать сайты, обрабатывать динамические запросы и подключаться к MySQL/MariaDB из PHP-скриптов.
Конфигурация протестирована на Ubuntu 2026. Каждая команда сопровождается пояснением, которое помогает понять логику действия и избежать ошибок при адаптации под свои задачи. Страх «сработает ли это в моем случае?» закрывается структурой: вы не просто копируете команды, а видите, зачем нужен каждый шаг.
Шаг 1: Выбор веб-сервера - Nginx или Apache
Выбор между Nginx и Apache определяет архитектуру всего стека. Оба сервера решают задачу отдачи HTTP-контента, но делают это по-разному. Правильное решение на старте экономит часы отладки в будущем.
Nginx: плюсы, минусы и когда выбирать
Nginx обрабатывает соединения асинхронно, в событийно-ориентированной модели. Один рабочий процесс обслуживает тысячи одновременных соединений без линейного роста потребления памяти. На отдаче статических файлов Nginx показывает производительность в 2-3 раза выше Apache при одинаковом железе.
Сильные стороны Nginx:
- Эффективная работа как reverse-прокси и балансировщика нагрузки.
- Встроенная поддержка HTTP/2, gzip-сжатия и кэширования.
- Простой синтаксис конфигурации: server-блоки вместо громоздких Directory-секций.
Ограничение: Nginx не поддерживает .htaccess. Все настройки выполняются централизованно в конфигурационных файлах, что требует перезагрузки сервера при изменениях. Для новичков это скорее плюс - конфигурация прозрачна и не размазана по десятку файлов в разных директориях.
Выбирайте Nginx для высоконагруженных проектов, микросервисной архитектуры, работы как прокси перед бэкендами на Node.js или Python. Это стандарт де-факто для новых проектов в 2026 году.
Apache: плюсы, минусы и когда выбирать
Apache использует процессную или потоковую модель обработки. Каждое соединение занимает отдельный поток или процесс, что при большом числе одновременных запросов ведет к высокому потреблению оперативной памяти.
Сильные стороны Apache:
- Гибкая настройка через .htaccess: можно менять поведение сервера на уровне отдельных директорий без перезагрузки.
- Богатая экосистема модулей: mod_rewrite, mod_security, mod_php и десятки других.
- Совместимость с legacy-проектами, заточенными под особенности Apache.
Apache оправдан для shared-хостинга, где нужна изоляция настроек между пользователями через .htaccess, и для проектов с глубокой интеграцией в экосистему модулей Apache. Если вы переносите старый сайт, который использует правила mod_rewrite в .htaccess, Apache сэкономит время на миграцию.
Рекомендация для новичков: начинайте с Nginx. Его конфигурация логичнее, документация обширнее, а производительность из коробки выше. Дальнейшие шаги руководства показывают настройку для обоих серверов.
Шаг 2: Подготовка сервера и установка веб-сервера
Перед установкой обновите список пакетов и установленные компоненты системы. Это гарантирует актуальные версии и устраняет известные уязвимости.
sudo apt update && sudo apt upgrade -yПосле обновления система готова к установке выбранного веб-сервера. Базовая структура конфигураций для обоих серверов похожа: есть директории для доступных сайтов (sites-available) и для активных (sites-enabled). Активация сайта выполняется символической ссылкой из первой директории во вторую.
Установка Nginx на Ubuntu 2026
Nginx доступен в стандартных репозиториях Ubuntu. Версия из репозитория стабильна и получает обновления безопасности.
sudo apt install nginx -y
sudo systemctl start nginx
sudo systemctl enable nginxПроверьте статус сервиса:
sudo systemctl status nginxВывод должен содержать «active (running)». Проверьте доступность сервера локально:
curl -I localhostОтвет с HTTP/1.1 200 OK подтверждает работу. Конфигурационные файлы находятся в /etc/nginx/sites-available/. После создания конфига для сайта вы активируете его символической ссылкой в /etc/nginx/sites-enabled/.
Установка Apache на Ubuntu 2026
Apache устанавливается аналогично из стандартных репозиториев.
sudo apt install apache2 -y
sudo systemctl start apache2
sudo systemctl enable apache2Проверка статуса:
sudo systemctl status apache2Локальная проверка через curl даст аналогичный ответ 200 OK. Конфигурация сайтов Apache хранится в /etc/apache2/sites-available/. Для активации используется утилита a2ensite, которая автоматически создает символическую ссылку в /etc/apache2/sites-enabled/.
Если сервер развернут на VDS, вы можете протестировать доступ из браузера по IP-адресу. На экране появится стандартная заглушка Nginx или Apache. Это подтверждает, что сервер принимает внешние соединения. Для продуктивной работы с базами данных и бэкапами обратите внимание на облачные серверы Timeweb Cloud, которые предоставляют готовую инфраструктуру с автоматическим резервированием.
Шаг 3: Настройка виртуального хоста (сайта)
Виртуальный хост - это конфигурация, которая связывает доменное имя с директорией на сервере. Один физический сервер может обслуживать десятки сайтов, каждый со своим виртуальным хостом.
Создайте корневую директорию для сайта и назначьте владельца:
sudo mkdir -p /var/www/example.com/html
sudo chown -R $USER:$USER /var/www/example.com/html
sudo chmod -R 755 /var/www/example.comЗамените example.com на ваш домен. Внутри html будут размещаться файлы сайта.
Создание виртуального хоста в Nginx
Создайте конфигурационный файл:
sudo nano /etc/nginx/sites-available/example.comСодержимое для статического сайта:
server {
listen 80;
server_name example.com www.example.com;
root /var/www/example.com/html;
index index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
}Директива server_name указывает домены, на которые отвечает этот хост. root задает корневую директорию. try_files проверяет наличие файла и возвращает 404, если ничего не найдено.
Активируйте хост символической ссылкой и проверьте конфигурацию:
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginxКоманда nginx -t проверяет синтаксис. При ошибке вы увидите конкретную строку и файл, где допущена проблема. Детальный разбор создания виртуальных хостов с примерами для PHP и проксирования читайте в руководстве по развертыванию стека LEMP.
Создание виртуального хоста в Apache
Создайте конфигурационный файл:
sudo nano /etc/apache2/sites-available/example.com.confСодержимое:
<VirtualHost *:80>
ServerName example.com
ServerAlias www.example.com
DocumentRoot /var/www/example.com/html
<Directory /var/www/example.com/html>
Options -Indexes +FollowSymLinks
AllowOverride All
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>Активация хоста и перезагрузка:
sudo a2ensite example.com.conf
sudo apache2ctl configtest
sudo systemctl reload apache2Для профессиональной настройки Apache с упором на безопасность и оптимизацию изучите полное руководство по конфигурации Apache2.
Шаг 4: Установка и настройка PHP
PHP обрабатывает динамический контент на стороне сервера. Установите PHP и модули, необходимые для работы с веб-сервером и базой данных:
sudo apt install php-fpm php-mysql -yПроверьте версию:
php -vНа Ubuntu 2026 по умолчанию устанавливается PHP 8.x. Точная версия зависит от репозиториев на момент установки. Конфигурация PHP-FPM находится в /etc/php/8.x/fpm/php.ini (замените 8.x на вашу версию).
Базовые настройки безопасности в php.ini:
cgi.fix_pathinfo=0
expose_php = OffПараметр cgi.fix_pathinfo=0 предотвращает попытки выполнения произвольных файлов через манипуляции с PATH_INFO. expose_php = Off скрывает версию PHP в заголовках ответа.
Интеграция PHP-FPM с Nginx
Nginx не умеет выполнять PHP-код самостоятельно. Он передает запросы к PHP-скриптам процессору PHP-FPM через FastCGI. Добавьте в секцию server вашего виртуального хоста:
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.x-fpm.sock;
}Замените 8.x на вашу версию PHP. Путь к сокету можно уточнить командой:
ls /run/php/После изменения конфигурации проверьте синтаксис и перезагрузите Nginx:
sudo nginx -t && sudo systemctl reload nginxИнтеграция PHP с Apache
Apache поддерживает два режима работы с PHP: модуль mod_php и PHP-FPM. Для новых установок рекомендуется PHP-FPM как более производительный и изолированный вариант.
Установка модуля mod_php (проще, но менее гибко):
sudo apt install libapache2-mod-php -y
sudo systemctl restart apache2Для настройки PHP-FPM с Apache включите модули проксирования:
sudo a2enmod proxy_fcgi setenvif
sudo a2enconf php8.x-fpm
sudo systemctl restart apache2Проверьте работу PHP. Создайте тестовый файл:
echo "<?php phpinfo(); ?>" | sudo tee /var/www/example.com/html/info.phpОткройте в браузере http://your-server-ip/info.php. Фиолетовая таблица с информацией о PHP подтверждает корректную интеграцию. После проверки удалите этот файл - он раскрывает детали конфигурации сервера.
sudo rm /var/www/example.com/html/info.phpШаг 5: Установка и настройка MySQL/MariaDB
MariaDB - это форк MySQL, полностью совместимый по API и SQL-синтаксису. В Ubuntu 2026 MariaDB устанавливается по умолчанию при запросе mysql-server. Установите сервер баз данных:
sudo apt install mariadb-server -y
sudo systemctl start mariadb
sudo systemctl enable mariadbБазовая безопасность MariaDB
Сразу после установки запустите скрипт начальной настройки безопасности:
sudo mysql_secure_installationСкрипт задаст несколько вопросов. Рекомендуемые ответы:
- Switch to unix_socket authentication? → n (оставляем парольную аутентификацию для совместимости).
- Change the root password? → Y, задайте надежный пароль.
- Remove anonymous users? → Y.
- Disallow root login remotely? → Y.
- Remove test database and access to it? → Y.
- Reload privilege tables now? → Y.
Эти действия закрывают типовые векторы атак: анонимный доступ, удаленный root-логин и тестовую базу с открытыми привилегиями.
Создание первой базы данных и пользователя
Подключитесь к MariaDB под root:
sudo mariadb -u root -pВведите пароль root, заданный при запуске mysql_secure_installation. Создайте базу данных и пользователя для сайта:
CREATE DATABASE mywebsite CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'siteuser'@'localhost' IDENTIFIED BY 'strong_password_here';
GRANT ALL PRIVILEGES ON mywebsite.* TO 'siteuser'@'localhost';
FLUSH PRIVILEGES;
EXIT;Проверьте подключение из PHP. Создайте файл db_test.php в корне сайта:
<?php
$conn = new mysqli('localhost', 'siteuser', 'strong_password_here', 'mywebsite');
if ($conn->connect_error) {
die('Connection failed: ' . $conn->connect_error);
}
echo 'Connected successfully to MariaDB';
?>Откройте файл в браузере. Сообщение «Connected successfully» подтверждает, что стек LAMP/LEMP полностью работоспособен. Удалите тестовый файл после проверки.
Шаг 6: Публикация первого сайта
Все компоненты настроены. Разместите файлы сайта в корневой директории /var/www/example.com/html. Проверьте права: директории - 755, файлы - 644. Владелец - пользователь, от которого работает веб-сервер (www-data для Nginx/Apache или ваш пользователь, если вы следовали шагу 3).
Создайте рабочий index.php, который выводит информацию о сервере и проверяет соединение с базой данных:
<?php
// Показываем ошибки (отключите в production)
error_reporting(E_ALL);
ini_set('display_errors', 0);
// Версия PHP
echo '<h1>Сервер работает</h1>';
echo '<p>PHP версия: ' . phpversion() . '</p>';
// Проверка подключения к MariaDB
$conn = new mysqli('localhost', 'siteuser', 'strong_password_here', 'mywebsite');
if ($conn->connect_error) {
echo '<p style="color:red;">Ошибка подключения к БД: ' . $conn->connect_error . '</p>';
} else {
echo '<p style="color:green;">Подключение к MariaDB успешно</p>';
$conn->close();
}
?>Для доступа по домену настройте A-запись у вашего DNS-провайдера, указав IP-адрес сервера. После обновления DNS (от нескольких минут до 24 часов) сайт откроется по доменному имени. Проверьте доступность из браузера по IP и по домену.
Если сайт не открывается, начните диагностику с логов. Ошибки веб-сервера Nginx находятся в /var/log/nginx/error.log, Apache - в /var/log/apache2/error.log. Подробный разбор ошибок 403, 404, 500 и 502 с готовыми командами для исправления смотрите в руководстве по диагностике ошибок веб-сервера.
Шаг 7: Базовая безопасность и типовые ошибки
Сервер, доступный из интернета, требует минимальной защиты. Три обязательных шага: настройка брандмауэра, получение SSL-сертификата и понимание типовых ошибок.
Настройка брандмауэра UFW
UFW - это интерфейс к iptables, упрощающий управление правилами. Разрешите SSH, HTTP и HTTPS:
sudo ufw allow OpenSSH
sudo ufw allow 'Nginx Full' # для Nginx
# или
sudo ufw allow 'Apache Full' # для Apache
sudo ufw enableПроверьте статус:
sudo ufw status verboseПравила применяются немедленно. Порт 22 (SSH) открыт, порты 80 и 443 открыты для веб-трафика.
Установка SSL-сертификата Let's Encrypt
Certbot автоматизирует получение и обновление бесплатных SSL-сертификатов. Установите Certbot и плагин для вашего веб-сервера:
sudo apt install certbot python3-certbot-nginx -y # для Nginx
# или
sudo apt install certbot python3-certbot-apache -y # для ApacheЗапустите получение сертификата:
sudo certbot --nginx -d example.com -d www.example.com
# или
sudo certbot --apache -d example.com -d www.example.comCertbot автоматически изменит конфигурацию виртуального хоста, добавив перенаправление HTTP на HTTPS и пути к файлам сертификата. Проверьте автоматическое обновление:
sudo certbot renew --dry-runЕсли тест проходит без ошибок, Certbot будет обновлять сертификаты автоматически. Для углубленной настройки HTTPS с HSTS, CSP и защитой от атак обратитесь к руководству по полной защите веб-серверов.
Типовые ошибки и их решение
| Ошибка | Причина | Решение |
|---|---|---|
| 403 Forbidden | Недостаточно прав на директорию или отсутствует индексный файл | Проверьте права: sudo chmod -R 755 /var/www/example.com. Убедитесь, что index.php или index.html существует. |
| 502 Bad Gateway (Nginx) | PHP-FPM не запущен или сокет недоступен | Проверьте статус PHP-FPM: sudo systemctl status php8.x-fpm. Проверьте путь к сокету в конфиге Nginx. |
| 503 Service Unavailable (Apache) | Модуль PHP не загружен или сервис PHP-FPM остановлен | Проверьте модули Apache: apache2ctl -M | grep php. Перезапустите PHP-FPM. |
| Сайт не открывается по домену | DNS-запись не обновлена или неверный server_name | Проверьте A-запись: dig example.com. Сравните IP в ответе с IP сервера. Проверьте server_name в конфиге. |
| Ошибка подключения к БД из PHP | Неверный пароль, пользователь не создан, сокет MariaDB недоступен | Проверьте статус MariaDB: sudo systemctl status mariadb. Проверьте учетные данные через консоль: sudo mariadb -u siteuser -p. |
Логи - основной инструмент диагностики. Nginx пишет ошибки в /var/log/nginx/error.log, Apache - в /var/log/apache2/error.log, PHP-FPM - в /var/log/php8.x-fpm.log. При любой нештатной ситуации начинайте с чтения логов командой tail -f и повторения запроса, вызывающего ошибку.
Что дальше: автоматизация и масштабирование
Ручная настройка одного сервера - это первый шаг. Когда проектов становится больше, ручное управление конфигурациями отнимает время и ведет к расхождениям между средами. Три направления для развития:
- Контейнеризация через Docker. Упаковка приложения со всеми зависимостями в изолированный контейнер гарантирует идентичность dev и production окружений. Один Dockerfile заменяет страницу инструкций по установке.
- Автоматизация развертывания через Ansible. Описание инфраструктуры как кода позволяет развернуть идентичный сервер за минуты, а не часы. Плейбук Ansible содержит все шаги из этого руководства в машиночитаемом виде.
- Мониторинг и резервное копирование. Netdata дает детальную картину нагрузки на сервер в реальном времени. Автоматический бэкап баз данных через mysqldump и cron защищает от потери данных.
База знаний admin-wiki содержит практические руководства по каждой из этих тем. Начните с быстрой настройки Nginx за 15 минут, чтобы углубить понимание веб-сервера, или перейдите к материалам по Docker и оркестрации для масштабирования инфраструктуры.