Product SiteDocumentation Site

11.2. Servidor web (HTTP)

Os(A) administradores(as) da Falcot Corp decidiram usar o servidor HTTP da Apache, incluído no Debian Bullseye na versão 2.4.52.

11.2.1. Instalação do Apache

Instalar o pacote apache2 é tudo o que é preciso. Ele contém todos os módulos, incluindo os Multi-Processing Modules (MPMs - Módulos de Multiprocessamentos) que afetam como o Apache lida com processamento paralelo de muitas requisições e que geralmente eram fornecidos em pacotes apache2-mpm-* separados. Ele também baixará apache2-utils que contém os utilitários de linha de comando que 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 uma thread de gerenciamento dedicado.
The Falcot administrators also install libapache2-mod-php so as to include the PHP 7.4 support in Apache. This causes the default event MPM to be disabled, and prefork to be used instead. To use the event MPM one can use php-fpm.
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 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. Adicionando suporte a SSL

O Apache 2.4 inclui o módulo SSL (mod_ssl) necessário para HTTP seguro (HTTPS) "de fábrica". Ele apenas precisa ser habilitado com a2enmod ssl, e então as diretivas necessárias têm que ser adicionadas aos arquivos de configuração. Um exemplo de configuração é fornecido em /etc/apache2/sites-available/default-ssl.conf.
Se queres gerar certificados de confiança, vá para a seção Seção 10.2.1, “Criando certificados confiáveis grátis” e então ajuste as seguintes variáveis:
SSLCertificateFile      /etc/letsencrypt/live/DOMAIN/fullchain.pem
SSLCertificateKeyFile   /etc/letsencrypt/live/DOMAIN/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/DOMAIN/chain.pem
SSLCACertificateFile    /etc/ssl/certs/ca-certificates.crt
Some extra care must be taken if you want to favor SSL connections with Perfect Forward Secrecy (those connections use ephemeral session keys ensuring that a compromise of the server's secret key does not result in the compromise of old encrypted traffic that could have been stored while sniffing on the network). Have a look at Mozilla's recommendations in particular:
As an alternative to the standard SSL module, there is an extension module called mod_gnutls, which is shipped with the libapache2-mod-gnutls package and enabled with the a2enmod gnutls command. Unfortunately the version packaged for Debian had serious issues and even security implications and is therefor not part of the Debian Bullseye release.

11.2.3. 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.13. 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.14. O arquivo /etc/apache2/conf-available/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

11.2.4. Diretivas comuns

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.15. Bloco Directory

<Directory /srv/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 dessas ligações.
  • SymlinksIfOwnerMatch also tells the server to follow symbolic links, but only when the link and its target have the same owner.
  • Includes habilita Server Side Includes (SSI para abreviar). Essas são diretivas embutidas nas páginas HTML e executadas em tempo de execução para cada requisição.
  • IncludesNOEXEC permite inclusões no lado do servidor (SSI: «Server Side Includes»), mas desabilita a ordem exec e limita a diretiva include a arquivos de texto/marcado.
  • 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 índex (i.e., 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.4.1. Autenticação obrigatória

In some circumstances, access to part of a website needs to be restricted, so only legitimate users who provide a username and a password are granted access to the contents. These feature are provided by the mod_auth* modules.

Exemplo 11.16. 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.4.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.17. Apenas permite a partir da rede local

Require ip 192.168.0.0/16

11.2.5. 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.18. Arquivo de configuração dO AWStats para um servidor virtual

Include "/etc/awstats/awstats.conf"
SiteDomain="www.falcot.org"
HostAliases="falcot.org"
AWStats uses many icons stored in the /usr/share/awstats/icon/ directory. In order for these icons to be available on the web site, the Apache configuration needs to be adapted to include the following directive (check out /usr/share/doc/awstats/examples/apache.conf for a more detailed example):
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: