11.2. Servidor web (HTTP)
Os administradores da Falcot Corp decidiram usar o servidor HTTP da Apache, incluído no Debian Jessie na versão 2.4.10.
11.2.1. Instalação do Apache
Instalar o pacote apache2 é tudo o que é preciso. ele contém todos os môdulos, incluíndo os Multi-Processing Modules (MPMs) que afetam como o Apache lida com processamento paralelo de muitas requisições (aqueles que costumeiramente eram fornecidos em pacotes apache2-mpm-* separados). Ele irá também puxar o apache2-utils que contém os utilitários de linha de comando que nós iremos descobrir mais tarde.
O MPM em uso afeta significantemente a forma com que o Apache irá lidar com as requisições simultâneas. Com o MPM worker, ele usa threads (processos leves), enquanto que com o MPM prefork ele usa um grupo de processos criados antecipadamente. Com o MPM event ele também usa threads, porém as conexões inativas (notavelmente aquelas mantidas abertas pelo recurso HTTP keep-alive) são devolvidas a um segmento de gerenciamento dedicado.
Os administradores da Falcot também instalaram o libapache2-mod-php5 a fim de incluir suporte a PHP no Apache. Isso faz com que o evento padrão MPM seja desabilitado, e o prefork seja instalado em seu lugar, já que o PHP só funciona sob esse MPM em particular.
O Apache é um servidor modular, e muitos recursos são implementados através de módulos externos que o programa principal carrega durante sua inicialização. A configuração padrão apenas habilita os módulos mais comuns, porém habilitar módulos novos é uma simples questão de rodar a2enmod módulo
; para desabilitar um módulo, o comando é a2dismod módulo
. Esses programas na verdade apenas criam (ou apagam) ligações simbólicas em /etc/apache2/mods-enabled/
, que apontam para para os arquivos reais (armazenados em /etc/apache2/mods-available/
).
Com sua configuração padrão, o servidor web ouve na porta 80 (como configurado em /etc/apache2/ports.conf
), e serve páginas a partir do diretório /var/www/html/
(como configurado em /etc/apache2/sites-enabled/000-default.conf
).
11.2.2. Configuração de servidores virtuais
Um servidor virtual é uma identidade adicional para o servidor web.
Apache considera dois tipos diferentes de hosts virtuais: aqueles que se baseiam no endereço IP (ou na porta) e aqueles que se baseiam no nome de domínio do servidor web. O primeiro método requer a alocação de um endereço IP diferente (ou porta) para cada site, enquanto o segundo pode funcionar em um único endereço IP (e porta), os sites são diferenciados pelo nome de máquina enviado pelo cliente HTTP (que só funciona na versão 1.1 do protocolo HTTP — Felizmente essa versão é antiga o bastante, e assim, é utilizada por todos os clientes).
A (crescente) escassez de endereços IPv4 geralmente favorece o segundo método; contudo, fica mais complexo se os hosts virtuais precisam fornecer HTTPS também, pois o protocolo SSL nem sempre é fornecido para hospedagem virtual baseada em nome; a extensão SNI (Server Name Indication) que permite uma combinação desse tipo não é suportada por todos os navegadores. Quando vários sites HTTPS precisam ser rodados no mesmo servidor, eles geralmente irão ser diferenciados ou por rodar em uma porta diferente ou um endereço IP diferente (IPv6 pode ajudar aqui).
A configuração padrão do Apache 2 habilita hosts virtuais baseados em nomes. Além disso, um host virtual padrão é definido no arquivo /etc/apache2/sites-enabled/000-default.conf
; esse host virtual será usado se não for encontrado nenhum host que corresponda à solicitação enviada pelo cliente.
Cada host virtual extra é então descrito por um arquivo armazenado em /etc/apache2/sites-available/
. Configurar um site web para o domínio falcot.org
é portanto uma simples questão de criar o seguinte arquivo, e então, habilita o host virtual com a2ensite www.falcot.org
.
Exemplo 11.16. o arquivo /etc/apache2/sites-available/www.falcot.org.conf
<VirtualHost *:80>
ServerName www.falcot.org
ServerAlias falcot.org
DocumentRoot /srv/www/www.falcot.org
</VirtualHost>
O servidor Apache, como configurado até agora, usa os mesmos arquivos de log para todos os hosts virtuais (embora isso possa ser alterado adicionando as diretivas CustomLog
na definição de hosts virtuais). É, entretanto, boa prática customizar o formato desse arquivo de log para ter incluído o nome do host virtual. Isso pode ser feito criando um arquivo /etc/apache2/conf-available/customlog.conf
, que define um novo formato para todos os arquivos de log (com a diretiva LogFormat
), e habilitando-o com a2enconf customlog
. A linha CustomLog
tem também que ser removida (ou comentada) do arquivo /etc/apache2/sites-available/000-default.conf
.
Exemplo 11.17. O arquivo /etc/apache2/conf.d/customlog.conf
# New log format including (virtual) host name
LogFormat "%v %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" vhost
# Now let's use this "vhost" format by default
CustomLog /var/log/apache2/access.log vhost
Essa seção revê, brevemente, algumas das diretivas comumente usadas na configuração do Apache.
O principal arquivo de configuração inclui vários blocos Directory
; eles permitem especificar diferentes comportamentos para o servidor dependendo da localização do arquivo que está sendo servido. Um bloco desse tipo comumente inclui as diretivas Options
e AllowOverride
.
Exemplo 11.18. Bloco Directory
<Directory /var/www>
Options Includes FollowSymlinks
AllowOverride All
DirectoryIndex index.php index.html index.htm
</Directory>
A diretiva DirectoryIndex
contém uma lista de arquivos a serem experimentados quando uma requisição do cliente coincide com um diretório. O primeiro arquivo existente da lista é usado e enviado como resposta.
A diretiva Options
é seguida de uma lista de opções a serem habilitadas. O valor None
desabilita todas as opções; correspondentemente, All
habilita todas elas exceto MultiViews
. As opções disponíveis incluem:
ExecCGI
indica que scripts CGI podem ser executados.
FollowSymlinks
diz ao servidor que ligações simbólicas podem ser seguidas, e que a resposta deve conter o conteúdo do alvo de uma ligação como essa.
SymlinksIfOwnerMatch
também diz ao servidor para seguir ligações simbólicas, mas apenas quando a ligação e seu alvo são do mesmo dono.
Includes
habilita
Server Side Includes (
SSI para abreviar). Essas são diretivas embutidas nas páginas HTML e executadas em tempo de execução de cada requisição.
Indexes
diz ao servidor para listar o conteúdo de um diretório se a requisição HTTP enviada pelo cliente aponta para um diretório sem um arquivo index (ie, quando nenhum arquivo mencionado na diretiva
DirectoryIndex
existe nesse diretório).
MultiViews
habilita a negociação de conteúdo; isso pode ser usado pelo servidor para retornar uma página web que coincida com a língua preferida configurada no navegador.
A diretiva AllowOverride
lista todas as opções que podem ser habilitadas ou desabilitadas pelo arquivo .htaccess
. Um uso comum dessa opção é restringir ExecCGI
, para que o administrador escolha quais usuários tem permissão para rodar programas sob a identidade do servidor web (o usuário www-data
).
11.2.3.1. Autenticação obrigatória
Em algumas circunstâncias, o acesso a parte do site web precisa ser restrita, para que apenas usuários legítimos que fornecerem um nome de usuário e uma senha tenham acesso ao conteúdo.
Exemplo 11.19. Arquivo .htaccess
para autenticação obrigatária
Require valid-user
AuthName "Private directory"
AuthType Basic
AuthUserFile /etc/apache2/authfiles/htpasswd-private
O arquivo
/etc/apache2/authfiles/htpasswd-private
contém uma lista de usuários e senhas; ele é comumente manipulado com o comando
htpasswd
. Por exemplo, o seguinte comando é usado para adicionar um usuário ou alterar a senha:
#
htpasswd /etc/apache2/authfiles/htpasswd-private user
New password:
Re-type new password:
Adding password for user user
11.2.3.2. Restringindo Acesso
A diretiva Require
controla as restrições de acesso em um diretório (e seus sub-diretórios, recursivamente).
Isso pode ser usado para restringir acesso com base em muitos critérios; nós iremos parar na descrição de restrição de acesso com base no endereço IP de um cliente, mas isso pode ser feito de maneira muito mais poderosa, especialmente quando várias diretivas Require
são combinadas dentro de um bloco RequireAll
.
Exemplo 11.20. Apenas permite a partir da rede local
Require ip 192.168.0.0/16
11.2.4. Analisadores de Log
Um analisador de log é frequentemente instalado em um servidor web; já que o primeiro fornece aos administradores uma ideia precisa do padrão de uso do último.
Os administradores da Falcot Corp selecionaram o AWStats (Advanced Web Statistics) para analisar seus arquivos de log do Apache.
O primeiro passo de configuração é a customização do arquivo /etc/awstats/awstats.conf
. O administradores da Falcot o mantiveram inalterado, exceto os seguintes parâmetros:
LogFile="/var/log/apache2/access.log"
LogFormat = "%virtualname %host %other %logname %time1 %methodurl %code %bytesd %refererquot %uaquot"
SiteDomain="www.falcot.com"
HostAliases="falcot.com REGEX[^.*\.falcot\.com$]"
DNSLookup=1
LoadPlugin="tooltips"
Todos esses parâmetros são documentados através de comentários no arquivo de exemplo. Em particular, os parâmetros LogFile
e LogFormat
descrevem a localização e o formato do arquivo de log e a informação que ele contém; SiteDomain
e HostAliases
listam os vários nomes pelos quais o site web principal é conhecido.
Para sites com alto tráfego, DNSLookup
geralmente não deveria ser configurado como 1
; para sites menores, como o da Falcot descrito acima, essa configuração permite ter relatórios mais legíveis, que incluem o nome completo da máquina ao invés de simplesmente endereços IP.
O AWStats também será habilitado para outros hosts virtuais; cada host virtual precisa de um arquivo de configuração próprio como /etc/awstats/awstats.www.falcot.org.conf
.
Exemplo 11.21. Arquivo de configuração dO AWStats para um servidor virtual
Include "/etc/awstats/awstats.conf"
SiteDomain="www.falcot.org"
HostAliases="falcot.org"
O AWStats usa muitos ícones que estão armazenados no diretório /usr/share/awstats/icon/
. Para que esses ícones fiquem disponíveis no site web, a configuração do Apache precisa ser adaptada para incluir as seguintes diretivas:
Alias /awstats-icon/ /usr/share/awstats/icon/
Após alguns minutos (e uma vez que o script tenha sido rodado algumas vezes), os resultados ficarão disponíveis online: