VirtualHost em Apache 2 no OS X Mountain Lion
Autor: Paulo Jerônimo | Publicado: 2013-01-23T18:06:00-02:00

Eu utilizo o Dropbox para compartilhar arquivos com meus alunos pela Internet. E, como já citei em posts anteriores, utilizo o DropbProx que desenvolvi como uma forma de ter uma URL melhor identificada com meu domínio (Ex.: http://a.ladoservidor.com/equipe/index.html) ao invés de utilizar uma URL do Dropbox (Ex.: http://dl.dropbox.com/u/5689841/equipe/index.html).
O problema é que, em alguns ambientes de treinamento, o acesso a Internet é complicado, lento, restrito ou, no pior caso, tudo isto ao mesmo tempo. E, em situações onde utilizo distribuições Linux (Ex.: CentOS, Ubuntu) em que preciso baixar/instalar pacotes a partir da Internet, a adição de um repositório de pacotes local para ser acessado através do Apache instalado em meu MacBook é o que me salva.
Sem fazer a configuração de nenhum VirtualHost no Apache, para poder baixar um pacote do meu mirror CentOS via HTTP, o aluno utiliza uma URL como http://pj-macbookpro/~pj/CentOS/ (é simples habilitar o Web Sharing para ter esta URL funcionando rapidamente). Para isto, basta que o nome da minha máquina pj-macbookpro esteja configurado no arquivo /etc/hosts da máquina do aluno. Contudo, esta URL seria mais "bonitinha" se fosse http://centos.pj. Não acha? ;) Então, a solução é a configuração de um VirtualHost.


Para que um aluno possa fazer uma URL como http://centos.pj ser acessível a partir de sua máquina na rede sem que este nome esteja configurado num servidor DNS, alguns passos são necessários:
O aluno precisa editar o arquivo /etc/hosts de sua máquina e informar o IP de minha máquina (pj-macbookpro) seu apelido e virtualhosts (pj e centos.pj). Exemplo:

$ grep 'pj' /etc/hosts
192.168.0.5 pj-macbookpro pj centos.pj curso-jboss.pj

Eu preciso ter virtual hosts configurados no Apache da minha máquina. Esta configuração é apresentada entre as linhas 8 e 20 do arquivo /etc/apache2/users/pj.conf:

$ sed -n '8,20p' /etc/apache2/users/pj.conf | cat -n
     1 NameVirtualHost *
     2 
     3 &lt;VirtualHost *&gt;
     4   ServerName centos.pj-macbookpro
     5   ServerAlias centos.pj
     6   DocumentRoot "/Users/pj/Sites/CentOS"
     7   &lt;Directory "/Users/pj/Sites/CentOS"&gt;
     8     Options Indexes MultiViews FollowSymLinks
     9     AllowOverride all
    10     Order allow,deny
    11     Allow from all
    12   &lt;/Directory&gt;
    13 &lt;/VirtualHost&gt;


O Apache pode ser configurado de várias formas para suportar virtual hosts. Na configuração que faço acima eu quero dizer que os hosts virtuais serão configurados através de nomes (linha 1) ao invés de IPs e que estou adicionando um host virtual cujo nome é indicado na linha 4. Este nome precisa estar configurado no arquivo /etc/hosts da minha máquina mas, o informado para ServerAlias (linha 5) não precisa.
Algumas outras formas de se configurar virtual hosts são encontradas na documentação do Apache e neste ótimo artigo de Rich Bowen. Mas, para o meu caso, esta é suficiente. Outro virtual host que tenho configurado em meu arquivo é este:

$ sed -n '21,$p' /etc/apache2/users/pj.conf | cat -n
     1 
     2 &lt;VirtualHost *&gt;
     3   ServerName curso-jboss.pj-macbookpro
     4   ServerAlias curso-jboss.pj
     5   DocumentRoot "/Users/pj/Sites/curso-jboss"
     6   &lt;Directory "/Users/pj/Sites/curso-jboss"&gt;
     7     Options Indexes MultiViews FollowSymLinks
     8     AllowOverride all
     9     Order allow,deny
    10     Allow from all
    11   &lt;/Directory&gt;
    12 &lt;/VirtualHost&gt;

Toda vez que eu altero alguma configuração no Apache eu sempre me lembro de verificar se a configuração está OK com o comando abaixo:
$ apachectl configtest

Com as configurações do Apache OK e ele sendo executado, as seguintes URLs são acessíveis em minha máquina quando os nomes estiverem configurados corretamente no arquivo /etc/hosts das máquinas dos alunos:
http://centos.pj
htpt://curso-jboss.pj

Para que documentos públicos acessíveis em http://curso-jboss.pj/docs estejam também disponíveis na Internet quando minha máquina for desligada (ou sair da rede), eu costumo fazer com que docs seja simplesmente um link simbólico um diretório público em meu Dropbox. Sendo assim, os alunos ficam duas formas de acessar estes documentos: uma rápida (pela rede local), e outra através da Internet. ;)