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.localSe 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.
- Ouça o áudio com a tela desligada
- Ganhe Certificado após a conclusão
- + de 5000 cursos para você explorar!
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/nullSe 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
ServerNameem cada vhost. Sem isso, o Apache pode não casar corretamente oHoste cair no default vhost. - Use
ServerAliaspara 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.confRecarregue o Apache para aplicar:
sudo apache2ctl configtest sudo systemctl reload apache24) 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.localSe 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 -SVocê 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/hostse teste comcurl -H 'Host: ...'. - Faltou
ServerNameno vhost: garanta que cada arquivo tenhaServerNameúnico e correto. - Faltou
ServerAliaspara variações: se você acessawww.site2.local, mas só existeServerName site2.local, adicioneServerAlias 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 emsites-available. - Rode
sudo apache2ctl -Se 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.local4) 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.confe002-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 apache25) “Meu vhost não carrega” (alterei o arquivo, mas nada muda)
Causas comuns:
- Você editou o arquivo em
sites-available, mas o link emsites-enabledaponta 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