Localhost (loopback-адрес) — это сетевой интерфейс, замкнутый сам на себя. Пакет, отправленный на 127.0.0.1, не уходит в физическую сеть, а обрабатывается внутри стека TCP/IP операционной системы. Задержка — доли миллисекунды, потери — ноль.
Технические детали
Весь диапазон 127.0.0.0/8 (127.x.x.x) зарезервирован для loopback (RFC 5735). На практике используется только 127.0.0.1. В IPv6 loopback — адрес ::1. Сетевой интерфейс называется lo (Linux) или Loopback Adapter (Windows).
Имя localhost резолвится в 127.0.0.1 через файл /etc/hosts (Linux/macOS) или C:\Windows\System32\drivers\etc\hosts (Windows), а не через DNS-сервер.
Применение в разработке и хостинге
На сервере localhost используется для внутренней коммуникации компонентов: веб-сервер (Nginx) обращается к PHP-FPM на 127.0.0.1:9000, приложение — к Redis на 127.0.0.1:6379, к базе данных на 127.0.0.1:5432.
Сервисы, слушающие только на 127.0.0.1, недоступны снаружи — это базовый принцип безопасности. Если MySQL слушает 0.0.0.0:3306 вместо 127.0.0.1:3306 — база открыта для внешних подключений.
История
Концепция loopback появилась в ранних реализациях TCP/IP. Адрес 127.0.0.1 и диапазон 127.0.0.0/8 зафиксированы в RFC 990 (1986). Имя localhost определено в RFC 2606 (1999) как зарезервированное и никогда не делегируется для реальных доменов.
Localhost и Docker
В Docker каждый контейнер имеет свой loopback-интерфейс. localhost внутри контейнера — это контейнер, а не хост-машина. Для обращения к сервису на хосте из контейнера используется host.docker.internal (Docker Desktop) или IP-адрес docker0-интерфейса.
Localhost в разработке и хостинге
В разработке веб-приложений localhost — стандартный адрес локального сервера. PHP-разработчик запускает Apache/Nginx на localhost:80, MySQL на localhost:3306, Redis на localhost:6379. Соединения через localhost не проходят через сеть — это loopback-интерфейс в ядре ОС, что обеспечивает минимальную задержку (<0.1 мс) и максимальную безопасность (недоступен снаружи по умолчанию).
Unix-сокеты vs TCP localhost: соединение PHP-FPM с Nginx может идти через TCP 127.0.0.1:9000 или Unix-сокет /run/php/php8.2-fpm.sock. Unix-сокеты быстрее на 10–20% — нет overhead TCP-стека. Nginx конфиг: fastcgi_pass unix:/run/php/php8.2-fpm.sock;
Безопасность: привязка к localhost
Правило безопасности: сервисы без нужды в публичном доступе должны слушать только на 127.0.0.1 (или ::1 для IPv6). По умолчанию Redis слушает на 127.0.0.1, MySQL — тоже. Забыв это правило при настройке сервера, можно оставить MySQL открытым на 0.0.0.0:3306 — любой сможет попытаться подключиться. Проверка открытых портов: ss -tlnp или netstat -tlnp.
127.0.0.1 vs 0.0.0.0 vs localhost
127.0.0.1 — конкретный адрес loopback-интерфейса IPv4. ::1 — loopback IPv6. localhost — имя хоста, по умолчанию разрешается в 127.0.0.1 (через /etc/hosts). 0.0.0.0 — «все интерфейсы» — сервер принимает соединения на любой IP-адрес сервера. 0.0.0.0:80 — публичный веб-сервер, 127.0.0.1:9000 — локальный PHP-FPM. Разница принципиальна для безопасности. Loopback-интерфейс (lo) виден в выводе ip addr.