macOS: lange Ladezeiten bei localhost-Domains (DNS Problem)

By

in

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.



Comments

3 responses to “macOS: lange Ladezeiten bei localhost-Domains (DNS Problem)”

  1. Das Problem hätte sich auf einfacher lösen lassen:

    127.0.0.1 localhost, http://www.example.com.local, api.example.com.local, blog.example.com.local

    Und – schwupps – dauert das Auflösen des Hostnamens keine Ewigkeiten mehr …

  2. @Stephen Und wo sollen diese Zeilen eingetragen werden? In /etc/hosts sind diese Einträge ja bereits vorhanden…

  3. Thomas R Avatar

    DNSMasq ist nicht nötigt. Wie im verlinkten Artikel beschrieben (http://www.justincarmony.com/blog/2011/07/27/mac-os-x-lion-etc-hosts-bugs-and-dns-resolution/), liegt das Problem an der TLD “.local”. Wähle ein andere TLD und das Problem hat sich erledigt.

Leave a Reply

Your email address will not be published. Required fields are marked *