Este tutorial mostra como proceder para criar VirtualHosts no Apache, um recurso muito útil e largamente utilizado pelos provedores de hospedagem de sites.
Configurando VirtualHosts no Apache
O recurso de VirtualHosts do Apache é uma importante característica deste software. Ele permite que um mesmo servidor hospede diferentes web sites, cada um com sua própria URL. O visitante de seus sites não percebem isso. Por exemplo, você pode hospedar o http://www.sounerd.com.br e o http://mambo-services.com no mesmo servidor Apache. Isso é utilizado por provedores de serviços de hospedagem de sites web, pois ficaria inviável colocar cada site de cliente em uma máquina separada. Para o desenvolvedor ou mantenedor de web sites também é interessante saber como utilizar este recurso, visto que normalmente estes profissionais precisam manter cópias destes sites em sua estação de trabalho.
Existem dois tipos de VirtualHosts: baseados em IP e baseados em nome, no jargão comum, IP-based e Name-based. O mais comum é o tipo Name-based, pois ele permite compartilhar o mesmo IP e porta entre os diversos VirtualHosts. Isso nos dá uma flexibilidade muito grande, dado a escassez de endereços IPv4 atual, além do fato de não exigir máquinas diferentes, ou diversas placas de rede em um mesmo servidor. O tipo IP-based é utilizado quando é necessário que cada VirtualHost tenha um IP dedicado, como o uso de SSL. Alguns sistemas operacionais permitem que sejam atribuídos vários IPs para uma mesma placa de rede, o que alivia o custo de hardware e manutenção.
O modo Name-based em VirtualHosts é viável devido ao protocolo HTTP versão 1.1 incluir o hostname nos cabeçalhos da requisição. Desta forma, o Apache sabe para quem direcionar a solicitação do browser do usuário. Antigos browsers que usem HTTP/1.0 terão problemas, mas ainda assim normalmente existe uma extensão que pode ser instalada para que eles incluam o hostname no header.
O módulo mod_vhost_alias do Apache deve ser carregado para habilitar esta função, entretanto este módulo tem vindo configurado como padrão na grande maioria de pacotes pré-compilados.
Configuração
A configuração de VirtualHosts é simples, exigindo apenas a alteração do arquivo “httpd.conf”. Você deve encontrar este arquivo na sua instalação e abrí-lo com um editor de texto comum, como o “vi”. No Linux normalmente ele pode ser encontrado no diretório “/etc/apache/”.
Procure por uma seção chamada “Section 3: Virtual Hosts”. Nela você encontra alguns comentários explicativos e uma configuração de exemplo, também na forma de comentários. Cada seção definindo um “VirtualHost” começa com uma tag “<VirtualHost …>” e termina com uma tag “</VirtualHost>”. Sugiro copiar o bloco das linhas que compôem o exemplo, e não escrever por cima dele. Desta forma você mantêm o exemplo original caso precise de um referência novamente.
Configuração Name-based
Para uma configuração baseada em nome você deve retirar o comentário da diretiva “NameVirtualHost”, no arquivo httpd.conf. Mantenha o *:80 se você quiser que o serviço escute em todas as interfaces do seu sistema. Se você vai acessar seus serviços web apenas a partir da própria máquina, é mais seguro colocar em “listening” somente o IP do loopback, ou seja, 127.0.0.1:80. Esta linha, por exemplo, pode ser assim:
#
# Use name-based virtual hosting.
#
NameVirtualHost 127.0.0.1:80
Encontre também a diretiva “Listen”, da Seção 1, e coloque-a assim:
#Listen 80
Listen 127.0.0.1:80
Deste modo, evitamos que o Apache faça o bind para todas as interfaces da máquina. Ele faria isso mesmo com a diretiva “NameVirtualHost” configurada apenas para o loopback.
É importante observar que as configurações do seu servidor principal (main server) serão herdadas por todos os seus VirtualHosts, a não ser que sejam redefinidas nas suas respectivas seções. Por exemplo, a diretiva “DocumentRoot” redefine a localização de seus arquivos para o VirtualHost.
No caso mais simples você redefine apenas as diretivas “DocumentRoot” e “ServerName”. Veja a configuração abaixo:
<VirtualHost sounerd.local:80>
DocumentRoot "/home/hlbog/www"
ServerName sounerd.local
</VirtualHost>
<VirtualHost mambo-services.local:80>
DocumentRoot "/home/hlbog/mambosupport"
ServerName mambo-services.local
</VirtualHost>
Nela estamos criando dois VirtualHosts: o nome “sounerd.local” responderá na porta 80 e seus arquivos estão localizados no diretório “/home/hlbog/www”; “mambo-services.local” também responderá na porta 80, e seus arquivos estão localizados em “/home/hlbog/mambosupport”.
Simples assim. Agora basta você reconfigurar seu DNS ou arquivos de hosts local, “/etc/hosts”. Seguindo a suposição de que esses serviços serão utilizados apenas localmente, através do IP de loopback, alteramos nosso arquivo “/etc/hosts” para que possamos resolver os dois nomes utilizados:
127.0.0.1 localhost.local localhost sounerd.local sounerd mambo-services.local mambo-services
Lembre-se: caso você deseje acessar esses serviços a partir de outra máquina, você não pode usar o loopback. Você deve atribuir os nomes ao IP real da sua placa de rede no arquivo “httpd.conf”, fazer a alteração no “/etc/hosts” ou no seu servidor local de DNS da sua rede, e configurar a firewall do servidor que hospeda o Apache para aceitar conexões na porta 80.
Podemos testar a configuração através da opção “-S” do comando apachectl:
root@localhost:~# /usr/sbin/apachectl -S
VirtualHost configuration:
127.0.0.1:80 is a NameVirtualHost
default server sounerd.local (/etc/apache/httpd.conf:1085)
port 80 namevhost sounerd.local (/etc/apache/httpd.conf:1085)
port 80 namevhost mambo-services.local (/etc/apache/httpd.conf:1092)
Syntax OK
Veja que o primeiro VirtualHost sempre é considerado o “main server”.
Agora é só iniciar o Apache:
root@localhost:~# /etc/rc.d/apache start
Este comando pode variar de acordo com a sua distribuiçao Linux. No Windows procure o serviço correspondente no applet “Services”.
Configuração IP-based
A configuração baseada em IP é bem semelhante. Primeiro você não deve habilitar a diretiva “NameVirtualHost”, deixando-a comentada:
#NameVirtualHost *:80
Vamos colocar o servidor de “mambo-services.local” para “ouvir” no IP de nossa placa de rede (no nosso exemplo 192.168.1.100), e o servidor “sounerd.local” para ouvir no IP de loopback.
Encontre na Seçao 1 a diretiva “Listen”. Ela deve estar configurada como “Listen 80″. Altere da forma abaixo, de modo que o Apache não faça o bind para todas as interfaces.
#Listen 80
Listen 127.0.0.1:80
Listen 192.168.1.100:80
Não precisamos mudar mais nada no arquivo “httpd.conf”, além das diretivas “NameVirtualHost” e “Listen”. Basta que reorganizemos nossa resolução de nomes, no arquivo “/etc/hosts” ou no servidor DNS:
127.0.0.1 localhost.local localhost malcovich.local malcovich sounerd.local sounerd
192.168.1.100 mambo-services.local mambo-services
Novamente teste com a opção “-S”:
root@localhost:~# /usr/sbin/apachectl -S
VirtualHost configuration:
192.168.1.100:80 mambo-services.local (/etc/apache/httpd.conf:1092)
127.0.0.1:80 sounerd.local (/etc/apache/httpd.conf:1085)
Syntax OK
Inicie o Apache:
root@localhost:~# /etc/rc.d/apache start
Vamos confirmar que o Apache está fazendo o bind corretamente. O comando abaixo mostra todos os sockets que estão em LISTENING na sua máquina:
root@localhost:~# netstat -tln
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 127.0.0.1:80 0.0.0.0:* LISTEN
tcp 0 0 192.168.1.100:80 0.0.0.0:* LISTEN
Você também poderia usar os IPs no arquivo “httpd.conf”:
<VirtualHost 127.0.0.1:80>
DocumentRoot "/home/hlbog/www"
ServerName sounerd.local
</VirtualHost>
<VirtualHost 192.168.1.100:80>
DocumentRoot "/home/hlbog/mambosupport"
ServerName mambo-services.local
</VirtualHost>
Veja a saída do “apachectl -S”:
root@localhost:~# /usr/sbin/apachectl -S
Outras configurações podem ser complementadas nos VirtualHosts, como a “AddType”.
VirtualHost configuration:
192.168.1.100:80 mambo-services.local (/etc/apache/httpd.conf:1092)
127.0.0.1:80 sounerd.local (/etc/apache/httpd.conf:1085)
Syntax OK
É isso, bom trabalho e um abraço.
— hlbog