Apache HTTP Server para devs – O que são Virtual Hosts?

Apache HTTP Server para devs – O que são Virtual Hosts?

No post anterior abordamos como ler as configurações do Apache. Talvez tenha lhe parecido confuso naquele momento, no entanto agora as coisas começarão a fazer mais sentido pois colocaremos o conhecimento em prática.

Para continuarmos nossa saga pelo Apache, é interessante que você tenha uma instalação virgem para praticar enquanto acompanha este post.

O problema

Temos dois ou mais sites mas um único servidor físico no qual instalou o Apache. Porém, ambos devem estar acessíveis usando a mesma porta (80), mas são acessados usando domínios diferentes, como por exemplo: devall.com.br e revista.devall.com.br.

A solução

A única instância do Apache deverá atender ambos. O que nos leva ao conceito de Virtual Host.

Primeiramente: o que é um host? De maneira objetiva, representa um servidor que é acessível a partir de um endereço IP. Por padrão, se você tiver mais de um domínio apontando para o mesmo IP, ambos referenciam o mesmo servidor (host).

Se este host está sendo usado, por exemplo, para hospedar um site, isto implica que para aquele endereço IP, apenas um site está disponibilizado.

Entra em cena então o host virtual, quando um mesmo servidor encontra-se habilitado para hospedar dois sites distintos, cada qual identificado por um domínio diferente. É exatamente o que está ocorrendo neste momento com o site que você está acessando. Abra seu terminal e digite o seguinte comando:

ping https://devall.com.br

E na sequência digite:

ping revista.devall.com.br

Notou que ambos apontam para o mesmo endereço IP? No entanto, acessando os diferentes endereços, você é apresentado a sites completamente distintos como visto na figura 1 e 2

Figura 1- Site dev/All
Figura 2 – Site revista.devAll

Poderiam ser domínios completamente diferentes também (a.com.br e coisa.com.br). O importante é que ambos apontem para o mesmo endereço IP.

Observação: uma nota importante: não quer dizer que a Revita /dev/All e o /dev/All estejam em execução no mesmo servidor. Talvez estejam em outras máquinas, veremos mais sobre isto quando falarmos sobre proxy reverso. Neste primeiro momento imagine que está tudo no mesmo servidor, apenas para facilitar a didática.

Sendo assim, em nosso exemplo, temos dois hosts virtuais: devall.com.br e revista.devall.com.br.

Aprenderemos agora como alcançar este resultado.

Configurando o servidor

DocumentRoot

Neste primeiro contato vamos imaginar que os dois sites acima mencionados são compostos apenas por conteúdo estático (HTML, CSS e JavaScript (devall.com.br é realmente assim)).

É importante que o servidor saiba quais arquivos retornar ao visitante quando acessa um ou outro domínio. O DocumentRoot representa o diretório raiz que contém os arquivos a serem servidos pelo Apache. Em nossa configuração de exemplo teremos uma situação similar à apresentada na figura 3.

Figura 3- Projeto exemplo

Cada DocumentRoot deve ser devidamente isolado. Se você acessar devall.com.br, não deve ser possível acessar os arquivos que são servidos por revista.devall.com.br.

É comum encontrar a definição do DocumentRoot padrão no arquivo /etc/apache2/sites-enabled/000-default.conf . O conteúdo do arquivo que você irá encontrar em uma nova instalação do Apache é muito similar ao que é apresentado a seguir:

<VirtualHost *:80>    

    DocumentRoot /var/www/html

</VirtualHost>

Analisando o arquivo de configuração, percebe-se que o arquivo começa com um <VirtualHost *:80>? Por padrão o Apache já inicia com um (e apenas um) virtual host configurado. Aquele responsável por receber todas as requisições, vindas de qualquer domínio, na porta 80 (por isto o *:80 ).

Este padrão de instrução, tal como vimos no post anterior denota um escopo de configuração. Tudo o que estiver dentro destas tags dirá respeito apenas a este host.

A diretiva DocumentRoot recebe como parâmetro um caminho em nosso servidor, que será o responsável por armazenar os arquivos que serão servidos pro aquele host.

Logo, para que tenhamos mais de um virtual host, como faremos?

Virtual Hosts

Há dois caminhos aqui para serem analisados. O do simplista e o do meticuloso. Começaremos pelo do preguiçoso.

Voltando ao nosso exemplo, para que tenhamos dois virtual hosts, basta editar o mesmo arquivo 000-default.conf para que fique similar ao apresentado a seguir:

<VirtualHost revista.devall.com.br:80>
        ServerAlias www.revista.devall.com.br      
        DocumentRoot /var/www/devall
</VirtualHost>

<VirtualHost devall.com.br:80>
        ServerAlias www.devall.com.br
        DocumentRoot /var/www/revista_devall
</VirtualHost>

A ordem dos virtual hosts configurados pode interferir no resultado final. Observe que exemplo o domínio revista.devall.com.br vem antes do devall.com.br. Isto garante que, caso alguém acesse o primeiro endereço, primeiro tente-se este e, na sequência, não encontrando, o segundo, que é mais genérico.

Observe também que há uma nova instrução agora: ServerAlias. Ela nos permite ter mais de um domínio apontando para o mesmo virtual host. No caso do www, é necessário no seu servidor DNS apontar para o mesmo IP com esta nova entrada (www.o_resto_do_dominio).

Temos agora a seguinte configuração:
Host 1 – revista.devall.com.br e www.revista.devall.com.br
Host 2 – devall.com.br e www.devall.com.br

Cada qual com seu próprio diretório independente e isolado.

Há outra forma de se obter o mesmo resultado: entra em ação a diretiva ServerName, que recebe como parâmetro o nome do servidor (o domínio). Vamos a mais um exemplo:

<VirtualHost *:80>
        ServerName revista.devall.com.br
        ServerAlias www.revista.devall.com.br      
        DocumentRoot /var/www/devall
</VirtualHost>

<VirtualHost *:80>
        ServerName devall.com.br
        ServerAlias www.devall.com.br
        DocumentRoot /var/www/revista_devall
</VirtualHost>

Recorda-se de quando mencionei anteriormente que essa era uma abordagem mais simplista? Nesse caso, qual seria o procedimento adequado a ser adotado?

Tenha no diretório sites-enabled dois arquivos: um para cada virtual host. Isto lhe evitará problemas relacionados à ordem de exposição do escopo VirtualHost e ainda torna sua configuração mais legível.

Nota: Algumas ferramentas também funcionam melhor quando você adota esta prática, tal como o Certbot, por exemplo – falaremos mais adiante a seu respeito.

Após ter aplicado estas configurações, reinicie o servidor Apache (o comando foi abordado post anterior) e acesse os diferentes endereços.

Voilá: dois sites atendidos pela mesma instância.

As pastas sites_available e sites_enabled

Caso você esteja acompanhando nossa série, você deve ter notado que no diretório em que se encontram as configurações do Apache há dois diretórios: sites_available e sites_enabled (e também que há outros, chamados mods_available e mods_enabled, e confs_available e confs_enabled).

Executando o comando ls -o (como demonstrado na figura 4) do Linux na pasta sites_enabled você notou que ali dentro há na realidade links e não arquivos?


Figura 4- Resultado do uso do comando ls -o na pasta sites_enabled

Esta é uma prática comum do Apache. Você armazena os arquivos na pasta sites_available, e apenas os links em sites_enabled. Com isto, se quiser ter apenas um hostname em ação (ou módulo, ou configuração), basta apagar o link, mantendo o arquivo original.

Pondo em prática

Com base nestas informações, é interessante praticar. Para tal, se estiver usando Linux, siga este guia rápido. Em primeiro lugar, tenha uma instalação virgem do Apache. Ela será útil para que consiga acompanhar o restante deste tutorial.

Agora, crie dois domínios virtuais na sua máquina. Se estiver usando Linux, basta editar o arquivo /etc/hosts para que fique tal como no exemplo a seguir:

127.0.0.1       localhost
127.0.1.1       bola
127.0.1.1       quadrado

Agora você tem dois domínios locais: bolaquadrado, que apontam para o seu IP local. Se o Apache já tiver instalado, digite estes domínios no seu navegador. A página inicial do servidor será exposta.

E agora, pratique com as suas configurações seguindo o que foi exposto neste post. Crie dois diretórios que conterão os sites estáticos distintos e acesse-os com as mudanças que você vir a realizar.

Resumindo

Neste post entendemos o funcionamento dos virtual hosts. Também expusemos o importante conceito de DocumentRoot (de uma forma bastante superficial neste momento, pois mais à frente iremos ver que há bem mais do que a simples diretiva DocumentRoot).

Agora que você já consegue entender as configurações e o que é um virtual host, podemos nos aprofundar ainda mais. Na sequência falaremos sobre proxy reverso.

Posts Relacionados