Desenvolver sites com name based virtual hosts envolve ter que estar sempre a editar o ficheiro /etc/hosts com linhas do tipo:
127.0.0.1 localhost 127.0.0.1 dev.heldercorreia.com 127.0.0.1 dev.siriux.org
Faz alguns meses que tenho usado uma alternativa automática que me dispensa ter que editar o ficheiro de hosts manualmente.
Vou explicar como uso um .tld .dev local para apontar para a minha máquina de desenvolvimento. Isto significa que qualquer domínio que termina em .dev aponta para 127.0.0.1, e nos virtual hosts basta-me fazer algo do tipo:
server {
listen 80;
server_name ~^heldercorreia\.pt(\.dev)?$;
...
}
Essa configuração (Nginx) serve tanto para desenvolvimento como em produção. Na barra de endereços do browser, para aceder a uma versão ou outra, basta adicionar ou remover o .dev no final do domínio.
De notar que eu não preciso ter uma configuração que sirva os dois ambientes ao mesmo tempo. Se não partilharem a mesma configuração o que interessa é que o server_name que uso em desenvolvimento é simplesmente igual ao domínio em produção, com um .dev no final (pela conveniência).
DNSMasq
Uma vez que não podemos criar registos CNAME nem wildcards no ficheiro de hosts, vamos usar o Dnsmasq. Esta maravilhosa ferramenta permite ter um pequeno servidor DNS a correr localmente e é muito simples de configurar.
Dnsmasq is a lightweight, easy to configure DNS forwarder and DHCP server.
No Mac OS X
Com o homebrew:
$ brew install dnsmasq
A instalação dá as próximas instruções, mas podemos correr o seguinte:
# Copiar o ficheiro de configuração
cp -v $(brew --prefix dnsmasq)/dnsmasq.conf.example /usr/local/etc/dnsmasq.conf
# Copiar a configuração do daemon
cp -v $(brew --prefix dnsmasq)/homebrew.mxcl.dnsmasq.plist /Library/LaunchDaemons/
# Começar o dnsmasq automaticamente
sudo launchctl load /Library/LaunchDaemons/homebrew.mxcl.dnsmasq.plist
Depois de executar esses comandos, temos que editar o ficheiro /usr/local/etc/dnsmasq.conf e adicionar ao final estas duas linhas:
address=/.dev/127.0.0.1 listen-address=127.0.0.1
A primeira linha é para apontar todos os domínios terminados em .dev para 127.0.0.1. A segunda é para aceitar pedidos DNS apenas da máquina local. Senão, qualquer computador na rede pode usar o nosso computador para resolver pedidos DNS.
Para reiniciar o serviço (tenho isto num alias):
$ sudo launchctl stop homebrew.mxcl.dnsmasq && sudo launchctl start homebrew.mxcl.dnsmasq
Finalmente temos que adicionar a máquina local à lista de name servers, criando o ficheiro /etc/resolver/dev com:
nameserver 127.0.0.1
O que vai acontecer é que todos os pedidos DNS vão passar primeiro pelo dnsmasq. Se o domínio terminar em .dev o endereço é logo retornado. Caso contrário, o pedido continua para o próximo servidor DNS da lista (atribuído pelo router).
Provavelmente será necessário agora reiniciar a rede.
No Ubuntu
Instalação:
sudo apt-get install dnsmasq
A configuração é igual, mas em /etc/dnsmasq.conf:
address=/.dev/127.0.0.1 listen-address=127.0.0.1
Adicionar o name server a /etc/dhcp3/dhclient.conf:
prepend domain-name-servers 127.0.0.1;
E reiniciar:
sudo service network-manager restart
sudo service dnsmasq restart
Testar
Testamos facilmente com o dig:
$ dig +short qqcoisa.dev
127.0.0.1
Agora não precisamos voltar a editar o ficheiro /etc/hosts!
Nota
Em vez de usar .dev pode ser escolhido outro .tld, mas cuidado para não escolher um reservado. Um caso típico a evitar é o .local que já está reservado para o mDNS.