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

É interessante que você tenha uma instalação virgem do Apache HTTP para praticar enquanto le este post.

O problema

Você tem dois ou mais sites mas um único servidor físico no qual instalou o Apache. Ambos deverão estar acessíveis usando a mesma porta (80), mas são acessados usando domínios diferentes, digamos: devall.com.br e revista.devall.com.br.

A solução

A única instância do Apache deverá atender ambos. Entra em cena o conceito de virtual host.

Pra começar: o que é um host? A grosso modo, 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 neste momento e digite o seguinte comando:

ping devall.com.br

E logo 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

devall.com.br

revista.devall.com.br

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.

(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. Mas 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.

Vamos entender agora como obter 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 próxima imagem.

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>

Notou que a configuração 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 ).

Esta 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 fazer?

Finalmente os virtual hosts

Há dois caminhos aqui para serem seguidos. O do preguiçoso e o do caprichoso. 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 fatores pode interferir no resultado final. Observe que colocamos o domínio revista.devall.com.br 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>

Lembra que eu disse que esta era a maneira preguiçosa de se trabalhar? Como você deve proceder então?

Simples: 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 de quebra ainda torna sua configuração muito mais legível.

(e algumas ferramentas também funcionam melhor quando você adota esta prática, tal como o Certbot, por exemplo – falaremos mais tarde a seu respeito)

Após ter aplicado estas configurações, reinicie o servidor apache (te ensinamos a fazer isto no post anterior) e acesse os diferentes endereços. Voilá: dois sites atendidos pela mesma instância.

As pastas sites_available e sites_enabled

Se está acompanhando este guia, deve ter notado que no diretório aonde se encontram as configurações do Apache há dois diretórios: sites_available e sites_enabled (e também que há outra, chamada mods_available e mods_enabled, e confs_available e confs_enabled).

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

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.

Como praticar

Com base nestas informações, é interessante que você pratique. 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 guia.

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, brinque 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.

Desenvolvedor e co-fundador da itexto, do /dev/All, Groovy e Grails Brasil, Spring Brasil e JavaScript Brasil.
Desenvolvendo software desde o século passado e escrevendo a respeito no /dev/Kico

2 thoughts on “Apache HTTP Server para devs – o que são virtual hosts?

Leave comment

Your email address will not be published. Required fields are marked with *.

%d blogueiros gostam disto: