46.4. Hosts virtuais

O termo host virtual refere-se à habilidade do Apache de servir vários URIs (universal resource identifiers) a partir da mesma máquina física. Isso significa que vários domínios, como www.example.com e www.example.net, são executados por um servidor Web único em uma máquina física.

É prática comum usar hosts virtuais para evitar esforços administrativos (somente um servidor Web único precisa ser mantido) e despesas de hardware (não é necessário ter um servidor dedicado para cada domínio). Os hosts virtuais podem ser baseados em nome, IP ou porta.

Os hosts virtuais podem ser configurados através do YaST (consulte Host padrão) ou através da edição manual da seção Virtual Host do httpd.conf (consulte a Seção 46.3.2, “Configurando o Apache manualmente”).

Por padrão, o Apache no SUSE Linux está preparado para um arquivo de configuração por host virtual em /etc/apache2/vhosts.d/. Um modelo básico para um host virtual é fornecido neste diretório (vhost.template). A configuração de hosts virtuais também pode ser adicionada em outro local, por exemplo, em um arquivo que é então incluído na configuração.

[Important]Importante

É muito útil verificar a configuração do host virtual com o comando httpd2 -S. Ele tem como saída as configurações de host virtual conforme entendido pelo Apache e pode ajudar você a ter certeza de que obterá os resultados esperados. Se você usar o Apache com sinalizadores como -DSSL, precisará usar os mesmos sinalizadores ao testar. Por exemplo, use httpd2 -S -DSSL.

46.4.1. Hosts virtuais baseados em nome

Com os hosts virtuais baseados em nome, mais de um site da Web é servido por endereço IP. O Apache usa o campo host no cabeçalho HTTP enviado pelo cliente para conectar a solicitação a uma entrada ServerName correspondente de uma das declarações do host virtual. Se não forem encontradas entradas ServerName, a primeira VirtualHost especificada será usada como padrão.

NameVirtualHost inicia a seção Virtual Host em uma configuração Apache.

46.4.1.1. NameVirtualHost

NameVirtualHost informa o servidor Web do Apache em qual endereço IP e, opcionalmente, em que porta escutar solicitações de clientes que contêm o nome de domínio no cabeçalho HTTP.

O primeiro argumento pode ser um nome de domínio completo, mas é recomendável usar o endereço IP. O segundo argumento é a porta e é opcional. Por padrão, a porta 80 é usada e é configurada através da diretiva Listen (Seleção de dispositivos de rede).

O curinga * pode ser usado para que o endereço IP e a porta recebam solicitações em todas as interfaces. Os endereços IPv6 devem ser colocados entre colchetes.

Exemplo 46.8. Variações de entradas VirtualHost baseadas em nome

# NameVirtualHost IP-address[:Port]
NameVirtualHost 192.168.1.100:80
NameVirtualHost 192.168.1.100
NameVirtualHost *:80
NameVirtualHost *
NameVirtualHost [2002:c0a8:164::]:80
                

46.4.1.2. <VirtualHost></VirtualHost> in the Name-Based Context

The <VirtualHost></VirtualHost> blocks holds the information that applies to a particular domain. When Apache receives a client request for a defined VirtualHost, it uses the directives enclosed in this section. Any Apache directive that is allowed in the VirtualHost context can be used here. The opening VirtualHost tag takes the following arguments in a name-based virtual host configuration:

  • IP address (or fully qualified domain name) previously declared with the NameVirtualHost directive.

  • Optional port number previously declared with the NameVirtualHost directive.

The wild card * is also allowed as a substitute for the IP address. This syntax is only valid in combination with the wild card usage in NameVirtualHost * . When using IPv6 addresses, the address must be included in square brackets.

Exemplo 46.9. Name-Based VirtualHost Directives

<VirtualHost 192.168.1.100:80>
    ServerName www.example.com
    DocumentRoot /srv/www/htdocs/example.com
    ServerAdmin webmaster@example.com
    ErrorLog /var/log/apache2/www.example.com-error_log
    CustomLog /var/log/apache2/www.example.com-access_log common
</VirtualHost>

<VirtualHost 192.168.1.100:80>
    ServerName www.example.net
    DocumentRoot /srv/www/htdocs/example.net
    ServerAdmin webmaster@example.net
    ErrorLog /var/log/apache2/www.example.net-error_log
    CustomLog /var/log/apache2/www.example.net-access_log common
</VirtualHost>

<VirtualHost [2002:c0a8:164::]>
    # 2002:c0a8:164:: is the IPv6 equivalent to 192.168.1.100
    ServerName www.example.org
    DocumentRoot /srv/www/htdocs/example.org
    ServerAdmin webmaster@example.org
    ErrorLog /var/log/apache2/www.example.org-error_log
    CustomLog /var/log/apache2/www.example.org-access_log common
</VirtualHost>
                

Neste exemplo, os domínios www.example.com e www.example.net são hospedados na máquina com o endereço IP 192.168.1.100. O primeiro VirtualHost é o padrão para todas as solicitações de entrada ao servidor Web.

As diretivas ErrorLog (descritas na Seção 46.3.2.3.4, “ErrorLog arquivo | "|comando") e CustomLog (consulte http://httpd.apache.org/docs-2.0/mod/mod_log_config.html#customlog) não precisam conter o nome de domínio. Aqui, use um nome de sua escolha.

46.4.2. Hosts virtuais baseados em IP

Esta configuração de host virtual alternativa requer a configuração de vários IPs para uma máquina. Uma instância do Apache hospeda vários domínios, a cada qual é atribuído um IP diferente.

[Important]Endereços IP e hosts virtuais baseados em IP

O servidor físico deve ter um endereço IP para cada host virtual baseado em IP. Se a máquina não tiver várias placas de rede, interfaces de rede virtuais (criação de álias de IP) também poderão ser usadas.

46.4.2.1. Configurando a criação de álias de IP

Para que o Apache hospede vários IPs, a máquina física deve aceitar solicitações para vários IPs. Isto é chamado de hospedagem de vários IPs. Além disso, a criação de álias de IP deve estar ativada no kernel. Esta é a configuração padrão no SUSE Linux.

Uma vez que o kernel foi configurado para a criação de álias de IP, os comandos ifconfig e route podem ser usados para configurar IPs adicionais no host. Esses comandos devem ser executados como root.

No exemplo a seguir, pressupõe-se que o host já tenha o IP 192.168.0.10 atribuído para o dispositivo de rede eth0. Digite o comando ifconfig para exibir o IP do host. Mais endereços IP podem ser adicionados com os seguintes comandos:

ip addr add 192.168.0.20/24 dev eth0
ip addr add 192.168.0.30/24 dev eth0
            

Todos estes endereços IP são atribuídos ao mesmo dispositivo de rede física (eth0).

46.4.2.2. <VirtualHost></VirtualHost> no contexto baseado em IP

Uma vez que a criação de álias de IP foi configurada no sistema (ou o host foi equipado com várias placas de rede), o Apache pode ser configurado. É necessário um bloco separado VirtualHost para cada servidor virtual.

O seguinte exemplo mostra o Apache sendo executado em uma máquina com o IP 192.168.1.10, hospedando dois domínios nos IPs adicionais 192.168.0.20 e 192.168.0.30. Este exemplo particular somente funciona em uma rede privada, pois os IPs de 192.168.0.0 a 192.168.0.255 não são roteados à Internet pública.

Exemplo 46.10. DiretivasVirtualHost baseadas em IP

<VirtualHost 192.168.0.20>
    ServerName www.example.com
    DocumentRoot /srv/www/htdocs/example.com
    ServerAdmin webmaster@example.com
    ErrorLog /var/log/apache2/www.example.com-error_log
    CustomLog /var/log/apache2/www.example.com-access_log common
</VirtualHost>

<VirtualHost 192.168.0.30>
    ServerName www.example.net
    DocumentRoot /srv/www/htdocs/example.net
    ServerAdmin tux@example.net
    ErrorLog /var/log/apache2/www.example.net-error_log
    CustomLog /var/log/apache2/www.example.net-access_log common
</VirtualHost>
                

Aqui, diretivas VirtualHost somente são especificadas para interfaces que não sejam 192.168.0.10. Quando uma diretiva Listen (descrita em Seleção de dispositivos de rede) também é configurada para 192.168.0.10, um host virtual baseado em IP separado deve ser criado para responder solicitações HTTP àquela interface, caso contrário as diretivas encontradas na seção Servidor Principal do /etc/apache2/httpd.conf (consulte a Seção 46.3.2.3, “Diretivas do Apache em /etc/apache2/httpd.conf: Servidor principal ”) serão aplicadas.