Alle ontwikkelaars accepteren onbewust het idee dat localhost == 127.0.0.1 is, net zoals ze 1+1=2 begrijpen. Maar net als wiskundigen die proberen te bewijzen waarom 1+1=2, werd ik vandaag nieuwsgierig naar de reden hierachter. Dus ik besloot deze werking te onderzoeken en uiteindelijk begreep ik de communicatiemechanismen van Linux beter. Het gaf me een gevoel van de logische precisie van ontwikkelaars, en ik kon mijn bewondering tijdens dit proces niet onderdrukken. Hieronder heb ik de dingen die ik in dit proces heb geleerd samengevat.

1. Hoe verbindt localhost met 127.0.0.1?

Vraag: Waarom wordt localhost verbonden met 127.0.0.1?

Antwoord: Een Linux-systeem omzet de netwerkverzoeken bij het genereren van een domeinnaam naar een IP-adres. In dit proces controleert het eerst het /etc/hosts bestand. Standaard bevat het /etc/hosts-bestand de volgende instelling:

127.0.0.1    localhost

Hier verwijst 127.0.0.1 naar de loopback-interface, dat jezelf vertegenwoordigt. Daarom, wanneer je http://localhost vanuit je browser of terminal oproept, verbindt Linux deze aanvraag direct met 127.0.0.1 via het /etc/hosts-bestand, zonder DNS te gebruiken. Uiteindelijk functioneert de naam localhost als een alias voor jezelf in Linux.

2. Wat is het /etc/hosts bestand en welke rol speelt het?

Vraag: Hoe werkt het /etc/hosts bestand precies?

Antwoord: Het /etc/hosts bestand is een van de basismechanismen in het hostnaamresolutieproces van Linux. Wanneer een netwerkverzoek zich voordoet, volgt Linux de volgende volgorde om een domeinnaam naar een IP-adres om te zetten:

  1. Controle van het /etc/hosts bestand: De getaddrinfo() functie van de glibc-bibliotheek in Linux is het startpunt voor alle netwerkverzoeken. Deze functie controleert het /etc/hosts-bestand eerst bij het omzetten van de domeinnaam naar een IP-adres. Als de domein in /etc/hosts is gedefinieerd, gebruikt Linux deze informatie om direct het IP-adres terug te geven, zonder naar de DNS-server te gaan.
  2. Verzoek aan de DNS-server: Als de domein niet gedefinieerd is in het /etc/hosts bestand, zoekt het IP-adres via de ingestelde DNS-server.

Het /etc/hosts bestand wordt toegepast op alle netwerkverzoeken en werkt hetzelfde in bibliotheken zoals browsers, curl, ping, en de requests module in Python.

3. Wat kan er gedaan worden met /etc/hosts?

Vraag: Wat gebeurt er als ik een domein toevoeg aan het /etc/hosts bestand?

Antwoord: Door een gewenste domeinnaam en IP-adres toe te voegen aan het /etc/hosts bestand, wordt dat domein verbonden met het ingestelde IP zonder naar de DNS te gaan. Bijvoorbeeld:

127.0.0.1    localhost
127.0.0.1    app1.local
127.0.0.1    app2.local

Met deze instelling:

  • Wanneer verzoeken voor app1.local en app2.local binnenkomen, routeert Linux deze naar 127.0.0.1.
  • Dit is nuttig voor het testen van virtuele domeinen of interne communicatie tussen applicaties in een ontwikkelomgeving.
  • Het opgevraagde domein functioneert met hetzelfde effect als localhost, maar kan elk domein onafhankelijk verwerken.

4. Hoe werken Nginx en Gunicorn samen met /etc/hosts?

Vraag: Kunnen servers zoals Nginx en Gunicorn gekoppeld worden aan het /etc/hosts bestand?

Antwoord: Webservers zoals Nginx functioneren boven de netwerklagen van Linux, dus ze volgen de domeinen die in /etc/hosts zijn ingesteld. Bijvoorbeeld:

  • Als de instelling 127.0.0.1 app1.local in /etc/hosts staat, dan routeert Nginx deze domeinverzoeken naar de applicatie gemapped op 127.0.0.1.
  • In Nginx kan een virtual host worden ingesteld om verzoeken per domein te scheiden. Voorbeeld:
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
    }
}

Deze instellingen stellen ons in staat om twee applicaties onafhankelijk op dezelfde server te draaien.

5. Hoe is /etc/hosts nuttig in een ontwikkelomgeving?

Vraag: In welke situaties is het /etc/hosts bestand werkelijk nuttig?

Antwoord: Het /etc/hosts bestand is vooral nuttig in een ontwikkelings- en testomgeving in de volgende situaties:

  • Testen van lokale domeinen: Je kunt specifieke domeinen testen in een lokale omgeving. Bijvoorbeeld: https://test.local mappen naar lokale applicaties.
  • DNS-omzeiling: Tijdelijk verbinding maken met een ander IP zonder de echte DNS-serverinstellingen. Bijvoorbeeld: example.com koppelen aan een ander servers IP.
  • Interne communicatie tussen applicaties: Door /etc/hosts te gebruiken in de communicatie tussen verschillende applicaties die op dezelfde server draaien, verminderen we DNS-verzoeken en optimaliseren we de communicatiesnelheid.

6. De waarde van /etc/hosts bij dynamische IP en DNS-cacheproblemen

Persoonlijke ervaring: Ontwikkelaars die dynamische IP gebruiken, lossen vaak IP-wijzigingsproblemen op via DDNS (Dynamic DNS). Maar hier is er één probleem. Linux-hosts hebben een DNS-cache, waardoor ze het vorige IP blijven gebruiken tot de TTL (Time to Live) verstrijkt. Dit kan leiden tot fouten waarbij verzoeken tussen applicaties naar oud IP verstuurd worden, tenzij je de cache handmatig leegmaakt met sudo resolvectl flush-caches.

Door /etc/hosts te gebruiken kan ik dit probleem omzeilen en specifieke domeinen altijd naar een vast IP-routeren. Hierdoor kon ik communicatieonderbrekingen door IP-wijzigingsproblemen volledig uitsluiten. De eenvoud van deze instelling is echt een indrukwekkend voorbeeld van probleemoplossing.

Conclusie

Door dit alles te leren, realiseerde ik me dat de onbewuste gebruik van localhost en het /etc/hosts bestand eigenlijk nauw verweven is met de fundamentele netwerkmechanismen van Linux. Het benadrukte hoeveel logica en precisie Linux-ontwikkelaars in deze basisstructuren hebben gestoken. Het is verbazingwekkend hoe één eenvoudig bestand zo'n belangrijke rol kan spelen, zowel in ontwikkel- als productiemomstandigheden.

Deze ervaring heeft me opnieuw doen beseffen hoe waardevol het proces van het begrijpen van de essentie van technologie is. 😊

Illustratie van het gebruik van het /etc/hosts bestand