В одной из прошлых статей мы говорили о том, как выполняется установка и первоначальная настройка веб-сервера Nginx в CentOS 7. Этот веб-сервер завоевал огромную популярность благодаря высокой производительности и удачной архитектуре самой программы, из-за которой такая производительность и стала возможной.
Одна из основных возможностей веб-сервера - обслуживание нескольких сайтов на одном IP-адресе и в одной программе. Эта функция реализована с помощью виртуальных хостов. В этой статье мы разберём, как выполняется настройка виртуальных хостов в Nginx. Прежде чем читать статью дальше, я рекомендую просмотреть статью настройка Nginx, чтобы понять общий синтаксис конфигурационного файла.
Содержание статьи
Настройка виртуального хоста Nginx
Вообще, у Nginx только один конфигурационный файл - это /etc/nginx/nginx.conf. Все остальные файлы из папки /etc/nginx/* подключаются в этот файл с помощью директивы include. Поэтому теоретически все виртуальные хосты или только часть из них могут быть размещены в этом файле. Однако так делать не рекомендуется.
Для этого уже существует папка /etc/nginx/sites-available/ и /etc/nginx/sites-enabled. Первая просто содержит файлы конфигурации, в каждом из которых находится отдельный виртуальный хост. Вторая папка содержит ссылки на файлы из /etc/nginx/sites-available и подключена к основному конфигурационному файлу. Даже если в вашей системе пока такая структура не используется, я рекомендую её создать, чтобы в конфигурации всегда был порядок.
1. Синтаксис виртуального хоста
Каждый виртуальный хост представляет из себя такой блок кода:
server {
listen ip_адрес:порт;
server_name доменные_имена;
root /путь/к/файлам/сайта/;
index index.php index.html;
....
location / {}
....
}
Кроме того, здесь могут использоваться и другие инструкции, но эти основные и обязательные.
- listen - указывает на IP-адрес и порт, на котором программа будет ожидать соединения от этого сайта. Чтобы выбрать любой IP-адрес, можно указать звёздочку, а порт указывать обязательно. Также в этой строке можно добавить параметр default_server, тогда этот виртуальный хост будет использоваться по умолчанию;
- server_name - доменные имена, на которые будет отзываться этот хост. При отправке запроса на сервер, браузер указывает, к какому домену он обращается. Nginx анализирует этот параметр и выбирает необходимый виртуальный хост. Чтобы обрабатывать все домены, используйте символ подчеркивания _;
- root - путь к файлам сайта, которые будут открываться при запросе к этому виртуальному хосту. У Nginx должен быть доступ на чтение ко всем папкам по этому пути;
- index - файлы, которые будут открываться, если адрес файла не указан в URL;
- location - это набор правил обработки путей в url. Каждый location может содержит путь URL а внутри него можно настроить открытие другого файла, аутентификацию, запрос к другому серверу и другие подобные вещи. Nginx анализирует все location в конфигурационном файле и выбирает самое подходящее. Из этого правила есть одно исключение. Если несколько location содержат регулярные выражения, то для обработки будет выбран первый подходящий.
2. Виртуальный хост по умолчанию
Теперь разберём создание виртуальных хостов nginx на примере. Давайте создадим виртуальный хост, который будет обрабатывать все необработанные запросы:
sudo vi /etc/nginx/sites-available/000-default.conf
Все директивы, которые используются в блоке server, могут использоваться и в блоках location. Но нам не обязательно указывать root и index в каждом location. Если их опустить, то будут наследоваться те, которые были указаны в родительском блоке. Блоки server ведут себя аналогичным образом, поэтому, если мы не укажем другой путь к access.log, то будет использоваться путь, указанный в /etc/nginx/nginx.conf и так далее.
Теперь нам нужно активировать созданный виртуальный хост nginx. Для этого создайте символическую ссылку:
sudo ln -s /etc/nginx/sites-available/000-default.conf /etc/nginx/sites-enabled/000-default.conf
Затем убедитесь, что файлы из этого каталога подключены в основном конфигурационном файле:
sudo vi /etc/nginx/nginx.conf
Затем выполните эту команду, чтобы убедится, что вы не допустили ошибок:
nginx -t
Далее перечитайте конфигурацию nginx:
nginx -s reload
Теперь, если вы откроете IP-адрес сервера, то откроется созданный нами виртуальный хост.
2. Виртуальный хост с доменом
Аналогичным образом можно создать виртуальный хост для домена. Например example.ru:
sudo vi /etc/nginx/sites-available/example.conf
Если вы работаете на локальной машине и доступа к DNS выбранного домена у вас нет, то надо добавить его IP в файл /etc/hosts:
sudo vi /etc/hosts
Повторите процедуру активации домена, и затем в браузере при запросе к домену example.ru откроется стартовая страница Nginx. Если по каким-либо причинам виртуальный хост Nginx не работает, вы можете посмотреть полный скомпилированный файл nginx.conf:
nginx -T
Также можно проверить, есть ли в нём конфигурация нужного хоста, например, ищем упоминания example.ru:
nginx -T | grep example.ru
3. Отключение виртуального хоста
Благодаря структуре директорий, которую мы использовали, будет довольно просто отключить ненужный хост. Все наши виртуальные хосты Nginx находятся в папке /etc/nginx/sites-available, а в активной папке только ссылки на эти файлы. Поэтому для удаления достаточно удалить на него ссылку из папки /etc/nginx/sites-enabled/:
rm /etc/nginx/sites-enabled/001-example.conf
А затем, при необходимости, мы можем активировать его обратно, просто создав ссылку.
Выводы
В этой статье была рассмотрена настройка виртуальных хостов Nginx. Как видите, всё довольно просто и очень удобно, особенно, если вам нужно иметь несколько сайтов на одной машине. Конечно, у Nginx нет таких удобных утилит для активации сайтов, как в Apache, но работать вполне можно.
Здравствуйте
А есть возможность в nginx сделать вирт папки в каждый домен? Вроде на апаче можно было...
Можно создать location, который будет эмулировать нужную папку для каждого домена. Но в Apache за основу берется путь в файловой системе, а в Nginx - url. Это отличие надо учитывать.
Доброго!
А можете про load-balancer написать статью? 🙂
Всем привет! Почему мой домен зависит от настроек default в /etc/nginx/sites-available
У меня также создан отдельный config для домена в /etc/nginx/sites-available
Но если я переименую default, то перестает работать адрес по IP и домену.
Все настройки берутся с default, а отдельный config домена игнорируется.
В /etc/nginx/sites-enabled только папка default, как создать для своего домена?
Прошу помочь разобраться! Стоит Nginx на Ubuntu 18.04
спасибо.
зы
картинки красивые, но не у всех перед ними есть текст с приблизительным содержанием, что должны увидеть. а картинка про etc/hosts так вообше повторяет предыдущую.
Думаю, что на скрине ошибка sudo vi /etc/nginx/nginx.conf в файле. Кажется, инклюда должна быть sites-enabled. Новичок, поправьте если не прав
Автор, вот понту от твоей статьи, если ты забыл главное? После создания хоста, где инфа о том, что нужно создать симлинк в каталог /etc/nginx/sites-enabled/ ??
sudo ln -s /etc/nginx/sites-available/newhost /etc/nginx/sites-enabled/