Trage resolving tijdens ontwikkeling op OSX

Een tijdje had ik hinder van het feit dat het ontwikkelen op de Mac niet vreselijk snel verliep. Met name de response vanuit Apache was niet vreselijk snel. Het probleem leek te schuilen in de resolving van lokale adressen (bijv. http://project.dev) wat bijzonder veel tijd in beslag nam (gemiddeld 5-10 seconde per request).

Eerste stap: Googlen!

Na verschillende testen en benchmarks leek de oorzaak van het probleem te zitten in de lokale netwerkconfiguratie. Met wat eenvoudige zoektermen als "slow resolving localhost" kwam als snel in beeld dat de Apple spullen in deze de boosdoeners waren.

Ik werk tijdens de ontwikkeling altijd middels een VirtualHost; een manier binnen Apache om een website te configureren met een eigen (lokale) domeinnaam en instellingen. Het grote voordeel hiervan is dat de uitrol naar een live-omgeving makkelijker gaat, zeker met Drupal sites.

Nu is het zo dat het opzoeken van die lokale domeinnamen (resolving genaamd) niet heel snel ging op de Mac. Iedere keer zat er een pauze in van 5 seconde voordat er response kwam. Hiervoor zijn meerdere oorzaken te benoemen:

Bonjour

Er wordt gebruik gemaakt van de .local extensie (project.local i.p.v. project.dev). Dit zorgt ervoor dat ondanks de vermelding in de /etc/hosts er bij de Bonjour service wordt nagegaan bij wie of wat dat .local adres hoort. Bonjour gebruikt de .local extensie om apparaten binnen het netwerk te identificeren. Een van onze MacBooks heeft bijvoorbeeld als adres "MacBookPro.local". Het is sneller om als domeinnaam-extensie ".dev" te nemen.

IPv6

IPv6 is niet je-van-het binnen OSX. De adressen worden niet eerst opgezocht in de host-file maar worden via de DNS opgezocht. De oplossing is om IPv6 uit te zetten voor het geselecteerde netwerk:

# lijst van alle netwerk interfaces
networksetup -listallnetworkservices
# schakel ipv6 uit voor geselecteerde interface,
# in mijn geval voor de Wi-Fi
networksetup -setv6off Wi-Fi

Dit werkt vaak na een herstart van het systeem maar wat nog beter werkt is om IPv6-gebaseerde IP adressen in de hostfile te zetten:
127.0.0.1 localhost
255.255.255.255 broadcasthost
::1 localhost
fe80::1%lo0 localhost

127.0.0.1 project.dev

# dit is de oplossing voor trage resolving
fe80::1%lo0 project.dev

Nu is er een merkbaar verschil; geen wachttijd meer :)

back_blog