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:
- 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. - 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. - 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
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.