Instalar um LAMP com boa performance
Este artigo demonstra como realizar a instalação de um servidor web LAMP (Linux, Apache, MySQL e PHP), incluindo suas configurações além de questões relacionadas com a performance desse ambiente. A distribuição utilizada será o Ubuntu Server 20.04.1 LTS.
Parte 2: Melhorar a Performance do seu Servidor Apache
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.
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
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.
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.
Caso queira conhecer mais configurações do Apache, visite a página oficial da documentação:
A partir da versão 2.4 do Apache, existem 3 diferentes MPMs que podem ser utilizados, de acordo com suas necessidades:
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:
Por último, reiniciar o Apache da seguinte forma:
sudo systemctl restart apache2 php5-fpm
sudo systemctl enable apache2 php5-fpm
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
Me conte se você já utilizar o Apache e em que tipo de aplicação.
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>
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.
Muito bom. Está bem completo.
___________________________________________________________