Unter macOS lassen sich lokal virtuelle Hosts einrichten. So können beispielsweise bei Webentwicklungen die Seiten bereits in der lokalen Umgebung programmiert und getestet werden. Solche virtuellen Hostnamen lassen sich in der Datei /etc/hosts
festlegen. Nachfolgend ist ein Auszug dieser Datei dargestellt:
##
# Host Database
##
127.0.0.1 localhost
255.255.255.255 broadcasthost
::1 localhost
fe80::1%lo0 localhost
127.0.0.1 www.example.com.local
127.0.0.1 api.example.com.local
127.0.0.1 blog.example.com.local
Durch diese Einstellungen werden nun die angegebenen example.com.local Domains auf localhost umgeleitet. Läuft lokal ein Webserver, dann wird bei diesen Aufrufen der lokale Server aufgerufen.
An sich eine feine Sache, wenn da nicht ein Problem auftreten würde: der Aufruf einer solchen lokalen Domain (wie in /etc/hosts
definiert) in Firefox oder Chrome führte in meinem Fall zu einer enorm langen Ladezeit. Die Seiten wurde teilweise erst nach 5…6 Sekunden angezeigt.
Wo liegt das Problem?
Nach längerem Suchen nach der Ursache fiel auf, dass der Webserver (Apache) nur einen Bruchteil der Ladezeit (0,2 Sekunden) zum Generieren der Inhalte benötigte. Die lange Ladezeit musste also durch andere Faktoren ausgelöst werden.
Und dem war auch so. Die Ursache liegt an der Reihenfolge der DNS Auflösung im Mac OS X. Das Terminal und andere Unix Tools nutzen die richtige Reihenfolge (zuerst /etc/hosts und danach andere DNS Server). Wodurch ein Ping auf diese Domains im Terminal auch keine Verzögerung anzeigt. Andere Programme machen dies jedoch genau anders herum. Und genau das führt zu einer Verzögerung, bis der Hostname zu localhost aufgelöst wurde.
Die Lösung: DNSMasq
DNSMasq ist ein einfach zu installierender DNS-Server. Man kann ihn verwenden, um eigene (lokale) Hostnamen aufzulösen und damit das oben beschriebene Problem zu umgehen.
Die Installation von DNSMasq erfolgt über MacPorts. Ist MacPorts installiert, dann sollte man ein selfupdate
durchführen, um MacPorts auf dem neuesten Stand zu bringen.
sudo port selfupdate
Und anschließend dnsmasq installieren:
sudo port install dnsmasq
Das Starten von dnsmasq erfolgt über:
sudo port load dnsmasq
Die Konfiguration von dnsmasq erfolgt über die Datei/opt/local/etc/dnsmasq.conf
. Möchte man z.B. alle Domains, welche auf .local
enden zu localhost auflösen, dann muss folgende Zeile in die Konfiguration von DNSMasq geschrieben werden:
address=/.local/127.0.0.1
Die Auflösung von Hostnamen durch dnsmasq sollte nun bereits funktionieren. Nutzt man allerdings noch andere DNS Server in den Einstellungen von Mac OS X, dann sollte localhost (127.0.0.1) zu diesen hinzugefügt werden. Dazu öffnet man Systemeinstellungen > Netzwerk > (eine Netzwerkverbindung) > Weitere Optionen > DNS und fügt 127.0.0.1 zu den DNS Servern (linke Spalte) hinzu. Wichtig ist, dass dieser Server vor allen anderen DNS Servern eingetragen wird, d.h. dass 127.0.0.1 ganz oben steht.
Leave a Reply