Alle Entwickler akzeptieren und verwenden unbewusst das Konzept, dass localhost == 127.0.0.1 ist, ähnlich wie 1+1=2. Aber ebenso wie Mathematiker versuchen, zu beweisen, warum 1+1 2 ergibt, wurde ich heute plötzlich neugierig auf diesen Teil. Daher habe ich dieses Prinzip untersucht und dabei die Kommunikationsmechanismen von Linux neu verstanden. Dies hat mir die logische Strenge von Entwicklern nähergebracht, und im Prozess des Verstehens konnte ich mich nur wundern. Unten sind die Informationen, die ich auf dieser Reise gesammelt habe.
1. Wie wird localhost mit 127.0.0.1 verbunden?
Frage: Warum verbindet ein Aufruf von localhost mit 127.0.0.1?
Antwort: Ein Linux-System wandelt bei der Generierung einer Netzwerk-Anfrage den Domainnamen in eine IP-Adresse um. Dabei wird zuerst die /etc/hosts Datei überprüft. Standardmäßig enthält die /etc/hosts Datei folgende Einstellungen:
127.0.0.1 localhost
Hier verweist 127.0.0.1 auf die Loopback-Schnittstelle, die sich selbst bedeutet. Daher, wenn man http://localhost
im Browser oder Terminal aufruft, verbindet Linux diese Anfrage direkt mit 127.0.0.1, ohne über DNS zu gehen. Folglich fungiert der Name localhost intern in Linux als Alias (Spitzname) für sich selbst.
2. Was ist die /etc/hosts Datei und welche Rolle spielt sie?
Frage: Wie funktioniert die /etc/hosts Datei genau?
Antwort: Die /etc/hosts Datei ist eines der grundlegenden Mechanismen im Hostname-Resolving-Prozess von Linux. Wenn eine Netzwerk-Anfrage generiert wird, wandelt Linux den Domainnamen in eine IP-Adresse in folgender Reihenfolge um:
- Überprüfung der /etc/hosts Datei: Die Funktion getaddrinfo(), bereitgestellt von der glibc-Bibliothek von Linux, ist der Ausgangspunkt für alle Netzwerk-Anfragen. Diese Funktion überprüft zunächst die /etc/hosts Datei, wenn sie die IP-Adresse eines Domainnamens interpretiert. Wenn der Domainname in /etc/hosts definiert ist, gibt Linux diese Information zurück, ohne den DNS-Server zu kontaktieren.
- Anfrage an den DNS-Server: Wenn der Domainname nicht in der /etc/hosts Datei definiert ist, wird die IP-Adresse über den konfigurierten DNS-Server abgefragt.
Die /etc/hosts Datei wirkt auf alle Netzwerk-Anfragen und funktioniert somit auch in den Netzwerk-Anfragebibliotheken von Browsern, curl, ping und dem requests-Modul in Python.
3. Was ist möglich, wenn man /etc/hosts nutzt?
Frage: Welche Auswirkungen hat es, wenn man einen Domainnamen zur /etc/hosts Datei hinzufügt?
Antwort: Wenn man einen gewünschten Domainnamen und die zugehörige IP-Adresse in die /etc/hosts Datei hinzufügt, wird diese Domain direkt mit der festgelegten IP verbunden, ohne den DNS zu verwenden. Zum Beispiel:
127.0.0.1 localhost
127.0.0.1 app1.local
127.0.0.1 app2.local
Mit dieser Einstellung:
- Wenn Anfragen an app1.local oder app2.local gestellt werden, routet Linux diese zu 127.0.0.1.
- Es ist nützlich, um in der Entwicklungsumgebung virtuelle Domain-Tests oder interne Kommunikation zwischen Anwendungen einzurichten.
- Die angeforderte Domain hat die gleiche Wirkung wie localhost, ermöglicht jedoch die unabhängige Behandlung jeder Domain.
4. Wie arbeiten Nginx und Gunicorn mit /etc/hosts zusammen?
Frage: Können Server wie Nginx und Gunicorn mit der /etc/hosts Datei interagieren?
Antwort: Da Webserver wie Nginx auf der Linux-Netzwerkschicht arbeiten, befolgen sie die in /etc/hosts festgelegten Domains. Zum Beispiel:
- Wenn in der /etc/hosts Datei
127.0.0.1 app1.local
festgelegt ist, leitet Nginx diese Domainanfragen an die Anwendung weiter, die mit 127.0.0.1 verbunden ist. - Man kann in Nginx virtuelle Hosts einrichten, um die Anfragen nach Domain zu trennen. Beispiel:
server {
server_name app1.local;
location / {
proxy_pass http://127.0.0.1:8000; # app1 service
}
}
server {
server_name app2.local;
location / {
proxy_pass http://127.0.0.1:8001; # app2 service
}
}
Diese Konfiguration ermöglicht es, zwei Anwendungen unabhängig auf demselben Server zu betreiben.
5. Wie ist /etc/hosts in Entwicklungsumgebungen nützlich?
Frage: In welchen Situationen ist die /etc/hosts Datei wirklich nützlich?
Antwort: Die /etc/hosts Datei ist besonders in Entwicklungs- und Testumgebungen in folgenden Situationen nützlich:
- Lokale Domain-Tests: Bestimmte Domains können lokal getestet werden. Z. B.:
https://test.local
in eine lokale Anwendung umleiten. - DNS-Umgehung: Temporäre Verbindung zu einer anderen IP ohne die tatsächlichen DNS-Servereinstellungen. Z. B.:
example.com
mit einer anderen Server-IP verbinden. - Interne Kommunikation zwischen Anwendungen: Durch die Verwendung von /etc/hosts in der Kommunikation zwischen mehreren Anwendungen, die auf demselben Server laufen, kann die Anzahl der DNS-Anfragen reduziert und die Kommunikationsgeschwindigkeit optimiert werden.
6. Der Wert von /etc/hosts bei dynamischen IP- und DNS-Cache-Problemen
Persönliche Erfahrung: Entwickler, die dynamische IPs verwenden, lösen häufig das IP-Änderungsproblem durch DDNS (Dynamic DNS). Es gibt jedoch ein Problem: Der Linux-Host hat einen DNS-Cache, weshalb er die vorherige IP bis zum Ablauf der TTL (Time to Live) weiterhin verwendet. Dies kann in der Kommunikation zwischen Anwendungen mit früheren IPs zu TCP-Anfragen führen, es sei denn, der Cache wird manuell mit sudo resolvectl flush-caches
gelöscht.
Um dieses Problem zu lösen, kann man mit /etc/hosts die DNS-Nutzung umgehen und eine bestimmte Domain immer auf eine feste IP umleiten. Ich habe die Erfahrung gemacht, dass ich so Kommunikationsprobleme, die durch IP-Änderungen verursacht wurden, vollständig verhindern konnte. Diese einfache Einstellung stellte sich als der Schlüssel zur Problemlösung heraus, was sehr beeindruckend war.
Fazit
Durch all diesen Prozess wurde mir bewusst, dass das unbewusste Nutzen von localhost und der /etc/hosts Datei eng mit den grundlegenden Netzwerkmechanismen von Linux verbunden ist. Ich fühlte eine Bewunderung dafür, wie logisch und präzise Linux-Entwickler solche grundlegenden Strukturen entworfen haben. Es war erstaunlich, dass eine einfache Datei sowohl in Entwicklungs- als auch in Produktionsumgebungen eine so wichtige Rolle spielen kann.
Diese Erfahrung hat mir erneut gezeigt, wie wertvoll der Prozess des Verstehens der Essenz der Technologie ist. 😊
Add a New Comment