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.
![]() | 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. | |
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.
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.
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.
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.
![]() | 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. | |
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).
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.