Настройка виртуальных хостов на Nginx и Apache

Управление веб-хостингом часто подразумевает необходимость запуска более одного сайта на едином сервере. Покупать отдельный сервер для каждого веб-ресурса — нерационально и дорого. Именно для решения этой задачи были разработаны виртуальные хосты (Virtual Hosts).

Виртуальный хост — это технология, позволяющая запускать несколько веб-сайтов (или доменов) на одном физическом сервере и одном IP-адресе. Веб-сервер (Nginx или Apache) определяет, какой именно сайт запросил пользователь, основываясь на имени домена, и передает ему корректный контент.

В этой статье мы детально разберем, как настроить виртуальные хосты на двух самых популярных веб-серверах: Apache и Nginx. Это руководство поможет вам эффективно управлять вашими проектами на виртуальном хостинге, VPS или выделенном сервере.

Данная информация предназначена для услуг: VPS хостинг или Облачный хостинг

Что такое виртуальный хост и зачем он нужен?

Представьте, что ваш сервер — это большой жилой дом, а IP-адрес — его почтовый адрес. Виртуальные хосты в этой аналогии — это отдельные квартиры (сайты) в этом доме. Письма (HTTP-запросы) приходят на общий адрес, но почтальон (веб-сервер) смотрит на фамилию получателя (имя домена) и точно знает, в какую квартиру его доставить.

Основные преимущества использования виртуальных хостов:

  • Экономия ресурсов: Размещение множества сайтов на одном сервере значительно дешевле.

  • Упрощение управления: Все сайты администрируются из одной точки.

  • Масштабируемость: Легко добавить новый сайт без изменения аппаратной конфигурации.

  • Изоляция: Конфигурации сайтов независимы друг от друга (в пределах сервера).

Подготовка к настройке (H2)

Перед тем как приступать к созданию конфигурационных файлов, необходимо выполнить несколько обязательных preparatory steps.

1. Привязка доменных имен (H3)

Для тестирования виртуальных хостов ваши доменные имена должны указывать на IP-адрес вашего сервера. Если у вас нет реальных доменов или вы настраиваетесь в локальной среде, можно использовать файл hosts на вашем компьютере.

  • На Linux/macOS: /etc/hosts

  • На Windows: C:\Windows\System32\drivers\etc\hosts

Добавьте в него строки, заменяя your_server_ip на реальный IP вашего сервера (для локального сервера это 127.0.0.1):
your_server_ip site1.test
your_server_ip www.site1.test
your_server_ip site2.test
your_server_ip www.site2.test

Важно: Изменения в файле hosts работают только на том компьютере, где его изменили. Для реальных сайтов необходимо настраивать DNS-записи (A-запись) у вашего регистратора доменов.

2. Структура каталогов (H3)

Рекомендуется придерживаться единой и логичной структуры хранения файлов сайтов. Чаще всего корневые директории сайтов размещают в /var/www/.

Для наших примеров создадим структуру:
sudo mkdir -p /var/www/site1.test/public_html
sudo mkdir -p /var/www/site2.test/public_html
sudo mkdir -p /var/www/site3.test/public_htmlgit config --list

  • /var/www/site1.test/ — основной каталог сайта.

  • public_html — корневая директория, откуда сервер будет отдавать файлы.

Создадим тестовые index.html файлы в каждой директории, чтобы отличить сайты друг от друга:
echo "<h1>Hello! This is site1.test</h1>" | sudo tee /var/www/site1.test/public_html/index.html
echo "<h1>Hello! This is site2.test</h1>" | sudo tee /var/www/site2.test/public_html/index.html

3. Установка прав доступа

Крайне важно выставить корректные права доступа к файлам сайтов для безопасности и корректной работы. Владельцем папок и файлов должен быть не root-пользователь, а пользователь, от имени которого работает веб-сервер (например, www-data на Ubuntu).

# Меняем владельца всех файлов в директориях
sudo chown -R www-data:www-data /var/www/site1.test/
sudo chown -R www-data:www-data /var/www/site2.test/
# Устанавливаем корректные права (директории 755, файлы 644)
sudo find /var/www/ -type d -exec chmod 755 {} \;
sudo find /var/www/ -type f -exec chmod 644 {} \;

Настройка виртуальных хостов в Apache (H2)

Apache использует термин Virtual Host (VirtuaHost). Конфигурационные файлы виртуальных хостов обычно хранятся в /etc/apache2/sites-available/ и активируются через создание симлинков в директорию /etc/apache2/sites-enabled/.

Базовый синтаксис конфигурационного файла (H3)

Создадим файл для нашего первого сайта: sudo nano /etc/apache2/sites-available/site1.test.conf

<VirtualHost *:80>
  # Директива ServerAdmin указывает email администратора
  ServerAdmin admin@site1.test

  # Директива ServerName - основное доменное имя
  ServerName site1.test

  # Директива ServerAlias - псевдонимы домена (например, с www)
  ServerAlias www.site1.test
 
  # Директива DocumentRoot определяет корневую директорию сайта
  DocumentRoot /var/www/site1.test/public_html

  # Директива ErrorLog задает путь к логу ошибок для этого хоста
  ErrorLog ${APACHE_LOG_DIR}/site1.test_error.log

  # Директива CustomLog задает путь к логу доступа для этого хоста
  CustomLog ${APACHE_LOG_DIR}/site1.test_access.log combined

  # Секция Directory для настройки прав доступа к корневой директории
  <Directory /var/www/site1.test/public_html>
    # Разрешает использование .htaccess
    AllowOverride All

    # Задает правила доступа: Order deny,allow - порядок обработки;
    # Require all granted - разрешить доступ всем
    Require all granted
  </Directory>
</VirtualHost>
Активация виртуального хоста и применение настроек (H3)
  1. Активируем сайт с помощью утилиты a2ensite:
    sudo a2ensite site1.test.conf

     

    Эта команда создаст симлинк из sites-available в sites-enabled.

  2. Проверим синтаксис конфигурации Apache на ошибки:
    sudo apache2ctl configtest

     

    Если вы видите Syntax OK, можно продолжать.

  3. Перезагрузим Apache для применения изменений:
    sudo systemctl reload apache2

Повторите те же шаги для второго сайта (site2.test.conf). Теперь, переходя в браузере по адресам site1.test и site2.test, вы должны видеть разные страницы.

Настройка виртуальных хостов в Nginx (H2)

Nginx использует термин server block (блок server). Конфигурационные файлы обычно хранятся в /etc/nginx/conf.d/ или /etc/nginx/sites-available/ с последующей активацией в /etc/nginx/sites-enabled/ (аналогично Apache).

Базовый синтаксис конфигурационного файла (server block)

Создадим файл для нашего первого сайта: sudo nano /etc/nginx/conf.d/site1.test.conf (или /etc/nginx/sites-available/site1.test)

server {
  # Указываем, что этот server block слушает порт 80 для IPv4 и IPv6
  listen 80;
  listen [::]:80;

  # Задаем корневое доменное имя для этого блока
  server_name site1.test www.site1.test;

  # Указываем корневую директорию сайта
  root /var/www/site1.test/public_html;

  # Задаем индексные файлы, которые nginx будет искать по умолчанию
  index index.html index.htm index.php;

  # Блок location / обрабатывает все запросы
  location / {
    # Пытается найти файл по полному URI, если не найден - отдает index.php
    try_files $uri $uri/ /index.php?$args;
  }

  # Блок location для обработки PHP-файлов (требует отдельной настройки PHP-FPM)
  location ~ \.php$ {
    include snippets/fastcgi-php.conf;
    fastcgi_pass unix:/var/run/php/php8.1-fpm.sock; # Версия PHP может отличаться
  }

  # Отключает логирование для запросов к favicon.ico и robots.txt
  location = /favicon.ico { log_not_found off; access_log off; }
  location = /robots.txt { log_not_found off; access_log off; }

  # Запрещает доступ к скрытым файлам (начинающимся с точки)
  location ~ /\. {
    deny all;
    access_log off;
    log_not_found off;
  }

  # Задает пути к логам для этого виртуального хоста
  access_log /var/log/nginx/site1.test_access.log;
  error_log /var/log/nginx/site1.test_error.log;
}
Активация виртуального хоста и применение настроек (H3)
  1. Проверим синтаксис конфигурации Nginx на ошибки (это очень важный шаг!):
    sudo nginx -t

    Ожидаемый вывод: nginx: configuration file /etc/nginx/nginx.conf test is successful.

  2. Если вы используете sites-available/sites-enabled, создайте симлинк:
    sudo ln -s /etc/nginx/sites-available/site1.test /etc/nginx/sites-enabled/

     
  3. Перезагрузим или перезапустим Nginx для применения изменений:
    sudo systemctl reload nginx

     

    Команда reload позволяет применить конфигурацию без разрыва established-соединений.

Проверьте работу сайтов в браузере. Nginx теперь должен корректно обрабатывать запросы к site1.test и site2.test.

Сравнение подходов: Apache vs Nginx (H2)

 
 
Критерий Apache Nginx
Конфигурация .htaccess (динамическая), <Directory> Только статическая конфигурация в основном файле
Синтаксис XML-подобный, директивы в секциях Собственный, иерархический, контекстный
Обработка PHP Обычно через mod_php (в памяти процесса Apache) Через внешний PHP-FPM (FastCGI Process Manager)
Безопасность Гибкая настройка прав в .htaccess Централизованная настройка, меньше точек входа
Быстродействие Может быть выше при использовании .htaccess (но это его же и замедляет) Выше по умолчанию за счет асинхронной архитектуры
Динамическая перезагрузка systemctl reload apache2 systemctl reload nginx

Настройка SSL/TLS (HTTPS) для виртуальных хостов

В современном вебе использование HTTPS обязательно. Самый популярный и бесплатный способ получить SSL-сертификат — использовать Let's Encrypt и утилиту Certbot.

Пример для Nginx (H3)

  1. Установите Certbot

  2. Выполните команду (замените site1.test на ваш домен):
    sudo certbot --nginx -d site1.test -d www.site1.test

  3. Certbot автоматически изменит ваш конфигурационный файл, добавив блок server {...} для порта 443 с настройками SSL, и перенаправит трафик с HTTP на HTTPS.

Пример для Apache

  1. Установите Certbot.

  2. Выполните команду:
    sudo certbot --apache -d site1.test -d www.site1.test

     
  3. Certbot аналогично автоматизирует весь процесс настройки.

Ручная настройка SSL (для понимания)

Вот как выглядит основной блок server для HTTPS в Nginx после ручной настройки:
server {
  listen 443 ssl http2;
  listen [::]:443 ssl http2;
  server_name site1.test www.site1.test;

  root /var/www/site1.test/public_html;
  index index.html index.php;

  # Пути к SSL-сертификату и ключу
  ssl_certificate /etc/letsencrypt/live/site1.test/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/site1.test/privkey.pem;

  # Остальная конфигурация (location и т.д.)
  ...
}

# Блок для перенаправления HTTP -> HTTPS
server {
  listen 80;
  listen [::]:80;
  server_name site1.test www.site1.test;
r. eturn 301 https://$server_name$request_uri;
}

 
 

Частые ошибки и их решение (H2)

  1. 403 Forbidden:

    • Причина: Неправильные права доступа к файлам или папкам.

    • Решение: Проверить владельца (chown) и права (chmod) для корневой директории сайта.

  2. 404 Not Found:

    • Причина: Неверный путь в директиве DocumentRoot (Apache) или root (Nginx).

    • Решение: Проверить путь и наличие index.html в указанной директории.

  3. 502 Bad Gateway (часто в Nginx с PHP):

    • Причина: Неправильный путь к сокету PHP-FPM в директиве fastcgi_pass.

    • Решение: Убедиться, что версия PHP в пути совпадает с установленной. Проверить, запущен ли сам PHP-FPM: systemctl status php8.1-fpm.

  4. Сайт по умолчанию вместо нужного:

    • Причина: Отсутствие директивы server_name в Nginx или ее несоответствие домену, либо неправильный порядок загрузки конфигов.

    • Решение: Проверить, что в server_name указано правильное имя. В Apache можно отключить дефолтный сайт: sudo a2dissite 000-default.conf.

  5. Ошибка синтаксиса при перезагрузке:

    • Всегда запускайте sudo nginx -t или sudo apache2ctl configtest перед перезагрузкой сервиса.

Best Practices и рекомендации по безопасности (H2)

  • Отключайте неиспользуемые модули: Как в Apache (a2dismod), так и в Nginx это снижает attack surface.

  • Используйте отдельные пользователи для разных сайтов: Если это возможно, запускайте процессы PHP-FPM для каждого сайта от отдельного системного пользователя для изоляции.

  • Настройте фаервол: (e.g., ufw на Ubuntu) Откройте только необходимые порты (80, 443, 22).

  • Регулярно обновляйте программное обеспечение: Веб-сервер, PHP, SSL-сертификаты.

  • Настройте logging и мониторинг: Анализируйте логи (/var/log/nginx//var/log/apache2/) для выявления подозрительной активности.

  • Для Apache: Ограничьте использование .htaccess для повышения производительности. Указывайте настройки напрямую в конфигурации виртуального хоста в секции <Directory>.

  • Для Nginx: Настройте кэширование статики (images, css, js) для снижения нагрузки на сервер.

Заключение (H1)

Настройка виртуальных хостов — фундаментальный навык для любого администратора веб-серверов. Как мы выяснили, и Apache, и Nginx предлагают мощные и гибкие механизмы для размещения множества сайтов на одном сервере, хотя и с разными подходами к конфигурации и обработке запросов.

Ключевые шаги универсальны: подготовка доменных имен и файловой структуры, создание конфигурационного файла с указанием корневой директории и домена, проверка синтаксиса и перезагрузка сервиса. Не забывайте о критической важности безопасности (права доступа, HTTPS) и следуйте best practices для стабильной и производительной работы ваших веб-проектов.

Данного руководства должно быть достаточно для уверенного старта работы с виртуальными хостами на вашем хостинге.

  • 0 Пользователи нашли это полезным

Помог ли вам данный ответ?

Ищете что-то другое?

mhost.by