127.0.0.1 и localhost уже не одно и то же?
В последнее время у меня несколько раз возникала проблема, связанная с подключением CMS к серверу MySQL. Всё вроде бы работало и параметры были прописаны правильно, но достучаться до баз никак не получалось. Случалось это после обновления у хостера (несколько дней назад) и при установке MODx на локальный Lampp (сегодня).
Решение оказалось довольно простым и неожиданным — достаточно было в настройках CMS заменить localhost на 127.0.0.1.
Подробное объяснение данного «феномена» читайте в комментарии ниже.
Просто нужно понимать одну простую штуку. localhost это просто доменное имя, не более (как mail.ru или lampslave.ru) и резолвится оно в 127.0.0.1 только лишь оттого, что в файле hosts есть запись 127.0.0.1 localhost (причем как на винде, так и линях, сам посмотри). Ни чего не мешает через этот же файл сопоставить localhost еще с каким либо IP адресом. Зачастую с localhost сопоставляют еще и адрес самого сервера. В результате имя localhost не обязательно должно резолвится в 127.0.0.1 адрес, более того, localhost не обязан резолвится только в один адрес, он может резолвиться в большое количество адресов. Пример:
[alekciy: ~]# nslookup lampslave.ru
Server: 213.133.98.98
Address: 213.133.98.98#53
Non-authoritative answer:
Name: lampslave.ru
Address: 188.40.255.89
[alekciy: ~]# nslookup localhost
Server: 213.133.98.98
Address: 213.133.98.98#53
Non-authoritative answer:
Name: localhost
Address: 127.0.0.1
В тоже время 127.0.0.1 это специальный IP адрес. Даже скажу более 127.0.0.0/24 это специальная сеть (диапазон адресов 127.0.0.1—127.255.255.255) относящаяся к lookback интерфейсу (виртуальный по сути интерфейс соединения по которому просто не доходят до сетевой карты, все происходит внутри сервера, используется для межпросессорного взаимодействия когда и клиент и сервер на одной машине).
Резюмируя. localhost это просто ДОМЕННОЕ ИМЯ, 127.0.0.1 это IP АДРЕС. Когда клиент пытается войти на localhost, а сервер прослушивает 127.0.0.1 адрес ни кто не гарантируется, что localhost отрезолвится в 127.0.0.1. Может так случится, что он совершенно в другой адрес и клиент пошлет запрос совершенно в другое место где нужно нам сервера просто нет.