Один nginx принимает запросы к обоим сайтам на порту 80. Здесь — как он понимает, какой сайт у него просят.
Адрес сайта curl обрабатывает в два этапа. Имя docs.lab.test он переводит в адрес 127.0.0.1 и подключается к порту 80 — для подключения имя больше не нужно. Потом отправляет запрос HTTP и пишет в нём имя сайта заголовком Host. curl -v показывает запрос строками с >:
Сайт в конфигурации nginx — блок server. В нём listen — порт, на котором блок принимает запросы, server_name — имена сайта, root — каталог с его файлами. Так описан портал:
Запрос пришёл на порт 80 — nginx ищет среди блоков этого порта тот, у которого в server_name есть имя из Host. Не нашёл — отвечает сервер по умолчанию: блок с параметром default_server в listen, а без такого параметра — первый блок этого порта.
Заголовок можно задать руками: curl -H 'Host: docs.lab.test' http://127.0.0.1/ подключится к 127.0.0.1, а сайт попросит по имени из -H. Так проверяют сайт, когда имя ещё никуда не ведёт.
Блок docs ещё не включён. Что напечатает curl -H 'Host: nosuch.lab.test' http://127.0.0.1/?
-
Блока docs nginx не читает, а nosuch.lab.test не совпадает ни с одним
server_name: ответит сервер по умолчанию, портал. -
curl подключается к адресу из URL, 127.0.0.1, и имя из
-Hне ищет — он кладёт его в заголовокHost. -
Незнакомое имя nginx не отклоняет: запрос получает сервер по умолчанию — портал, и он отдаёт свою страницу.
Имя nosuch.lab.test не совпадает ни с одним server_name, поэтому запрос получает блок портала с default_server. curl подключается к 127.0.0.1 из URL, а имя из -H только передаёт в заголовке.
Главное в шаге
-
Имя сайта приходит в nginx заголовком
Host; адрес и порт только доводят запрос до nginx. -
Сайт — блок
server: nginx выбирает его поserver_nameсреди блоков того же порта. -
Имя, которого нет ни в одном
server_name, получает сервер по умолчанию — блок сdefault_server.