Все разработчики бессознательно воспринимают и используют localhost == 127.0.0.1 так же, как и концепцию 1+1=2, но, как математики пытаются доказать, почему 1+1 равно 2, мне сегодня стало интересно, почему происходит это соединение. Поэтому я решил разобраться в этом принципе, и в результате я по-новому понял механизм связи в Linux. Это дало мне ощущение логической строгости разработчиков, и я не мог не восхищаться процессом постижения этого принципа. Ниже я собрал информацию, которую получил в этом процессе.

1. Как localhost соединяется с 127.0.0.1?

Вопрос: Почему вызов localhost приводит к соединению с 127.0.0.1?

Ответ: Когда на системе Linux происходит сетевой запрос, доменное имя преобразуется в IP-адрес. В этом процессе система сначала проверяет /etc/hosts файл. По умолчанию в файле /etc/hosts содержится следующая настройка:

127.0.0.1    localhost

Здесь 127.0.0.1 указывает на интерфейс loopback, что означает самого себя. Поэтому, когда вы вызываете http://localhost в браузере или терминале, Linux напрямую соединяет этот запрос с 127.0.0.1 через файл /etc/hosts, минуя DNS. В результате имя localhost в системе Linux выступает как псевдоним (alias), который указывает на самого себя.

2. Что такое файл /etc/hosts и какую роль он играет?

Вопрос: Как именно работает файл /etc/hosts?

Ответ: Файл /etc/hosts является одним из самых основных механизмов в процессе разрешения имен хостов в Linux. Когда происходит сетевой запрос, Linux преобразует доменное имя в IP-адрес в следующем порядке:

  1. Проверка файла /etc/hosts: Функция getaddrinfo(), предоставляемая библиотекой glibc в Linux, является отправной точкой всех сетевых запросов. Эта функция сначала проверяет файл /etc/hosts при интерпретации IP-адреса домена. Если домен определен в /etc/hosts, Linux использует эту информацию и возвращает IP-адрес сразу, минуя DNS-сервер.
  2. Запрос к DNS-серверу: Если домен не определен в файле /etc/hosts, происходит запрос IP-адреса к установленному DNS-серверу.

Файл /etc/hosts применяется ко всем сетевым запросам и работает одинаково для библиотек сетевых запросов, таких как браузеры, curl, ping и модуль requests в Python.

3. Какие возможности открывает использование /etc/hosts?

Вопрос: Какой эффект дает добавление домена в файл /etc/hosts?

Ответ: Если вы добавите желаемое доменное имя и IP-адрес в файл /etc/hosts, при вызове этого домена запрос будет направлен напрямую на указанный IP, минуя DNS. Например:

127.0.0.1    localhost
127.0.0.1    app1.local
127.0.0.1    app2.local

При такой настройке:

  • Если поступит запрос на app1.local или app2.local, Linux маршрутирует его на 127.0.0.1.
  • Это полезно для тестирования виртуальных доменов в разрабатываемой среде или для внутренней связи между приложениями.
  • Запрашиваемые домены имеют такую же эффективность, как localhost, но могут обрабатываться независимо друг от друга.

4. Как Nginx и Gunicorn взаимодействуют с /etc/hosts?

Вопрос: Могут ли такие серверы, как Nginx и Gunicorn, взаимодействовать с файлом /etc/hosts?

Ответ: Веб-серверы, такие как Nginx, работают на уровне сетевой подсистемы Linux и поэтому используют домены, установленные в /etc/hosts. Например:

  • Если в /etc/hosts указано 127.0.0.1 app1.local, Nginx перенаправляет запросы на этот домен на приложение, сопоставленное с 127.0.0.1.
  • Вы можете настроить виртуальные хосты (virtual hosts) в Nginx, чтобы разделить запросы по доменам. Пример:
server {
    server_name app1.local;
    location / {
        proxy_pass http://127.0.0.1:8000;  # сервис app1
    }
}

server {
    server_name app2.local;
    location / {
        proxy_pass http://127.0.0.1:8001;  # сервис app2
    }
}

Эта настройка позволяет запускать два приложения на одном сервере независимо друг от друга.

5. Как файл /etc/hosts может быть полезен в среде разработки?

Вопрос: В каких случаях файл /etc/hosts действительно полезен?

Ответ: Файл /etc/hosts особенно полезен в средах разработки и тестирования в следующих ситуациях:

  • Тестирование локальных доменов: Можно протестировать определенный домен в локальной среде, например, сопоставить https://test.local с локальным приложением.
  • Обход DNS: Временно соединить с другим IP без настоящей настройки DNS-сервера. Например, соединить example.com с другим IP сервера.
  • Внутренняя связь между приложениями: Используя /etc/hosts для связи между различными приложениями, которые работают на одном сервере, можно снизить количество запросов DNS и оптимизировать скорость связи.

6. Ценность /etc/hosts в проблемах с динамическим IP и кэшированием DNS

Личный опыт: Разработчики, использующие динамические IP, обычно решают проблемы с изменением IP через DDNS (Dynamic DNS). Однако есть одна проблема: хосты Linux имеют кэш DNS, поэтому до истечения TTL (Time to Live) они продолжают использовать старый IP-адрес. Это может привести к проблемам с TCP-запросами между приложениями, которые будут отправлены на старый IP, если не удалить кэш вручную с помощью команды sudo resolvectl flush-caches.

Для решения этой проблемы можно использовать /etc/hosts для постоянного маршрутизации определенного домена на фиксированный IP, обходя DNS. Это помогло мне коренным образом предотвратить проблемы с коммуникацией из-за изменений IP. Этот простой настройка удивительным образом стала ключом к решению проблемы.

В заключение

Весь этот процесс заставил меня осознать, что бессознательное использование localhost и файла /etc/hosts на самом деле тесно связано с основными сетевыми механизмами Linux. Я чувствовал восхищение тем, насколько логически и тщательно разработаны такие основные структуры разработчиками Linux. Удивительно, как один простой файл может играть такую важную роль как в среде разработки, так и в рабочей среде.

Этот опыт снова напоминает мне, как полезно понимать суть технологии. 😊

Иллюстрация использования файла /etc/hosts