Linux Labs

Веб-стек / Ступень 1 из 9

Как nginx выбирает сайт и файл

Не запущена Запускается обычно ~20 с
Выйти из урока

Шаг 2 из 7 · теория · 6 мин

Имя сайта едет в запросе

Один nginx принимает запросы к обоим сайтам на порту 80. Здесь — как он понимает, какой сайт у него просят.

Адрес сайта curl обрабатывает в два этапа. Имя docs.lab.test он переводит в адрес 127.0.0.1 и подключается к порту 80 — для подключения имя больше не нужно. Потом отправляет запрос HTTP и пишет в нём имя сайта заголовком Host. curl -v показывает запрос строками с >:

text
> GET / HTTP/1.1
> Host: docs.lab.test

Сайт в конфигурации nginx — блок server. В нём listen — порт, на котором блок принимает запросы, server_name — имена сайта, root — каталог с его файлами. Так описан портал:

nginx
server {
    listen 80 default_server;
    server_name portal.lab.test;
    root /srv/www/portal;
    index index.html;
}

Запрос пришёл на порт 80 — nginx ищет среди блоков этого порта тот, у которого в server_name есть имя из Host. Не нашёл — отвечает сервер по умолчанию: блок с параметром default_server в listen, а без такого параметра — первый блок этого порта.

Заголовок можно задать руками: curl -H 'Host: docs.lab.test' http://127.0.0.1/ подключится к 127.0.0.1, а сайт попросит по имени из -H. Так проверяют сайт, когда имя ещё никуда не ведёт.

Проверь себя 1 вопрос

Блок 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.
Ubuntu 24.04
Загрузка…