De acordo com a pesquisa mais recente da
Netcraft, o Apache continua sendo o servidor web mais utilizado atualmente, seguido pelo Nginx e pelo IIS da Microsoft. Desta forma, caso você seja um administrador de sistemas encarregado de gerenciar servidores web, o ideal é que consiga deixá-los operando com as necessidades de seus clientes. Neste material irei discutir algumas dicas de como certificar-se que o Apache seja executado de forma suave sendo capaz de lidar com o número de solicitações que você deseja.
Sempre mantenha seu Apache atualizado para a última versão
Eu não deveria dizer isso, mas, estar com a última versão do Apache instalado é provavelmente a primeira ação que você deve considerar, e executar!
Embora as últimas versões possam não estar disponíveis nos pacotes atuais no repositório de sua distribuição (Ubuntu, Debian, CentOS etc), elas estão publicadas instalação estão disponíveis nesse link:
https://httpd.apache.org/docs/2.4/install.html. Lembre-se de realizar o backup de suas configurações atuais que estão em /sites* /virtualhosts*, ou em qualquer outro local que você tenha armazenado.
Para verificar a versão que você possui instalada, utilize:
apache2 --v
Você pode atualizar seu Apache de forma segura, utilizando o comando apt.
sudo apt upgrade apache2
Caso você esteja utilizando o Kernel em uma versão anterior a 5.4, considere atualizar agora
A versão 5.4 é extremamente segura, com uma excelente performance para as redes de computadores e transferência de arquivos, que são muito utilizadas nos servidores web, habilitando também o Apache a realizar a entrega de conteúdos estáticos (HTML, CSS, JavaScript, TXT etc) de forma rápida, utilizando muito pouco do CPU do servidor.
Para verificar a versão do seu Kernel, utilize o comando uname.
uname -r
Depois compare com a versão mais atual, no site
https://www.kernel.org. Quando escrevi esse artigo, a versão mais atual estável era a 5.8.5.
Embora a atualização do Kernel não seja um processo destinado aos iniciantes, essa tarefa é muito interessante e faz com que você aprenda mais sobre a tecnologia envolvida no
Linux. Busque na internet como atualizar e teste primeiro em uma máquina virtual, ao invés de realizar a ação direto em um de seus servidores.
Aloque a memória RAM de forma sábia para o seu Apache
Provavelmente o item de hardware mais crítico que deva ser levado em consideração, diz respeito a quantidade de memória RAM alocada para cada processo do Apache. Embora você não possa controlar esse alocamento diretamente, pode restringir o número de processos filhos através da diretiva
MaxRequestWorkers (conhecida como MaxClients no Apache 2.2), que irá limitar a quantidade de memória RAM utilizada pelo Apache. Você pode definir esse valor por hosts, ou por hosts virtuais.
Para realizar essa configuração você deve levar em consideração a quantidade de memória RAM utilizada pelo Apache, então multiplicar esse valor pelo número definido em
MaxRequestWorkers, sendo então essa a memória RAM que será alocada pelos processos do Apache. Lembre de sempre disponibilizar a memória do Apache de acordo com a memória física do seu hardware, sem utilizar a memória swap.
No exemplo abaixo, irei restringir o número de clientes simultâneos para 30. Caso um número maior tente realizar a conexão com o host, irão encontrar uma experiência com um delay (atraso), ou uma falha de conexão, que pode ser resolvida atualizando a página no navegador. Embora esse valor possa ser considerado indesejável em muitos servidores web, lembre-se de sempre realizar uma configuração condizente com seu hardware e suas necessidades.
A configuração exposta abaixo deve ser realizada no arquivo
/etc/apache2/apache2.conf em um servidor Ubuntu 20.04 LTS.
<IfModule mpm_event_module>
StartServers 3
MinSpareThreads 25
MaxSpareThreads 75
ThreadLimit 64
ThreadsPerChild 25
MaxRequestWorkers 30
MaxConnectionsPerChild 1000
</IfModule>
Caso queira conhecer mais configurações do Apache, visite a página oficial da documentação:
Defina o Multi-Processing Module (MPM) que funciona melhor para o seu caso
Na prática, MPMs estendem as funcionalidades modulares do Apache, habilitando ao administrador de sistemas em decidir como configurar as conexões do servidor web com a máquina, aceitando as requisições dos clientes, além de utilizar os processos filhos (ou threads), para lidar com esses pedidos.
A partir da versão 2.4 do Apache, existem 3 diferentes MPMs que podem ser utilizados, de acordo com suas necessidades:
- prefork MPM: utiliza múltiplos processos filhos, sem utilizar threads. Cada processo lida com uma conexão de uma vez, sem a criação de threads para cada uma delas. Sem entrar em muitos detalhes, posso dizer que você deve utilizar essa MPM quando estiver realizando o debug de uma aplicação, através da utilização do módulo non-thread-safe como o mod_php.
- worker MPM: utiliza diversas threads em cada processo filho, onde cada thread atende a uma conexão por vez. Esta é uma boa escolha para servidores de alto desempenho, habilitando lidar com mais conexões simultâneas, utilizando muito menos memória do que no caso anterior.
- event MPM: este é o modo padrão de MPM ao realizarmos a instalação do Apache na versão 2.4 ou superior. Funciona de forma parecida ao worker, criando múltiplas threads para cada processo filho, mas com uma vantagem: ela causa conexões KeepAlive ou idle (enquanto elas mantém este estado), para serem tratadas por uma única thread, liberando assim a memória RAM que pode ser alocada para outras threads. Esta MPM não é adequada para ser utilizada com módulos non-thread-safe como o mod_php, sendo que, neste caso, seria melhor a substituição pelo PHP-FPM.
Para verificar o MPM utilizando na instalação do seu Apache, utilize:
sudo apachectl -M
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1. Set the 'ServerName' directive globally to suppress this message
Loaded Modules:
core_module (static)
so_module (static)
watchdog_module (static)
http_module (static)
log_config_module (static)
logio_module (static)
version_module (static)
unixd_module (static)
access_compat_module (shared)
alias_module (shared)
auth_basic_module (shared)
authn_core_module (shared)
authn_file_module (shared)
authz_core_module (shared)
authz_host_module (shared)
authz_user_module (shared)
autoindex_module (shared)
deflate_module (shared)
dir_module (shared)
env_module (shared)
filter_module (shared)
mime_module (shared)
mpm_prefork_module (shared)
negotiation_module (shared)
php7_module (shared)
reqtimeout_module (shared)
setenvif_module (shared)
status_module (shared)
Observe que no meu caso, o módulo
mpm_prefork_module está carregado no Apache, ficando claro que utilizo o
prefork neste servidor web.
Para alterar o MPM utilizado, devemos alterar o arquivo:
sudo nano /etc/apache2/mods-available/<mpm>.loa
Sendo <mpm> uma das seguintes opções: mpm_event, mpm_worker, ou mpm_prefork.
Além disso, devemos descomentar a linha que carrega o módulo, como por exemplo:
LoadModule mpm_event_module modules/mod_mpm_event.so
Por último, reiniciar o Apache da seguinte forma:
sudo systemctl restart apache2 php5-fpm
sudo systemctl enable apache2 php5-fpm
Conheça suas aplicações
Como um princípio básico, você nunca deve carregar um módulo do Apache que não seja estritamente necessário para o trabalho de suas aplicações nesse servidor. Isto requer um conhecimento das aplicações que estão sendo executadas, além de seu funcionamento, especialmente se você desempenhar o papel de administrador de sistemas dessa máquina.
Para listar os módulos carregados utilize:
apache2ctl -M
Para desabilitar um módulo no Apache no servidor com o Ubuntu, utilize:
sudo a2dismod module_name
Para habilitar novamente, utilize:
sudo a2enmod module_name
Sempre que executar um dos comandos acima, você deve reiniciar o Apache.
sudo systemctl restart apache2
CONCLUSÕES
Espero que o conteúdo deste artigo ajude você a instalar e gerenciar melhor seus servidores web!
Me conte se você já utilizar o Apache e em que tipo de aplicação.