В конфигурациях приложений часто встречается слово localhost, однако использование метки нередко может стать причиной неожиданных ошибок. В то же время использование адреса с числовыми значениями помогает избежать большинства проблем. Рассмотрим подробнее, почему так происходит.
В основе работы всего интернета лежат IP-протоколы. Они способны идентифицировать все хосты в сети по IP-адресу, что, собственно, и дает возможность осуществлять маршрутизацию пакетов данных. Соответственно, все устройства в сети работают не с именами доменов, а именно с IP-адресами.
При использовании метки localhost, которая является доменом, выполняется резолвинг — процесс его преобразования в IP-адрес. Эта процедура осуществляется с помощью команды resolving nslookup и доступна благодаря распределенной системе DNS.
После этого, при запуске какого-либо сервиса, например базы данных или Nginx, он слушает IP-адрес по определенному порту. Такая пара называется сокетом. В спецификации RFC 6761 вы можете отследить, в какой именно IP-адрес преобразуется localhost — это будет loopback-адрес. При этом в спецификации RFC 5735, где описан loopback-интерфейс говорится, что это не один конкретный IP-адрес, а целая сеть с диапазоном 127.0.0.0/8, которая может включать миллионы различных хостов. Например, loopback также может использовать адрес 127.1.1.1 и множество других.
Из этого следует основная проблема использования метки в конфигурациях — в таком случае мы получаем неоднозначность того, в какой именно IP-адрес будет резолвится localhost. На практике, в большинстве операционных систем преобразование действительно осуществляется в 127.0.0.1, но это лишь один из возможных адресов, и вам ничего не мешает использовать, например 127.11.11.11.
Такая неоднозначность может стать серьезной проблемой для разрабатываемого программного обеспечения. Фактически, в процессе резолвинга приложению приходится или обращаться к DNS операционной системы или как-то самостоятельно решать данный вопрос.
Для лучшего понимания рассмотрим простой практический пример, с использованием базы данных mySQL. Если в конфигурации сервера указан localhost, то клиент, соответственно, пытается присоединиться к localhost. При этом если юниксовый сокет в конфиге не указан или написан некорректно, то консольный клиент mySQL не сможет подключиться к серверу.
Чтобы избежать таких проблем, доменное имя localhost крайне не рекомендуется использовать в конфигурациях. Вместо этого лучше прописать точный адрес 127.0.0.1. Таким образом вы будете полностью уверены, что запрос направляется по нужному маршруту и с коммутацией на сервер не возникнет трудностей.