Виртуальные хосты Nginx: размещение нескольких веб-сайтов на одном сервере
Современная веб-инфраструктура часто требует возможности обслуживать несколько веб-сайтов или веб-приложений с одного экземпляра сервера. Это не только оптимизирует использование ресурсов, но и упрощает управление, а также снижает эксплуатационные расходы. Nginx, известный своей высокой производительностью, стабильностью, богатым набором функций и низким потреблением ресурсов, достигает этого с помощью так называемых блоков сервера (server blocks), которые в мире Apache часто называют виртуальными хостами (virtual hosts).
В этом подробном руководстве мы расскажем вам о процессе настройки виртуальных хостов Nginx для эффективного управления и обслуживания нескольких отдельных доменных имен или субдоменов на одном сервере Nginx. Независимо от того, размещаете ли вы example.com и anothersite.org, или основной сайт с субдоменами, такими как blog.example.com и shop.example.com, освоение блоков сервера Nginx является фундаментальным навыком для любого системного администратора или разработчика. К концу этой статьи вы получите четкое представление и практические примеры для настройки вашего сервера Nginx для многосайтового хостинга.
Понимание блоков сервера Nginx (виртуальных хостов)
По своей сути, блок сервера Nginx — это директива конфигурации, определенная в файле конфигурации Nginx (nginx.conf или включенных файлах). Каждый блок server определяет конфигурацию для конкретного виртуального хоста, предписывая Nginx, как реагировать на запросы для определенного домена или набора доменов. Nginx использует директиву listen для указания IP-адреса и порта, который он должен прослушивать, и директиву server_name для идентификации доменных имен или хостов, на которые должен отвечать этот блок сервера.
Когда поступает запрос, Nginx проверяет заголовок Host HTTP-запроса и сравнивает его с директивами server_name настроенных блоков сервера. Затем он обслуживает контент, определенный в соответствующем блоке сервера. Если совпадений server_name не найдено, Nginx обычно обращается к блоку сервера по умолчанию (default server block) (первому блоку server или тому, который явно отмечен как default_server).
Предварительные требования
Прежде чем начать, убедитесь, что у вас есть следующее:
- Установленный Nginx: Nginx должен быть установлен и запущен на вашем сервере. Если нет, вы можете установить его с помощью системного менеджера пакетов (например,
sudo apt update && sudo apt install nginxв Ubuntu/Debian,sudo yum install nginxв CentOS/RHEL). - Доменные имена: Вам необходимо как минимум два доменных имени (например,
example1.comиexample2.com) или субдомена (например,blog.example.comиapp.example.com), которые вы хотите разместить. DNS A/AAAA записи этих доменов должны указывать на публичный IP-адрес вашего сервера. - Базовая структура каталогов: План того, где будут находиться файлы вашего веб-сайта. Распространенной практикой является
/var/www/yourdomain.com/html. - Права Sudo: Вам потребуется доступ
sudoдля изменения файлов конфигурации Nginx.
Пошаговое руководство по настройке
Давайте настроим два виртуальных хоста: example1.com и example2.com.
Шаг 1: Создание структуры каталогов для веб-сайтов
Сначала создайте корневые каталоги для каждого из ваших веб-сайтов. Здесь будут храниться их HTML, CSS, JavaScript и другие статические файлы. Распространенное местоположение — /var/www/.
sudo mkdir -p /var/www/example1.com/html
sudo mkdir -p /var/www/example2.com/html
# Установите права собственности для вашего пользователя (замените $USER на ваше имя пользователя), чтобы разрешить редактирование
sudo chown -R $USER:$USER /var/www/example1.com/html
sudo chown -R $USER:$USER /var/www/example2.com/html
# Установите права на чтение для веб-сервера
sudo chmod -R 755 /var/www
Затем создайте простой файл index.html в каждом каталоге для проверки настройки:
Для /var/www/example1.com/html/index.html:
<!-- /var/www/example1.com/html/index.html -->
<!DOCTYPE html>
<html>
<head>
<title>Welcome to Example1.com!</title>
</head>
<body>
<h1>Success! This is Example1.com.</h1>
<p>This virtual host is working correctly.</p>
</body>
</html>
Для /var/www/example2.com/html/index.html:
<!-- /var/www/example2.com/html/index.html -->
<!DOCTYPE html>
<html>
<head>
<title>Welcome to Example2.com!</title>
</head>
<body>
<h1>Success! This is Example2.com.</h1>
<p>This virtual host is also working!</p>
</body>
</html>
Шаг 2: Создание файлов конфигурации блоков сервера Nginx
Nginx обычно загружает конфигурации блоков сервера из файлов в каталоге /etc/nginx/sites-enabled/. Эти файлы, как правило, являются символическими ссылками (symlinks) на конфигурации, хранящиеся в /etc/nginx/sites-available/. Такое разделение позволяет хранить неактивные конфигурации или легко включать/отключать сайты.
Создайте новый файл конфигурации для example1.com:
sudo nano /etc/nginx/sites-available/example1.com.conf
Добавьте следующее содержимое:
# /etc/nginx/sites-available/example1.com.conf
server {
listen 80;
listen [::]:80;
root /var/www/example1.com/html;
index index.html index.htm index.nginx-debian.html;
server_name example1.com www.example1.com;
location / {
try_files $uri $uri/ =404;
}
access_log /var/log/nginx/example1.com_access.log;
error_log /var/log/nginx/example1.com_error.log;
}
Пояснение директив:
listen 80;: Nginx прослушивает порт 80 (стандартный HTTP).listen [::]:80;предназначен для IPv6.root /var/www/example1.com/html;: Указывает корневой каталог документов для этого блока сервера. Nginx будет искать файлы внутри этого каталога.index index.html ...;: Определяет файл по умолчанию, который Nginx должен обслуживать при запросе каталога (например, когда кто-то посещаетexample1.com/).server_name example1.com www.example1.com;: Это критически важно. Он указывает Nginx отвечать на запросы дляexample1.comилиwww.example1.com, используя конфигурацию этого блока сервера.location / { ... }: Блок, определяющий, как обрабатывать запросы для конкретных URI.try_filesпытается обслужить файл напрямую ($uri), затем каталог ($uri/) и, наконец, возвращает ошибку404 Not Found.access_logиerror_log: Определяют отдельные файлы журналов для этого конкретного сайта, что является хорошей практикой для упрощения отладки и аналитики.
Теперь создайте аналогичный файл конфигурации для example2.com:
sudo nano /etc/nginx/sites-available/example2.com.conf
Добавьте следующее содержимое:
# /etc/nginx/sites-available/example2.com.conf
server {
listen 80;
listen [::]:80;
root /var/www/example2.com/html;
index index.html index.htm index.nginx-debian.html;
server_name example2.com www.example2.com;
location / {
try_files $uri $uri/ =404;
}
access_log /var/log/nginx/example2.com_access.log;
error_log /var/log/nginx/example2.com_error.log;
}
Шаг 3: Включение блоков сервера
Чтобы включить эти конфигурации, создайте символические ссылки из каталога sites-available в каталог sites-enabled. Это указывает Nginx включать эти файлы при запуске.
sudo ln -s /etc/nginx/sites-available/example1.com.conf /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/example2.com.conf /etc/nginx/sites-enabled/
Шаг 4: Тестирование конфигурации Nginx
Крайне важно проверить конфигурацию Nginx на наличие синтаксических ошибок перед перезагрузкой. Это предотвратит сбой перезапуска Nginx из-за опечатки.
sudo nginx -t
Вы должны увидеть примерно такой вывод, указывающий на успех:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
Если вы видите какие-либо ошибки, исправьте их в соответствующих файлах конфигурации и снова запустите sudo nginx -t, пока проверка не будет пройдена.
Шаг 5: Перезапуск Nginx
Примените новую конфигурацию, перезапустив или перезагрузив Nginx. reload обычно предпочтительнее, поскольку он позволяет Nginx загружать новые конфигурации без разрыва активных соединений.
sudo systemctl reload nginx
# Или, если reload не работает или для свежих установок:
sudo systemctl restart nginx
Шаг 6: Обновление DNS-записей
Убедитесь, что DNS A-записи для example1.com, www.example1.com, example2.com и www.example2.com указывают на IP-адрес вашего сервера Nginx. Без правильных записей DNS ваш браузер не будет знать, где найти ваши веб-сайты.
После завершения распространения DNS (что может занять от нескольких минут до нескольких часов) вы сможете посетить http://example1.com и http://example2.com в своем веб-браузере и увидеть соответствующие страницы index.html.
Расширенные сценарии и лучшие практики
Размещение субдоменов
Размещение субдоменов (например, blog.example.com, shop.example.com) работает точно так же, как размещение отдельных доменов. Вам просто нужно определить новый блок сервера с субдоменом в качестве server_name.
Пример для blog.example.com:
# /etc/nginx/sites-available/blog.example.com.conf
server {
listen 80;
listen [::]:80;
root /var/www/blog.example.com/html;
index index.html;
server_name blog.example.com;
location / {
try_files $uri $uri/ =404;
}
}
Не забудьте создать каталог (/var/www/blog.example.com/html), создать index.html, создать символическую ссылку и перезагрузить Nginx.
Блок сервера по умолчанию (The Default Server Block)
Хорошей практикой является наличие блока сервера по умолчанию, который перехватывает запросы для доменных имен, не соответствующих ни одной другой директиве server_name на вашем сервере. Это предотвращает обслуживание неизвестных запросов "первым" виртуальным хостом, который найдет Nginx, или позволяет вам показать общую страницу "сайт не найден".
Как правило, первый блок server в вашем nginx.conf или sites-enabled неявно является блоком по умолчанию. Вы можете явно установить его, используя default_server:
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
# Подчеркивание `_` — это несуществующее доменное имя, которое никогда не совпадет с реальным запросом.
# Вы также можете использовать localhost.
root /var/www/default_site/html;
index index.html;
location / {
return 444; # Вернуть ошибку 444, специфичную для Nginx (нет ответа) для неизвестных хостов
# Или обслуживать общую целевую страницу:
# try_files $uri $uri/ =404;
}
}
Предупреждение: Если вы определяете блок default_server, убедитесь, что только один блок server на данном порту listen имеет флаг default_server, иначе Nginx запишет предупреждение в журнал.
Защита виртуальных хостов с помощью HTTPS (SSL/TLS)
Для production-веб-сайтов включение HTTPS является обязательным. Это включает в себя получение сертификата SSL/TLS (например, через Let's Encrypt с использованием Certbot) и настройку Nginx для прослушивания порта 443 с использованием сертификата.
Типичный блок сервера HTTPS выглядит следующим образом (после получения сертификатов):
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name example1.com www.example1.com;
root /var/www/example1.com/html;
index index.html;
ssl_certificate /etc/letsencrypt/live/example1.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example1.com/privkey.pem;
# Включите другие конфигурации SSL (шифры, протоколы и т. д.)
include /etc/nginx/snippets/ssl-params.conf;
include /etc/nginx/snippets/force-ssl.conf; # Опционально: перенаправляет HTTP на HTTPS
location / {
try_files $uri $uri/ =404;
}
}
# Опционально: перенаправление HTTP на HTTPS для этого домена
server {
listen 80;
listen [::]:80;
server_name example1.com www.example1.com;
return 301 https://$host$request_uri;
}
Распространено использование отдельного блока сервера HTTP, единственной целью которого является перенаправление всего трафика на его аналог HTTPS.
Журналирование для каждого сайта
Как показано в примерах, выделение отдельных файлов access_log и error_log для каждого виртуального хоста является лучшей практикой. Это значительно упрощает отладку проблем и анализ трафика для отдельных веб-сайтов без необходимости просеивания объединенных журналов.
Структура файла конфигурации
Для крупных развертываний рассмотрите возможность организации файлов конфигурации Nginx следующим образом:
nginx.conf: Основная конфигурация, включаетconf.d/*.confиsites-enabled/*.conf.d/: Общие настройки для всего сервера (например, Gzip, кэширование).snippets/: Повторно используемые фрагменты конфигурации Nginx (например, параметры SSL, общие блокиlocation).sites-available/: Отдельные блокиserverдля каждого веб-сайта.sites-enabled/: Символические ссылки на активные конфигурации вsites-available/.
Устранение распространенных проблем
- Ошибка 403 Forbidden (Запрещено): Обычно это означает, что Nginx не имеет прав на чтение файлов или каталогов вашего веб-сайта. Тщательно проверьте права доступа к файлам и каталогам (например,
sudo chmod -R 755 /var/www/yourdomain.com/html) и убедитесь, что пользователь Nginx, обычноwww-dataилиnginx, может их читать. - Ошибка 404 Not Found (Не найдено): Убедитесь, что директива
rootв вашем блоке сервера указывает на правильный каталог и что ваш файлindex.htmlсуществует в этом месте. Также убедитесь, чтоtry_filesнастроен правильно. - Загружается неправильный сайт: Это часто указывает на проблему с директивой
server_name. Убедитесь, чтоserver_nameточно соответствует доменному имени, к которому вы пытаетесь получить доступ (включаяwww.или субдомены). Также проверьте свои DNS-записи. - Сбой запуска/перезагрузки Nginx: Всегда используйте
sudo nginx -tдля проверки конфигурации перед попыткой перезагрузки или перезапуска Nginx. Сообщения об ошибках укажут строку и файл, где произошла синтаксическая ошибка. - Проблемы с DNS: Если вы можете получить доступ к своему сайту по IP-адресу, но не по доменному имени, это почти наверняка проблема с DNS. Используйте
digилиnslookup, чтобы убедиться, что A-записи вашего домена указывают на правильный IP-адрес сервера.
Заключение
Виртуальные хосты Nginx (блоки сервера) предоставляют мощный и гибкий способ размещения нескольких веб-сайтов на одном сервере. Правильно настроив блоки server с соответствующими директивами listen, server_name, root и location, вы сможете эффективно управлять разнообразными веб-ресурсами. Такой подход не только экономит ресурсы, но и централизует администрирование сервера.
Благодаря базовым знаниям и практическим шагам, изложенным в этом руководстве, вы теперь готовы к настройке и управлению несколькими доменами на вашем сервере Nginx. Не забывайте всегда тестировать свои конфигурации, защищать свои сайты с помощью HTTPS и следовать передовым методам журналирования и структуры каталогов для создания надежной и удобной в обслуживании веб-среды. Отсюда вы можете продолжить изучение возможностей Nginx, таких как обратное проксирование, балансировка нагрузки и кэширование, для повышения производительности и надежности вашего веб-сервера.