Tutorial

Como configurar o Apache HTTP com MPM Event e PHP-FPM no Ubuntu 18.04

ApacheLAMP StackUbuntu 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:

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
Output
Syntax 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:

Output
mpm_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á:

Output
proxy_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:

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

PHP Screen the Server API entry 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.

Creative Commons License