Simplifiez la gestion de vos hosts sous OSX

Gérer les hosts sur sa machine de développement peut vite devenir un casse tête énorme. De plus il n’est pas rare de devoir jongler avec de nombreux serveurs pour des projets web, du coup la gestion des hosts peut vous faire perdre beaucoup de temps. Heureusement avec dnsmasq, voici un moyen vraiment très simple de gérer les hosts de développement.

Je ne sais pas comment vous travaillez, mais personnellement j’aime bien avoir sur ma machine uniquement des sites dans le domaine .dev ainsi je suis vraiment sur que je visualise uniquement mon travail local. Mais la mise en place de ces domaines est assez long à faire, il faut éditer la configuration Apache pour ajouter un nouveau vhost, il faut éditer le fichier /etc/hosts pour ajouter le domaine voulu en IPv4 et IPv6 (pour éviter les problèmes de DNS). Avec dnsmasq vous pouvez oublier l’étape d’édition du fichier host.

dnsmasq

dnsmasq est un petit utilitaire qui va faire tourner un daemon en arrière plan et qui va nous permettre de faire tourner un «mini-serveur» DNS sur notre machine. Ce petit serveur va «attraper» toutes les requêtes pour le domaine de son choix et le rediriger vers notre machine locale.

Tous d’abord, l’installation. Si vous avez brew installé sur votre machine, c’est super simple. Si vous n’avez pas brew installé, je vous conseille de le faire, cela vous fera gagner du temps.
Voici les trois commandes qui installeront dnsmasq et qui préparerons le lancement automatique du daemon au démarrage de votre machine :

$> brew install dnsmasq
$> cp /usr/local/Cellar/dnsmasq/2.63/dnsmasq.conf.example /usr/local/etc/dnsmasq.conf
$> sudo cp /usr/local/Cellar/dnsmasq/2.63/homebrew.mxcl.dnsmasq.plist /Library/LaunchDaemons

Configuration

Passons maintenant à la configuration, il faut configurer dnsmasq pour répondre au domaine .dev et il faut ajouter dnsmasq à la liste des resolver DNS de votre machine.

Tout d’abord, configurons dnsmasq sur le domaine .dev, on ajoute une ligne dans le fichier de configuration :

echo 'address=/dev/127.0.0.1' > /usr/local/etc/dnsmasq.conf

Ensuite, on ajoute le mini-serveur DNS dans la liste des resolver de la machine avec les commandes suivantes :

$> sudo mkdir /etc/resolver
$> sudo bash -c 'echo "nameserver 127.0.0.1" > /etc/resolver/dev'

Il ne reste plus qu’à démarrer le service et vider le cache de DNS de votre machine pour vérifier que tout marche correctement :

$> sudo launchctl load -w /Library/LaunchDaemons/homebrew.mxcl.dnsmasq.plist 

Tests

Je ne sais pas si faire un flush est nécessaire, mais ça ne mange pas de pain, donc je vous conseille de le faire et de vérifier que vous avez bien un resolver pour le domaine de votre choix avec les commandes suivantes :

$> dscacheutil -flushcache
$> scutil --dns
[...]
resolver #9
   domain   : dev
   nameserver[0] : 127.0.0.1
[...]

Enfin, le dernier test et le plus important, faire un ping sur un domaine inconnu mais qui se termine par .dev pour vérifier que dnsmasq fonctionne correctement :

$> ping -c 1 mondomainequinexistepas.dev
PING mondomainequinexistepas.dev (127.0.0.1): 56 data bytes
64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.029 ms
--- mondomainequinexistepas.dev ping statistics ---
1 packets transmitted, 1 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 0.029/0.029/0.029/0.000 ms

Si le résultat est satisfaisant, vous pouvez nettoyer (commenter, on est jamais trop prudent) votre fichier hosts…

Conclusion

Voilà, maintenant pour créer un nouveau vhost, il suffit «juste» d’éditer la configuration d’Apache, plus besoin d’ajouter des noms de domaines dans votre fichier hosts.

Cette technique est tellement bien qu’elle peut être facilement étendue. Par exemple, je veux créer un sous-domaine .vm qui redirige vers une machine virtuelle gérée avec Vagrant, c’est possible et très simple à mettre en place.

Note importante :

Enfin, si cette technique vous intéresse mais que vous ne voulez pas utiliser le domaine .dev, je vous conseille tout de suite de ne pas essayer d’utiliser le domaine .local, car c’est un domaine «réeservé» par OSX pour le protocole ZeroConf qui permet aux Macs d’un même réseau de communiquer facilement. En revanche, si vous êtes sous Linux et que vous vous tenez éloigné des Macs alors pas de soucis vous pouvez utiliser le domaine .local.