Alle Entwickler gehen unbewusst davon aus, dass `localhost` `127.0.0.1` entspricht, so selbstverständlich wie 1+1=2. Ähnlich wie Mathematiker versuchen zu beweisen, warum 1+1 2 ergibt, bin ich heute plötzlich neugierig auf diesen Zusammenhang geworden. Daher habe ich dieses Prinzip untersucht und dabei die Kommunikationsmechanismen von Linux neu verstanden. Dies hat mir die logische Strenge der Entwickler hinter diesen Mechanismen nähergebracht, und ich konnte im Prozess des Verstehens nur staunen. Im Folgenden finden Sie die Informationen, die ich auf dieser Reise gesammelt habe. ### 1. Wie wird `localhost` mit `127.0.0.1` verknüpft? {#sec-32162b337381} **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 Datei **/etc/hosts** überprüft. Standardmäßig enthält die Datei `/etc/hosts` folgende Einstellungen: ``` 127.0.0.1 localhost ``` Hier verweist `127.0.0.1` auf die Loopback-Schnittstelle, die **sich selbst** repräsentiert. Wenn man daher `http://localhost` im Browser oder Terminal aufruft, leitet Linux diese Anfrage direkt an `127.0.0.1` weiter, ohne den Umweg über DNS zu nehmen. Folglich fungiert der Name `localhost` intern unter Linux als **Alias (Spitzname)** für sich selbst. ### 2. Was ist die Datei `/etc/hosts` und welche Rolle spielt sie? {#sec-0aaf39de3b03} **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 Netzwerkanfrage generiert wird, wandelt Linux den Domainnamen in eine IP-Adresse in der folgenden Reihenfolge um: 1. **Überprüfung der Datei `/etc/hosts`**: Die Funktion `getaddrinfo()`, bereitgestellt von der `glibc`-Bibliothek unter Linux, ist der Ausgangspunkt für alle Netzwerkanfragen. Diese Funktion überprüft zunächst die Datei `/etc/hosts`, wenn sie die IP-Adresse eines Domainnamens auflöst. Ist der Domainname in `/etc/hosts` definiert, gibt Linux diese Information zurück, ohne den DNS-Server zu kontaktieren. 2. **Anfrage an den DNS-Server**: Wenn der Domainname nicht in der Datei `/etc/hosts` definiert ist, wird die IP-Adresse über den konfigurierten DNS-Server abgefragt. Die Datei `/etc/hosts` wirkt auf alle Netzwerkanfragen und funktioniert somit auch in den Netzwerkanfragen-Bibliotheken von Browsern, `curl`, `ping` und dem `requests`-Modul in Python. ### 3. Was ist möglich, wenn man die Datei `/etc/hosts` nutzt? {#sec-e5bb0c609d56} **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, leitet Linux diese an **127.0.0.1** weiter. * Es ist nützlich, um in der Entwicklungsumgebung **virtuelle Domain-Tests** oder **interne Kommunikation zwischen Anwendungen** einzurichten. * Die angefragte Domain hat die gleiche Wirkung wie `localhost`, ermöglicht jedoch die unabhängige Behandlung jeder einzelnen Domain. ### 4. Wie arbeiten `Nginx` und `Gunicorn` mit der Datei `/etc/hosts` zusammen? {#sec-c7c9d9ca11d7} **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 Datei `/etc/hosts` `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 domänenbasiert zu trennen. Beispiel: ```nignx 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 die Datei `/etc/hosts` in Entwicklungsumgebungen nützlich? {#sec-3c88c7bd715a} **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. die Umleitung von `https://test.local` auf eine lokale Anwendung. * **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 der Datei `/etc/hosts` bei dynamischen IP- und DNS-Cache-Problemen {#sec-c2385ac44c40} **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-Adresse bis zum Ablauf der **TTL (Time to Live)** weiterhin nutzt. Dies kann dazu führen, dass in der Kommunikation zwischen Anwendungen weiterhin TCP-Anfragen an die früheren IP-Adressen gesendet werden, es sei denn, der Cache wird manuell mit dem Befehl `sudo resolvectl flush-caches` gelöscht. Um dieses Problem zu lösen, kann man mit der Datei `/etc/hosts` die DNS-Nutzung umgehen und eine bestimmte Domain immer auf eine feste IP-Adresse 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 mich sehr beeindruckte. ### Fazit {#sec-059b7c0e6cbe} Durch diesen gesamten Prozess wurde mir bewusst, dass die unbewusste Nutzung von `localhost` und der Datei `/etc/hosts` eng mit den grundlegenden Netzwerkmechanismen unter Linux verbunden ist. Ich bewunderte, 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 ist, die Essenz der Technologie zu verstehen. 😊 ![Illustration der Nutzung der /etc/hosts Datei](/media/whitedec/blog_img/computer_screen_hosts_file.webp)