heldercorreia.pt

autodidata, programador e consultor

Dev sem /etc/hosts

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.pt
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.

Comentários