Tutorial
Como configurar o Apache HTTP com MPM Event e PHP-FPM no Ubuntu 18.04
O autor selecionou a COVID-19 Relief Fund para receber uma doação como parte do programa Write for DOnations.
Introdução
O servidor Web Apache HTTP evoluiu através dos anos para trabalhar em diferentes ambientes e resolver diferentes necessidades. Um problema importante que o Apache HTTP tem que resolver, como qualquer servidor Web, é como lidar com diferentes processos para atender a uma requisição de protocolo http. Isso envolve abrir um soquete, processar a requisição, manter a conexão aberta por um determinado período, processar novos eventos que ocorrem através dessa conexão e retornar o conteúdo produzido por um programa criado em uma linguagem específica (como PHP, Perl, ou Python). Essas tarefas são executadas e controladas por um Módulo de Multiprocessamento (MPM).
O Apache HTTP vem com três MPMs diferentes:
- Pre-fork: um novo processo é criado para cada conexão de entrada que está chegando ao servidor. Cada processo é isolado dos outros, portanto, nenhuma memória é compartilhada entre eles, mesmo se eles estiverem executando chamadas idênticas em algum ponto em sua execução. Esta é uma maneira segura de executar aplicações vinculadas a bibliotecas que não suportam threading — geralmente aplicações ou bibliotecas mais antigas.
- Worker: um processo pai é responsável por lançar um conjunto de processos filhos, alguns dos quais estão escutando novas conexões de entrada, e outros estão apresentando o conteúdo solicitado. Cada processo é encadeado (uma única thread pode lidar com uma conexão), então um processo pode lidar com várias requisições simultaneamente. Este método de tratamento de conexões promove uma melhor utilização de recursos, ao mesmo tempo em que mantém a estabilidade. Isso é um resultado do conjunto de processos disponíveis, que geralmente possuem threads livres disponíveis, prontas para servir imediatamente novas conexões.
- Event: baseado no worker, este MPM vai um passo adiante, otimizando como os processos pais agendam tarefas para os processos filhos e as threads associadas a estes. Uma conexão permanece aberta por 5 segundos por padrão e fecha se nenhum novo evento acontece; este é o valor padrão da diretiva keep-alive, que mantém a thread associada a ela. O Event MPM habilita o processo a gerenciar threads para que algumas threads estejam livres para lidar com novas conexões de entrada, enquanto outras são mantidas vinculadas às conexões ativas. Permitir a re-distribuição de tarefas atribuídas para as threads contribuirá para melhorar a utilização de recursos e desempenho.
O MPM Event é um módulo de multiprocessamento rápido disponível no servidor Web Apache HTTP.
O PHP-FPM é o gerenciador de processos FastCGI para o PHP. O protocolo FastCGI é baseado na Common Gateway Interface (CGI), um protocolo que se encontra entre as aplicações e os servidores Web como o Apache HTTP. Isso permite que os desenvolvedores escrevam aplicações separadamente do comportamento dos servidores Web. Os programas executam os processos deles independentemente e passam o produto ao servidor Web através deste protocolo. Cada nova conexão que necessite de processamento por uma aplicação criará um novo processo.
Ao combinar o MPM Event no Apache HTTP com o PHP FastCGI Process Manager (PHP-FPM) um site pode carregar mais rapidamente e lidar com mais conexões simultâneas ao mesmo tempo em que usa menos recursos.
Neste tutorial, você irá melhorar o desempenho da pilha LAMP, modificando o módulo padrão de multi processamento de pre-fork para event e utilizando o gerenciador de processos PHP-FPM para lidar com código PHP, em vez do mod_php
clássico no Apache HTTP.
Pré-requisitos
Antes de iniciar este guia, será necessário o seguinte:
- Um servidor Ubuntu 18.04 configurado conforme o Guia de configuração inicial do servidor Ubuntu 18.04, incluindo um usuário não root de comando sudo e um firewall.
- A pilha LAMP instalada em seu servidor seguindo o tutorial How To Install Linux, Apache, MySQL, PHP (LAMP stack) on Ubuntu 18.04.
Passo 1 — Alterando o módulo de Multiprocessamento
O Ubuntu herda scripts para habilitar ou desabilitar módulos Apache HTTP de sua distribuição pai, o Debian. Você usará este conjunto de ferramentas neste passo para desativar o módulo Pre-fork e ativar o módulo Event.
Neste passo, você irá parar o Apache HTTP, desativar o módulo PHP 7.2
vinculado ao módulo Pre-fork e, em seguida, desativar o Pre-fork para habilitar o módulo Event imediatamente.
Primeiro, você irá parar o serviço Apache HTTP:
- sudo systemctl stop apache2
Agora, desative o módulo PHP 7.2
, que está relacionado ao módulo Pre-fork:
- sudo a2dismod php7.2
A seguir, desabilite o módulo Pre-fork MPM:
- sudo a2dismod mpm_prefork
Agora, habilite o módulo Event MPM:
- sudo a2enmod mpm_event
Você mudou o MPM de pre-fork para event e removeu a conexão do módulo PHP 7.2
entre o PHP e o Apache HTTP. No próximo passo, você irá instalar o módulo php-fpm
, bem como as bibliotecas relacionadas e módulos de proxy. Você irá configurar o Apache HTTP para que ele também possa se comunicar com o PHP.
Passo 2 — Configurando o Apache HTTP para usar o gerenciador de processos FastCGI
Nesta fase, você mudou a maneira como o Apache HTTP processa as conexões, alterando o MPM de Pre-fork para Event. No entanto, ao longo do caminho, você desabilitou o módulo PHP que conectava o Apache HTTP a qualquer programa em execução no PHP.
Neste passo, você irá instalar o processador PHP-FPM para que o Apache HTTP possa ser capaz de processar programas PHP novamente. E você também instalará as bibliotecas de dependências e habilitará os módulos para que ambos possam cooperar sem problemas e com mais rapidez do que antes.
Primeiro, instale o php-fpm
. O seguinte comando instalará o pacote PHP-FPM e habilitará automaticamente o serviço php7.2-fpm
integrado com o systemd, de maneira que o serviço seja iniciado durante o boot:
- sudo apt install php-fpm
Para se comunicar, o Apache HTTP e o PHP precisam de uma biblioteca que habilite esta capacidade. Agora, você irá instalar o libapache2-mod-fcgid
, que é capaz de servir como interface entre programas com servidores Web, e é específico para o Apache HTTP. Esta comunicação acontecerá através de um soquete UNIX.
Instale esta biblioteca:
- sudo apt install libapache2-mod-fcgid
Você instalou o php-fpm
e o libapache2-mod-fcgid
, mas nenhum dos dois está habilitado ainda.
Primeiro, habilite o módulo php-fpm
com o seguinte comando:
- sudo a2enconf php7.2-fpm
Segundo, habilite o módulo de proxy
do Apache HTTP:
- sudo a2enmod proxy
Terceiro, habilite o módulo de proxy
FastCGI no Apache HTTP:
- sudo a2enmod proxy_fcgi
Nota: você pode ler a configuração desta interação entre programas PHP e HTTP através de um soquete UNIX com o seguinte:
- cat /etc/apache2/conf-enabled/php7.2-fpm.conf
Agora tudo está pronto para que você possa iniciar o Apache HTTP. Você fará uma verificação de configuração primeiro:
- sudo apachectl configtest
OutputSyntax OK
Após isso, você pode prosseguir e reiniciar o Apache HTTP, uma vez que ele foi iniciado automaticamente ao instalar a biblioteca FastCGI libapache2-mod-fcgid
:
- sudo systemctl restart apache2
Você instalou o módulo php-fpm
, configurou o Apache HTTP para funcionar com ele, habilitou os módulos necessários para que o protocolo FastCGI funcione e iniciou os serviços correspondentes.
Agora que o Apache possui o módulo Event MPM habilitado e o PHP-FPM está presente e em execução, é hora de verificar se tudo está funcionando como previsto.
Passo 3 — Verificando sua configuração
Para verificar se as alterações de configuração foram aplicadas, você executará alguns testes. O primeiro verificará qual módulo de multiprocessamento o Apache HTTP está usando. O segundo verificará se o PHP está usando o gerenciador FPM.
Verifique o servidor Apache HTTP executando o seguinte comando:
- sudo apachectl -M | grep 'mpm'
Sua saída será a seguinte:
Outputmpm_event_module (shared)
Você pode repetir o mesmo para o módulo proxy
e para o FastCGI:
- sudo apachectl -M | grep 'proxy'
O resultado será:
Outputproxy_module (shared)
proxy_fcgi_module (shared)
Se você quiser ver a lista completa dos módulos, você pode remover a segunda parte do comando após o -M
.
Agora, é hora de verificar se o PHP está usando o gerenciador de processos FastCGI. Para fazer isso, você escreverá um pequeno script PHP que lhe mostrará todas as informações relacionadas ao PHP.
Execute o seguinte comando para gravar um arquivo com o nome a seguir:
- sudo nano /var/www/your_domain/info.php
Adicione o conteúdo a seguir ao arquivo info.php
:
<?php phpinfo(); ?>
Agora, visite o URL do seu servidor e acrescente info.php
ao final do seguinte modo: http://your_domain/info.php
.
A entrada da API do servidor será FPM/FastCGI
Exclua o arquivo info.php
após esta verificação para que nenhuma informação sobre o servidor seja divulgada publicamente:
- sudo rm /var/www/yourdomain.com/info.php
Você verificou o status de funcionamento do módulo MPM, os módulos que estão gerenciando o FastCGI e o processamento de código PHP.
Conclusão
Você otimizou sua pilha LAMP original, de forma que o número de conexões para criar novos processos Apache HTTP aumentou, o PHP-FPM irá lidar com o código PHP com maior eficiência, e o uso global de recursos melhorou.
Consulte a documentação do projeto Apache HTTP para obter mais informações sobre os diferentes módulos e projetos relacionados.