Pesquisa de site

5 dicas para aumentar o desempenho do seu servidor Web Apache


De acordo com um relatório recente da Netcraft (uma conhecida empresa de Internet que fornece, entre outros serviços, estatísticas de uso de navegadores web), o Apache continua a ser o servidor web mais utilizado entre sites e computadores conectados à Internet.

Além disso, o Apache continua apresentando o maior crescimento entre os principais servidores web, seguido pelo Nginx e pelo IIS. Assim, se você é um administrador de sistema responsável pelo gerenciamento de instalações do Apache, você precisa saber como garantir que seu servidor web funcione no melhor de sua capacidade de acordo com suas necessidades (ou de seu cliente).

Neste artigo discutiremos algumas dicas que ajudarão você a garantir que o Apache funcione sem problemas e seja capaz de lidar com o número de solicitações que você espera de clientes remotos.

No entanto, tenha em mente que o Apache não foi projetado com o objetivo de estabelecer recordes de benchmark – mas, mesmo assim, ainda é capaz de fornecer alto desempenho em quase todos os casos de uso que você possa imaginar.

DICA #1: Sempre mantenha o Apache atualizado com sua versão mais recente

Nem é preciso dizer que ter a versão mais recente do Apache instalada é provavelmente uma das primeiras coisas que você precisa considerar. Em 19 de novembro de 2015, a versão mais recente do Apache disponível nos repositórios do CentOS 7 é a 2.4.6, enquanto no Debian é >2.4.10.

No entanto, pode haver uma melhoria recente ou uma correção de bug que foi adicionada a uma versão estável recém-lançada, que é então disponibilizada para download e instalação a partir do código-fonte. Instruções de compilação e instalação também são fornecidas aqui – lembre-se de que se você escolher este método de atualização, você pode querer fazer backup de seus arquivos de configuração/sites/hosts virtuais atuais como precaução.

De qualquer forma, você pode verificar a versão atualmente instalada da seguinte maneira:

httpd -v               [On RedHat/CentOS based systems]
apache2 –v             [On Debian/Ubuntu based systems] 

Como regra geral, siga o método de atualização fornecido pelo gerenciador de pacotes da distribuição escolhida (yum update httpd ou aptitude safe-upgrade apache2, para CentOS ou Debian, respectivamente), a menos que não haja outra maneira. Você pode ler as notas de versão mais recentes na seção Documentação do Apache no site do projeto do servidor Apache HTTP.

DICA #2: Se você estiver usando um Kernel anterior a 2.4, considere atualizar agora

Por que? As versões do kernel 2.4 e superiores têm a chamada de sistema do kernel sendfile habilitada por padrão. Isso, por sua vez, facilita transferências de arquivos de rede de alto desempenho (que são desejadas no contexto das comunicações entre servidor web e cliente) e permite que o Apache entregue conteúdo estático mais rapidamente e com menor utilização da CPU, executando operações simultâneas de leitura e envio.

Você pode visualizar seu kernel atualmente instalado com:

uname -r

e compare-o com o kernel estável mais recente em www.kernel.org (4.3 no momento em que este livro foi escrito).

Embora seja um processo não destinado a iniciantes, atualizar seu kernel é um exercício interessante para aprender mais sobre o funcionamento interno do Linux.

DICA #3: Escolha o Módulo de Multiprocessamento (MPM) que funciona melhor para o seu caso

Na prática, os MPMs estendem a funcionalidade modular do Apache, permitindo que você decida como configurar o servidor web para se conectar às portas de rede da máquina, aceitar solicitações de clientes e usar processos filhos (e threads, alternativamente) para lidar com tais solicitações.

A partir da versão 2.4, o Apache oferece três MPMs diferentes para você escolher, dependendo de suas necessidades:

  1. O MPM prefork usa vários processos filhos sem threading. Cada processo lida com uma conexão por vez sem criar threads separados para cada um. Sem entrar em muitos detalhes, podemos dizer que você desejará usar este MPM apenas ao depurar um aplicativo que usa, ou se seu aplicativo precisar lidar com módulos não thread-safe, como mod_php.
  2. O MPM worker usa vários threads por processo filho, onde cada thread lida com uma conexão por vez. Esta é uma boa escolha para servidores de alto tráfego, pois permite que mais conexões simultâneas sejam tratadas com menos RAM do que no caso anterior.
  3. Finalmente, o event MPM é o MPM padrão na maioria das instalações do Apache para versões 2.4 e superiores. É semelhante ao MPM de trabalho, pois também cria vários threads por processo filho, mas com uma vantagem: causa conexões KeepAlive ou idle (enquanto permanecem nesse estado). para ser tratado por um único thread, liberando assim memória que pode ser alocada para outros threads. Este MPM não é adequado para uso com módulos não thread-safe como mod_php, para os quais um substituto como PHP-FPM deve ser usado.

Para verificar o MPM usado pela instalação do Apache, você pode fazer:

httpd -V

A imagem abaixo mostra que este servidor web específico está usando o prefork MPM.

Para alterar isso, você precisará editar:

/etc/httpd/conf.modules.d/00-mpm.conf          [On RedHat/CentOS based systems]
/etc/apache2/mods-available/<mpm>.load   [On Debian/Ubuntu based systems]

Onde pode ser mpm_event, mpm_worker ou mpm_prefork.

e descomente a linha que carrega o módulo desejado assim:

LoadModule mpm_event_module modules/mod_mpm_event.so

Nota: Para fazer o evento MPM funcionar no Debian, você pode ter que instalar o pacote libapache2-mod-fastcgi do pacote não-livre repositórios.

Além disso, para CentOS você precisará de php-fpm (junto com fcgi e mod_fcgid), enquanto no Debian ele é chamado de php5-fpm< (junto com apache2-mpm-event).

Por último, mas não menos importante, reinicie o servidor web e o serviço php-fpm (ou php5-fpm) recém-instalado:

No RedHat/CentOS

systemctl restart httpd php-fpm && systemctl enable httpd php-fpm

No Debian/Ubuntu

systemctl restart apache2 php5-fpm && systemctl enable apache2 php5-fpm

Embora você possa configurar o Apache para usar um MPM específico, essa configuração pode ser substituída por host virtual da mesma maneira indicada anteriormente.

Basta colocar as tags correspondentes no arquivo de configuração de cada host virtual e você estará pronto – mas certifique-se de usar um e apenas um MPM por vhost.

Finalmente, observe que independentemente da distribuição escolhida, php-fpm depende da implementação de FastCGI, razão pela qual recomendei as instalações de pacotes adicionais anteriormente.

Para mais detalhes e exemplos sobre php-fpm e como ele pode, junto com o evento MPM, aumentar o desempenho do Apache, você deve consultar a documentação oficial.

Isto é o que vejo depois de alterar o MPM padrão de prefork para evento na mesma caixa mostrada na imagem anterior:

No CentOS 7, você precisará certificar-se de que os serviços http e https estejam habilitados através do firewall e que a(s) interface(s) de rede ) são adicionados corretamente à zona padrão.

Por exemplo:

firewall-cmd --zone=internal --add-interface=tun6to4 
firewall-cmd --zone=internal --add-interface=tun6to4 --permanent 
firewall-cmd --set-default-zone=internal 
firewall-cmd --add-service=http 
firewall-cmd --add-service=https 
firewall-cmd --add-service=http --permanent 
firewall-cmd --add-service=https --permanent 
firewall-cmd --reload

A razão pela qual estou trazendo isso à tona é porque recentemente tive um problema em que as configurações padrão do firewalld em um VPS em nuvem impediam que php-fpm e Apache processassem arquivos php.

Como teste básico (tenho certeza que você pode pensar em testes mais complicados ou estressantes), criarei um arquivo php que verifica a existência de outro arquivo chamado test.php no mesmo diretório de dois CentOS 7 servidores com as mesmas características de hardware e carga, mas com MPM diferentes. Um deles usará evento e o outro usará prefork:

Este é o código php que salvei em um arquivo chamado checkiffileexists.php:

<?php
$filename = 'test.php';

if (file_exists($filename)) {
    echo "The file $filename exists";
} else {
    echo "The file $filename does not exist";
}
?>

Em seguida, executaremos a ferramenta de benchmark Apache (ab) com 200 solicitações simultâneas até que 2.000 solicitações sejam concluídas:

ab -k -c 100 -n 2000 localhost/checkiffileexists.php

Vamos fazer o teste e comparar os resultados. Preste atenção às estatísticas de desempenho:

Como você pode ver, o desempenho do servidor com evento é altamente superior ao seu equivalente prefork em todos os aspectos deste teste.

DICA #4: Aloque RAM com sabedoria para o Apache

Talvez o item de hardware mais crítico a ser levado em consideração seja a quantidade de RAM alocada para cada processo Apache. Embora não seja possível controlar isso diretamente, você pode restringir o número de processos filhos por meio da diretiva MaxRequestWorkers (anteriormente conhecida como MaxClients no Apache 2.2), o que colocará limites no uso de RAM pelo Apache. Novamente, você pode definir esse valor por host ou por host virtual.

Para fazer isso, você deve anotar a quantidade média de RAM usada pelo Apache, depois multiplicá-la pelo número de MaxRequestWorkers, e essa é a quantidade de memória que será alocada para os processos do Apache. Uma coisa que você nunca quer que seu servidor web faça é começar a usar swap, pois isso diminuirá significativamente seu desempenho. Portanto, você deve sempre manter o uso de RAM pelo Apache dentro dos limites que você pode pagar e nunca depender de swap para isso.

Por exemplo, o bloco a seguir restringirá o número de clientes simultâneos a 30. Se mais clientes acessarem o host, eles poderão sofrer um atraso ou uma falha momentânea que pode ser facilmente resolvida com a atualização do navegador. Embora isso possa ser considerado indesejável, é mais saudável para o servidor e, a longo prazo, também é melhor para o seu site.

Você pode colocar este bloco dentro de /etc/httpd/conf/httpd.conf ou /etc/apache2/apache2.conf, dependendo se você está usando CentOS ou Debian.

Observe que o mesmo princípio se aplica a todos os MPMs – estou usando evento aqui para continuar com o conceito descrito na dica anterior:

<IfModule mpm_event_module>
    StartServers 3
    MinSpareThreads          25
    MaxSpareThreads          75
    ThreadLimit                      64
    ThreadsPerChild          25
    MaxRequestWorkers    30
    MaxConnectionsPerChild    1000
</IfModule>

De qualquer forma, é altamente recomendável que você consulte a documentação do Apache 2.4 para ver quais diretivas são permitidas para o MPM escolhido.

DICA #5: Conheça suas aplicações

Como regra geral, você não deve carregar nenhum módulo do Apache que não seja estritamente necessário para o funcionamento do seu aplicativo. Isso exigirá pelo menos um conhecimento geral das aplicações em execução no seu servidor, principalmente se você for administrador do sistema e houver outra equipe responsável pelo desenvolvimento.

Você pode listar os módulos atualmente carregados com:

httpd -M          [On RedHat/CentOS based systems]
apache2ctl -M     [On Debian/Ubuntu based systems]

Para descarregar/desabilitar módulos no CentOS, você precisará comentar a linha que começa com LoadModule (seja no arquivo de configuração principal ou em um arquivo auxiliar dentro de /etc/httpd/conf.modules.d.

Por outro lado, o Debian fornece uma ferramenta chamada a2dismod para desativar módulos e é usada da seguinte forma:

a2dismod module_name

Para habilitá-lo novamente:

a2enmod module_name

Em ambos os casos, lembre-se de reiniciar o Apache para que as alterações tenham efeito.

Resumo

Neste artigo revisamos 5 dicas que ajudarão você a ajustar o servidor web Apache e aumentar seu desempenho. Além disso, você deve se lembrar que a otimização e o desempenho sem segurança são inúteis, então você também pode consultar o artigo instalar mod_pagespeed para melhorar o desempenho do servidor web e dicas de proteção do Apache em linux-console.net.

Como não podemos cobrir adequadamente todos os aspectos deste tópico neste artigo, talvez você pense em outras ideias que gostaria de compartilhar com o resto da comunidade. Em caso afirmativo, sinta-se à vontade para nos informar usando o formulário de comentários abaixo.