Virtual Hosts no Apache: hospedando múltiplos sites no mesmo servidor

Capítulo 7

Tempo estimado de leitura: 8 minutos

+ Exercício

O que é VirtualHost por nome (name-based)

Um VirtualHost permite que um único Apache responda por múltiplos sites. No modelo name-based, vários domínios compartilham o mesmo IP e porta (por exemplo, *:80), e o Apache decide qual site entregar com base no nome do host enviado pelo cliente no cabeçalho HTTP Host.

Na prática, isso significa que site1.exemplo e site2.exemplo podem apontar para o mesmo servidor/IP, e ainda assim cada um terá seu próprio DocumentRoot, logs e regras.

Relação com DNS e /etc/hosts

Para um VirtualHost por nome funcionar, o cliente precisa resolver o domínio para o IP do servidor (via DNS público/privado) e, ao fazer a requisição, enviar o cabeçalho Host com o domínio acessado. Em laboratório local, você pode simular isso editando o arquivo /etc/hosts na máquina cliente (ou no próprio servidor, se estiver testando localmente).

# Exemplo (no cliente): apontar dois nomes para o mesmo IP do servidor Apache 192.0.2.10 site1.local site2.local

Se você não controla DNS e não quer mexer no /etc/hosts, ainda dá para testar usando curl com o cabeçalho Host (veremos adiante).

Como o Apache escolhe qual VirtualHost responde (default vhost)

Quando chegam requisições em um IP/porta (ex.: 192.0.2.10:80), o Apache tenta casar o valor do cabeçalho Host com ServerName e ServerAlias dos VirtualHosts definidos para aquele IP/porta.

Continue em nosso aplicativo e ...
  • Ouça o áudio com a tela desligada
  • Ganhe Certificado após a conclusão
  • + de 5000 cursos para você explorar!
ou continue lendo abaixo...
Download App

Baixar o aplicativo

  • Se houver correspondência: responde o VirtualHost correspondente.
  • Se não houver correspondência (ou se o cliente não enviar Host): o Apache responde o default vhost daquele IP/porta.

O default vhost é, em geral, o primeiro VirtualHost carregado para aquele endereço/porta. Em distribuições que usam sites-available/sites-enabled, isso costuma depender da ordem alfabética dos links em sites-enabled (por exemplo, 000-default.conf tende a ser o primeiro).

Laboratório: dois sites no mesmo servidor (name-based)

Objetivo: hospedar site1.local e site2.local no mesmo Apache, ambos em :80, com DocumentRoot separados, arquivos de site separados em sites-available e habilitação em sites-enabled.

1) Criar os DocumentRoots e páginas de teste

Crie duas pastas e um index.html simples em cada uma para identificar claramente qual site respondeu.

sudo mkdir -p /var/www/site1/public sudo mkdir -p /var/www/site2/public  echo '<h1>SITE 1</h1>' | sudo tee /var/www/site1/public/index.html > /dev/null echo '<h1>SITE 2</h1>' | sudo tee /var/www/site2/public/index.html > /dev/null

Se você estiver em um ambiente com políticas de permissão mais restritivas, garanta que o usuário do Apache consiga ler os arquivos e atravessar os diretórios (leitura/execução). Evite permissões excessivas; o importante é leitura do conteúdo e acesso aos diretórios.

2) Criar os arquivos de VirtualHost em sites-available

Crie dois arquivos: um para cada site. O nome do arquivo influencia a ordem de carregamento quando habilitado (isso importa para o default vhost).

Arquivo 1: /etc/apache2/sites-available/site1.conf

<VirtualHost *:80>     ServerName site1.local     ServerAlias www.site1.local      DocumentRoot /var/www/site1/public      ErrorLog ${APACHE_LOG_DIR}/site1_error.log     CustomLog ${APACHE_LOG_DIR}/site1_access.log combined      <Directory /var/www/site1/public>         Require all granted     </Directory> </VirtualHost>

Arquivo 2: /etc/apache2/sites-available/site2.conf

<VirtualHost *:80>     ServerName site2.local     ServerAlias www.site2.local      DocumentRoot /var/www/site2/public      ErrorLog ${APACHE_LOG_DIR}/site2_error.log     CustomLog ${APACHE_LOG_DIR}/site2_access.log combined      <Directory /var/www/site2/public>         Require all granted     </Directory> </VirtualHost>

Observações importantes para evitar comportamento inesperado:

  • Defina sempre ServerName em cada vhost. Sem isso, o Apache pode não casar corretamente o Host e cair no default vhost.
  • Use ServerAlias para variações comuns (ex.: www), evitando que elas caiam no vhost padrão.
  • Separe logs por site para facilitar diagnóstico quando um domínio estiver respondendo errado.

3) Habilitar os sites e (se necessário) desabilitar o padrão

Em sistemas Debian/Ubuntu, habilite com a2ensite. Se existir um site padrão habilitado (000-default.conf), ele pode virar o default vhost e “capturar” requisições sem match; você pode desabilitá-lo para deixar apenas seus dois sites.

sudo a2ensite site1.conf sudo a2ensite site2.conf  # Opcional (recomendado no laboratório, para reduzir confusão): sudo a2dissite 000-default.conf

Recarregue o Apache para aplicar:

sudo apache2ctl configtest sudo systemctl reload apache2

4) Ajustar DNS/hosts para o laboratório

Se você estiver testando a partir de uma máquina cliente, adicione no /etc/hosts do cliente (ou configure DNS interno) apontando ambos os nomes para o IP do servidor Apache.

# No cliente (exemplo): 192.0.2.10 site1.local site2.local

Se estiver testando no próprio servidor, você pode apontar para 127.0.0.1 ou para o IP local do servidor, dependendo do cenário.

Validação: testando com curl (incluindo Host header)

Teste 1: usando o nome (depende de DNS/hosts)

curl -i http://site1.local/ curl -i http://site2.local/

Você deve ver o conteúdo SITE 1 e SITE 2 respectivamente.

Teste 2: forçando o Host header (não depende de DNS/hosts)

Esse teste é excelente para diagnosticar VirtualHosts, pois você controla explicitamente o cabeçalho Host. Substitua 192.0.2.10 pelo IP do seu servidor Apache (ou 127.0.0.1 se for local).

curl -i -H 'Host: site1.local' http://192.0.2.10/ curl -i -H 'Host: site2.local' http://192.0.2.10/

Se o Apache estiver casando corretamente, cada comando retornará a página do site correspondente.

Teste 3: descobrir quem é o default vhost

Envie um Host que não existe em nenhum vhost. O Apache responderá com o default vhost daquele IP/porta.

curl -i -H 'Host: inexistente.local' http://192.0.2.10/

O conteúdo retornado indica qual vhost está como padrão (primeiro carregado).

Inspeção: verificando quais vhosts estão ativos e a ordem

Use o comando abaixo para listar os VirtualHosts carregados e identificar o default para cada endereço/porta:

sudo apache2ctl -S

Você verá uma saída semelhante a:

VirtualHost configuration: *:80 is a NameVirtualHost default server site1.local (/etc/apache2/sites-enabled/site1.conf:1) port 80 namevhost site1.local (/etc/apache2/sites-enabled/site1.conf:1) port 80 namevhost site2.local (/etc/apache2/sites-enabled/site2.conf:1)

O trecho default server mostra qual vhost está como padrão. Se isso não for o que você espera, ajuste a ordem de carregamento (ver seção de problemas comuns).

Problemas comuns e correções rápidas

1) “O domínio abre o site errado” (cai no vhost padrão)

Sintoma: site2.local mostra a página do site1 (ou do 000-default).

Causas frequentes e correções:

  • O cliente não está enviando o Host correto: verifique DNS//etc/hosts e teste com curl -H 'Host: ...'.
  • Faltou ServerName no vhost: garanta que cada arquivo tenha ServerName único e correto.
  • Faltou ServerAlias para variações: se você acessa www.site2.local, mas só existe ServerName site2.local, adicione ServerAlias www.site2.local.
  • Você está batendo em outro IP/porta: confirme que o acesso está indo para o IP do Apache e para a porta correta.

2) “Sempre responde o mesmo site” mesmo com Host header

Sintoma: mesmo usando curl -H 'Host: site2.local', o retorno é do outro site.

Checklist:

  • Confirme que ambos os vhosts estão habilitados: verifique se existem links em /etc/apache2/sites-enabled/ apontando para os arquivos em sites-available.
  • Rode sudo apache2ctl -S e confirme que os dois vhosts aparecem em *:80.
  • Garanta que os dois vhosts estão em <VirtualHost *:80> (mesma porta) e que você está testando exatamente essa porta.

3) Avisos/erros relacionados a ServerName “global”

Sintoma: ao recarregar, aparece aviso do tipo “Could not reliably determine the server's fully qualified domain name”.

Correção: defina um ServerName global no arquivo principal de configuração (não dentro de um vhost) com um nome válido para o servidor. Isso não substitui os ServerName dos vhosts, mas evita ambiguidades e avisos.

# Exemplo (local apropriado da config global): ServerName servidor.local

4) Ordem de carregamento e default vhost inesperado

Sintoma: o default vhost não é o que você imaginava, e requisições sem match caem no “site errado”.

Como corrigir:

  • Controle a ordem em sites-enabled: renomeie os arquivos para usar prefixos numéricos, por exemplo 001-site1.conf e 002-site2.conf, e re-habilite se necessário.
  • Desabilite o padrão (000-default.conf) durante o laboratório para reduzir interferência.

Exemplo de ajuste de nomes (uma abordagem comum):

sudo a2dissite site1.conf site2.conf  sudo mv /etc/apache2/sites-available/site1.conf /etc/apache2/sites-available/001-site1.conf sudo mv /etc/apache2/sites-available/site2.conf /etc/apache2/sites-available/002-site2.conf  sudo a2ensite 001-site1.conf 002-site2.conf sudo apache2ctl configtest sudo systemctl reload apache2

5) “Meu vhost não carrega” (alterei o arquivo, mas nada muda)

Causas comuns:

  • Você editou o arquivo em sites-available, mas o link em sites-enabled aponta para outro nome/arquivo.
  • Você esqueceu de recarregar/reiniciar o Apache após mudanças.
  • Há erro de sintaxe: valide com apache2ctl configtest.

Comandos úteis:

sudo apache2ctl configtest sudo apache2ctl -S sudo systemctl reload apache2

Agora responda o exercício sobre o conteúdo:

Em um cenário de VirtualHosts por nome (name-based) no Apache, o que acontece quando chega uma requisição em *:80 cujo cabeçalho Host não corresponde a nenhum ServerName/ServerAlias configurado?

Você acertou! Parabéns, agora siga para a próxima página

Você errou! Tente novamente.

Se o valor de Host não casar com ServerName/ServerAlias (ou o cliente não enviar Host), o Apache atende usando o default vhost do IP/porta, geralmente o primeiro carregado.

Próximo capitúlo

Logs do Apache: access.log e error.log, formatos e interpretação prática

Arrow Right Icon
Capa do Ebook gratuito Apache para Iniciantes: Configuração Essencial, Virtual Hosts e Segurança Básica
44%

Apache para Iniciantes: Configuração Essencial, Virtual Hosts e Segurança Básica

Novo curso

16 páginas

Baixe o app para ganhar Certificação grátis e ouvir os cursos em background, mesmo com a tela desligada.