
25 de outubro de 2020 - Frederico Marinho
Como configurar Apache Virtual Hosts no Ubuntu 20.04
Uma das configurações básicas para quem trabalha com o Apache como servidor web é criar os virtual hosts, que é um recurso do servidor de separar cada projeto em um domínio personalizado distinto, permitindo uma simulação mais perto da real de um servidor de produção.
Além disso, falando num servidor de produção em si como em uma máquina da Amazon AWS por exemplo, o recurso de Virtual Hosts é que permite você ter vários sites hospedados no mesmo servidor, respondendo a diferentes domínios apontados para diferentes pastas (ou para mesma pasta no caso de um alias).
Pré-requisitos
Obviamente, para fazer a configuração do Virtual Hosts, é preciso que o servidor Apache já esteja instalado e configurado no computador. Nesse blog já tenho diversas publicações que explicam como fazer isso, sendo essa referente ao Ubuntu 20.04 a mais recente.
Basicamente, os passos são: Criar a estrutura de diretórios com as permissões corretas; criar o arquivo de configuração do Apache; habilitar o novo site; criar um arquivo index de teste e fazer a configuração do arquivo hosts. Vamos lá!
-
Criar a estrutura de diretórios
Por padrão, o Apache utiliza a pasta /var/www como document root, base para seus projetos. Vamos manter esse padrão e criar uma subpasta para cada projeto lá dentro. E dentro da pasta de cada projeto, vamos criar uma subpasta public_html onde estarão todos os arquivos, para manter o mesmo padrão de servidores de hospedagem.
Por exemplo, vou criar duas pastas, uma para cada projeto (que vou chamar de site1 e site2) e dentro as pastas public_html.
sudo mkdir -p /var/www/site1.com/public_html sudo mkdir -p /var/www/site2.com/public_html
As partes em negrito serão os domínios de cada site.
-
Permissões nas pastas
Ao criar as pastas com o comando SUDO, automaticamente elas têm como dono o usuário root. Para que o usuário logado tenha acesso a pastas precisamos dar as permissões corretas. A primeira é adicionar o usuário do Apache ao grupo do usuário que está logado:
sudo usermod -a -G www-data $USER
Altere o proprietário a nível de grupo da pasta /var/www e seu conteúdo para o grupo do Apache:
sudo chown -R $USER:www-data /var/www
A variável $USER representa o usuário que está logado no momento em que os comandos forem executados. Agora precisamos modificar as permissões para garantir que o usuário tenha acesso irrestrito (escrita e leitura) aos arquivos e que a nível de grupo possa ler e executar os arquivos:
sudo chmod -R 775 /var/www
Assim você garante que outros usuários consigam ver seus arquivos (acessar o site) e seu usuário tenha acesso de escrita.
-
Criar uma index para teste
Para testarmos nossos sites depois de configurados, vamos criar um arquivo index.html e colocar em cada uma das pastas. Terá um código simples, apenas mesmo para conferirmos o resultado de tudo. Um exemplo:
<html>
<head>
<title>Site1 funciona!</title>
</head>
<body>
<h1>Sucesso!</h1>
</body>
</html>
Abra seu editor de códigos preferível, cole o código acima e salve nas pastas dos projetos. Você pode manter o mesmo código para as duas pastas, sinta-se a vontade de alterar se preferir.
Eles ficarão nessa pasta:
/var/www/site1.com/public_html/index.html /var/www/site2.com/public_html/index.html
-
Criar os arquivos Virtual Host
Agora sim vai começar o trabalho pesado.
Os arquivos que definem o Virtual Host são responsáveis por definir a configuração de cada domínio. O Apache já vem com um arquivo padrão e vamos copiá-lo para aproveitá-lo como ponto de partida. Os arquivos do Virtual Host ficam na pasta /etc/apache2/sites-available/000-default.conf. Execute o comando:
sudo cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/site1.com.conf
Vamos editar o novo arquivo com permissão root:
sudo gedit /etc/apache2/sites-available/site1.com.conf
O arquivo original vai ter mais ou menos esse formato (eu removi todos os comentários para facilitar):
<VirtualHost *:80> ServerAdmin webmaster@localhost DocumentRoot /var/www/html Alias /phpmyadmin "/usr/share/phpmyadmin/" <Directory "/usr/share/phpmyadmin/"> Order allow,deny Allow from all Require all granted </Directory> ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined </VirtualHost>
Vamos personalizar para funcionar para nosso site1. Deverá ficar como o modelo abaixo:
<VirtualHost *:80> ServerName site1.com ServerAlias www.site1.com ServerAdmin admin@site1.com DocumentRoot /var/www/site1.com/public_html <Directory "/var/www/site1.com/public_html"> Options Indexes FollowSymLinks MultiViews AllowOverride All Require all granted </Directory> ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined </VirtualHost>
A primeira alteração foi a adição da linha ServerName:
ServerName site1.com
Essa linha corresponde ao domínio associado à esse Virtual Host. ServerAlias é um apelido, um outro endereço associado (ou vários) que levarão o usuário para o mesmo destino.
ServerAlias www.site.com
Colocar o email do administrador que receberá informações do domínio.
ServerAdmin admin@site1.com
A linha que corresponde ao diretório onde estarão os arquivos do site em questão. DocumentRoot deve indicar a pasta criada anteriormente.
DocumentRoot /var/www/site1.com/public_html
O bloco Directory tem a ver com permissões do Apache na leitura da pasta e a possibilidade de rescrever a URL, necessário para habilitar o mod_rewrite, popularmente conhecido como “URLs amigáveis”. Se você não conhece sobre URLs amigáveis, veja esse post.
As duas últimas linhas são relacionadas ao LOG, onde serão inseridas informações de erros, warnings, etc.
Faça agora uma cópia do arquivo configurado para ser usado pelo site2. Execute o comando:
sudo cp /etc/apache2/sites-available/site1.com.conf /etc/apache2/sites-available/site2.com.conf
Editar o arquivo e faça as personalizações necessárias, como fizemos com o site1.
-
Ativar os novos arquivos Virtual Host
Depois de criados, os arquivos Virtual Host precisam ser ativados no Apache para que respondam pelos domínios associados. Execute os comandos:
sudo a2ensite site1.com.conf sudo a2ensite site2.com.conf
Será necessário reiniciar o Apache:
sudo service apache2 restart
-
Configurar o arquivo Host do servidor local
Se você tentar acessar os sites agora pelo navegador, provavelmente não funcionará. É preciso “avisar” o servidor local que os arquivos relacionados a esses domínios estão configurados localmente, para que eles não sejam buscados na internet.
Basta editar o arquivo /etc/hosts:
sudo gedit /etc/hosts
Se você ainda não tiver editado esse arquivo anteriormente, você verá duas linhas iniciais parecidas com essas:
127.0.0.1 localhost 127.0.1.1 divera-hp
Onde, no meu caso, divera-hp é o nome do meu computador na rede. 127.0.1.1 é IP correspondente ao localhost, ou seja, o próprio computador. Basicamente, o que será preciso fazer é, adiciona duas linhas, uma para cada site, logo abaixo dessa segunda. No meu caso, ficaria assim:
127.0.0.1 localhost 127.0.1.1 divera-hp 127.0.1.1 site1.com 127.0.1.1 site2.com
Salve o arquivo e vamos testar!
-
Testando o virtual host
Basta agora abrir o navegador e entrar com os endereços que configuramos para responderem no Virtual Host:
http://site1.com
Você deverá ver escrito “Sucesso!” na tela, já que foi esse o conteúdo do arquivo index.html que colocamos na pasta. O mesmo deve aparecer para o site2, ao entrar com o endereço:
http://site2.com
-
Erro de permissão
Para cada nova pasta de projeto inserida em /var/www faça os comandos abaixo:
sudo chmod -R 775 /var/www/site1.com sudo chown -R $USER:www-data /var/www/site1.com
Se deu tudo certinho, você conseguiu acessar os 2 sites no mesmo servidor, apenas tendo um arquivo Virtual Host para cada um.
12
Parabéns, estou usando Ubuntu 24 e funcionou perfeitamente, muito obrigado!
Parabéns, perfeita explicação.
Obrigado Lucas!
Eu segui os passos mas ao acessar pelo navegador não funcionou, estou utilizando uma máquina virtual. Mas aí realizar todos os passos só consigo acessar a página Index do apache. Pode me ajudar?
Benxer, provavelmente tem algum erro no virtual host do domínio que você está tentando acessar. Você executou o comando a2ensite.conf? Sugiro, se possível, refazer todo o tutorial. É um processo enjoado mesmo, uma aspas errada atrapalha tudo.
Foi de primeira. Parabéns.
Show de bola! Valeu Felipe
Top de verdade, resolveu uma bronca que eu tava tendo!! E o melhor facil, simples e objetivo. Parabéns !!!!
Maravilha Bruno! Obrigado pelo comentário
Muito bom! Eu vim de outro tutorial que explicava tudo certinho, mas, eles esqueceram de colocar um tópico para configurar o arquivo host, que acabei encontrando aqui.
Top! Valeu pelo feedback
Simples e objetivo!
Parabéns e obrigado pelo tutorial!
Show de bola! Obrigado Scherry.
Mano, você está de parabéns!
Estou vindo da hospedagem compartilhada para uma vps e configurando uma no ubuntu pela primeira vez e toda vez instalava a pilha LAMP, phpMyAdmin, letsencrypt e etc, mas quando subia os arquivos para o sftp sempre que ia configurar o site, por exemplo o wordpress dava erro nas permissões mesmo eu dando essa: sudo chown -R $USER:$USER /var/www/dominio.com, pesquisando em fóruns gringo encontrei algo que falava do www-data no ubuntu 20.04 e fui pesquisar mais sobre, encontrei seu site e consegui fazer funcionar depois de quase uma semana.
Obrigado brother, ganhou mais um seguidor!
Ótimo feedback Júlio, muito obrigado! Realmente essa parte de permissão é de arrancar os cabelos.
Parabéns!
Muito pratico e direto o tutorial, me ajudou muito aqui.
Nesse mesmo sento, tem como eu publicar uma API AspNet Core? Qual seria o procedimento? Quero publicar no site1 (por exemplo). e como configurar o apache para que o mesmo não fique dando msg de certificado invalido?
E aí Michael, como vai? Obrigado pelo comentário meu caro. Que bom que ajudou!
Nunca testei com AspNet pra ser sincero, não sei te falar se funciona. Sobre o Certificado, vc pode instalar um gratuito com o https://letsencrypt.org/. É bem tranquilo! Vai rodar no AspNet no linux mesmo?
Muito obrigado pelo tutorial! Essa última parte sobre configurar o host não constava em nenhum dos outros tutoriais que eu tinha visto até então, o que para alguns iniciantes como eu não é algo tão óbvio
Maravilha Antônio! Que bom que deu certo. Eu tento detalhar ao máximo porque nada é óbvio né, como vc disse, principalmente para iniciantes. Valeu pelo comentário.