Configure Virtual Hosts no Apache 2.4 para hospedar vários sites no mesmo servidor Ubuntu 24.04 ou Debian 12, com pastas, permissões, HTTPS e testes.
Virtual Host é o recurso do Apache que permite responder por vários domínios no mesmo servidor e no mesmo IP. O navegador envia o nome do site em cada pedido, e o Apache escolhe a configuração cujo ServerName bate com esse nome. Cada site ganha sua pasta, seus logs e suas regras.
Antes de começar
- Apache instalado e rodando. Se ainda não tem:
sudo apt install -y apache2. - Acesso SSH com um usuário que tenha
sudo. - Domínio apontado para o IP do servidor (registro A de
seudominio.com.bre dewww). Dá para testar antes, como mostrado no passo 4. - Portas 80 e 443 liberadas. Com ufw:
sudo ufw allow 'Apache Full'.
Passo 1: crie a pasta do site
sudo mkdir -p /var/www/seudominio.com.br/public_html
sudo chown -R $USER:$USER /var/www/seudominio.com.br/public_html
sudo chmod -R 755 /var/www/seudominio.com.br
echo '<h1>seudominio.com.br funcionando</h1>' > /var/www/seudominio.com.br/public_html/index.html
Os arquivos ficam com o seu usuário, e o Apache (usuário www-data) só precisa ler. Se o site tiver pastas de upload, dê escrita ao www-data só nelas, nunca na pasta inteira.
Passo 2: crie o arquivo do Virtual Host
Crie /etc/apache2/sites-available/seudominio.com.br.conf (por exemplo com sudo nano):
<VirtualHost *:80>
ServerName seudominio.com.br
ServerAlias www.seudominio.com.br
ServerAdmin [email protected]
DocumentRoot /var/www/seudominio.com.br/public_html
<Directory /var/www/seudominio.com.br/public_html>
Options -Indexes +FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/seudominio.com.br-error.log
CustomLog ${APACHE_LOG_DIR}/seudominio.com.br-access.log combined
</VirtualHost>
- ServerName e ServerAlias: o domínio principal e os nomes alternativos que caem neste site.
- DocumentRoot: a pasta que o visitante vê.
- Options -Indexes: não lista os arquivos de uma pasta sem página inicial.
- AllowOverride All: permite usar o arquivo htaccess, necessário para WordPress e a maioria dos sistemas PHP. Para regras de reescrita, ative o módulo com
sudo a2enmod rewrite. - ErrorLog e CustomLog: logs separados por site em
/var/log/apache2/.
Passo 3: ative o site e recarregue o Apache
sudo a2ensite seudominio.com.br.conf
sudo apache2ctl configtest
sudo systemctl reload apache2
O configtest deve responder Syntax OK. Nunca recarregue sem esse teste: um erro de digitação derruba todos os sites do servidor. Se quiser desligar a página padrão do Apache, rode também sudo a2dissite 000-default.conf.
Passo 4: teste o Virtual Host
Com o DNS já apontado, abra http://seudominio.com.br no navegador. Para testar antes de mudar o DNS, use uma destas opções:
- Pelo terminal, enviando o nome do site para o IP do servidor:
curl -H 'Host: seudominio.com.br' http://203.0.113.10/ - Pelo arquivo hosts do seu computador, adicionando a linha
203.0.113.10 seudominio.com.br www.seudominio.com.br. No Windows o arquivo éC:\Windows\System32\drivers\etc\hosts(abra o Bloco de Notas como administrador); no Mac e no Linux,/etc/hosts. Apague a linha depois do teste.
Passo 5: ative o HTTPS com Let's Encrypt
sudo apt install -y certbot python3-certbot-apache
sudo certbot --apache -d seudominio.com.br -d www.seudominio.com.br
O Certbot emite o certificado gratuito, cria o Virtual Host da porta 443 (arquivo seudominio.com.br-le-ssl.conf) e oferece redirecionar todo acesso para HTTPS. A renovação é automática; para conferir, rode sudo certbot renew --dry-run.
Como adicionar mais sites
Repita os passos 1 a 5 para cada domínio, com uma pasta e um arquivo .conf próprios. Para ver todos os Virtual Hosts ativos e de qual arquivo cada um vem:
sudo apache2ctl -S
ServerName combina com o nome pedido, o Apache responde com o primeiro Virtual Host carregado, em ordem alfabética. É por isso que o 000-default.conf tem esse nome.No AlmaLinux e no Rocky Linux
A lógica é a mesma, com estas diferenças: o pacote e o serviço se chamam httpd; o arquivo vai direto em /etc/httpd/conf.d/seudominio.com.br.conf (não há a2ensite); os logs ficam em /var/log/httpd/; o usuário do Apache é apache; o teste é sudo apachectl configtest e a recarga, sudo systemctl reload httpd. Com o SELinux ativo, mantenha os sites dentro de /var/www para evitar erro de permissão.
Problemas comuns
Aparece a página padrão do Apache em vez do meu site
O site não foi ativado, o ServerName está diferente do domínio digitado ou o DNS ainda aponta para outro lugar. Confira com sudo apache2ctl -S e com dig +short seudominio.com.br.
403 Forbidden: You don't have permission to access this resource
O Apache não consegue ler a pasta. Verifique se todas as pastas do caminho têm permissão de execução para outros usuários (755), se o bloco Directory tem Require all granted e se existe um index.html ou index.php.
Invalid command 'RewriteEngine'
O arquivo htaccess usa reescrita, mas o módulo está desligado. Rode sudo a2enmod rewrite e sudo systemctl restart apache2.
AH00558: Could not reliably determine the server's fully qualified domain name
É só um aviso: o Apache não tem um nome global definido. Para sumir com ele, crie /etc/apache2/conf-available/servername.conf com a linha ServerName localhost e ative com sudo a2enconf servername.
O Certbot falha com Timeout during connect
O Let's Encrypt não alcançou o servidor na porta 80. Confira o firewall, o DNS (o domínio precisa apontar para este servidor) e se o site responde por HTTP antes de pedir o certificado.