Como Configurar o Apache HTTP com evento MPM e PHP-FPM no Ubuntu 18.04

O autor selecionou o COVID-19 Relief Fund para receber uma doação como parte do programa Write for DOnations.

Introduction

O servidor web Apache HTTP evoluiu ao longo 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 servir uma requisição de protocolo http. Isso envolve abrir um socket, processar a requisição, manter a conexão aberta por um certo período, lidar com novos eventos que ocorrem através dessa conexão, e retornar o conteúdo produzido por um programa feito em uma determinada linguagem (como PHP, Perl, ou Python). Estas tarefas são executadas e controladas por um Módulo Multi-Processamento (MPM).

Apache HTTP vem com três diferentes MPM:

  • Pre-fork: Um novo processo é criado para cada conexão de entrada que chega ao servidor. Cada processo é isolado dos outros, portanto nenhuma memória é compartilhada entre eles, mesmo que eles estejam executando chamadas idênticas em algum ponto de sua execução. Esta é uma forma segura de executar aplicações ligadas a bibliotecas que não suportam aplicações ou bibliotecas threading-typically mais antigas.
  • Worker: Um processo pai é responsável por lançar um pool de processos filhos, alguns dos quais estão escutando novas conexões de entrada, e outros estão servindo o conteúdo solicitado. Cada processo é encadeado (uma única linha pode lidar com uma conexão), de modo que um processo pode lidar com várias solicitações ao mesmo tempo. Este método de tratamento de conexões incentiva uma melhor utilização dos recursos, mantendo a estabilidade. Isto é um resultado do conjunto de processos disponíveis, que muitas vezes tem threads livres disponíveis prontos para servir imediatamente novas conexões.
  • Evento: Com base no trabalhador, este MPM vai um passo além, otimizando a forma como o processo pai agenda tarefas para os processos filhos e os threads associados a eles. Uma conexão permanece aberta por padrão por 5 segundos e fecha se nenhum novo evento acontecer; este é o valor padrão da diretiva keep-alive, que mantém a thread associada a ela. O MPM de eventos permite que o processo gerencie threads de forma que algumas threads fiquem livres para lidar com novas conexões de entrada enquanto outras são mantidas vinculadas às conexões ao vivo. Permitir a redistribuição de tarefas atribuídas a threads fará com que a utilização de recursos e o desempenho sejam melhores.

O módulo de Eventos MPM é um módulo rápido de multi-processamento disponível no servidor web Apache HTTP.

PHP-FPM é o Gerenciador de Processos FastCGI para PHP. O protocolo FastCGI é baseado no Common Gateway Interface (CGI), um protocolo que fica entre aplicações e servidores web como o Apache HTTP. Isto permite aos desenvolvedores escrever aplicações separadamente do comportamento dos servidores web. Os programas executam seus processos de forma independente e passam seu produto para o servidor web através deste protocolo. Cada nova conexão que precisa de processamento por uma aplicação criará um novo processo.

Ao combinar o evento MPM no Apache HTTP com o PHP FastCGI Process Manager (PHP-FPM) um website pode carregar mais rápido e lidar com mais conexões simultâneas enquanto usa menos recursos.

Neste tutorial você irá melhorar a performance da pilha LAMP mudando o módulo padrão de multi-processamento de pré-fazer para evento e usando o gerenciador de processos PHP-FPM para lidar com o código PHP ao invés do clássico mod_php no Apache HTTP.

Prerequisites

Antes de começar este guia você precisará do seguinte:

  • Um servidor Ubuntu 18.04 configurado seguindo o guia inicial de configuração do servidor Ubuntu 18.04, incluindo um usuário sudo não-root e um firewall.
  • A pilha LAMP instalada no seu servidor seguindo How To Install Linux, Apache, MySQL, PHP (pilha LAMP) no Ubuntu 18.04.

Passo 1 – Alterando o Multi-Processing Module

Ubuntu herda scripts para habilitar ou desabilitar módulos HTTP Apache da sua distribuição pai, Debian. Você usará este conjunto de ferramentas neste passo para desabilitar o módulo Pre-fork e habilitar o módulo Event.

Neste passo você irá parar o Apache HTTP, desabilitar o módulo PHP 7.2 vinculado ao módulo Pre-fork, e então desabilitar o Pre-fork para habilitar imediatamente o módulo Event.

Primeiro você irá parar o serviço HTTP do Apache:

  • sudo systemctl stop apache2

Agora você pode desabilitar o módulo PHP 7.2, que está relacionado ao módulo Pre-fork:

  • sudo a2dismod php7.2

Então desabilite o módulo MPM da Pre-fork:

  • sudo a2dismod mpm_prefork

Ative agora o módulo MPM de evento:

  • sudo a2enmod mpm_event

Você trocou o MPM de pré-fork para evento e removeu a conexão do módulo PHP 7.2 entre PHP e Apache HTTP. No próximo passo você vai instalar o módulo php-fpm, assim como as bibliotecas e módulos proxy relacionados. Você irá configurar o Apache HTTP para que ele possa se comunicar com o PHP também.

Passo 2 – Configurando o Apache HTTP para usar o Gerenciador de Processos FastCGI

Neste estágio você trocou o modo como o Apache HTTP processa conexões passando do MPM da pré-fork para o Event. Entretanto ao longo do caminho você desabilitou o módulo PHP que conectou o Apache HTTP com qualquer programa rodando no PHP.

Neste passo você instalará o processador PHP-FPM para que o Apache HTTP seja novamente capaz de processar programas PHP. E você também instalará as bibliotecas de dependências e habilitará os módulos para que ambos possam cooperar suavemente e mais rápido do que antes.

Primeira instalação php-fpm. O seguinte comando instalará o pacote PHP-FPM e habilitará automaticamente o serviço php7.2-fpm integrado ao systemd, assim o serviço é iniciado no momento do boot:

  • sudo apt install php-fpm

Para se comunicar, o Apache HTTP e o PHP precisam de uma biblioteca habilitando essa capacidade. Agora você vai instalar libapache2-mod-fcgid, que é capaz de servir como uma interface entre programas com servidores web, e é específica para o Apache HTTP. Esta comunicação acontecerá através de um socket UNIX.

Instale esta biblioteca:

  • sudo apt install libapache2-mod-fcgid

Você instalou php-fpm e o libapache2-mod-fcgid, mas nenhum deles está habilitado ainda.

Ative primeiro o módulo php-fpm com o seguinte comando:

  • sudo a2enconf php7.2-fpm

Ative segundo o Apache HTTP proxy módulo:

  • sudo a2enmod proxy

Ative terceiro o módulo FastCGI proxy módulo no Apache HTTP:

  • sudo a2enmod proxy_fcgi

Nota: Você pode ler a configuração desta interação entre programas PHP e o Apache HTTP através de um socket UNIX com o seguinte:

  • cat /etc/apache2/conf-enabled/php7.2-fpm.conf

Tudo está agora no lugar para que você possa iniciar o Apache HTTP. Você fará uma verificação de configuração primeiro:

  • sudo apachectl configtest
Output
Syntax OK

Depois você pode proceder para reiniciar o Apache HTTP, já que ele foi automaticamente iniciado 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 o protocolo FastCGI funcionar, e iniciou os serviços correspondentes.

Agora que o Apache tem o módulo MPM do evento habilitado e o PHP-FPM está presente e rodando, é hora de verificar se tudo está funcionando como pretendido.

Passo 3 – Verificando Sua Configuração

Para verificar se as mudanças de configuração foram aplicadas, você irá executar alguns testes. O primeiro irá verificar qual módulo multi-processamento o Apache HTTP está usando. O segundo irá verificar se o PHP está usando o gerenciador FPM.

Cheque 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 FastCGI:

  • sudo apachectl -M | grep 'proxy'

A saída irá mostrar:

Output
proxy_module (shared)proxy_fcgi_module (shared)

Se quiser ver a lista completa dos módulos, pode remover a segunda parte do comando depois de -M.

Agora é hora de verificar se o PHP está usando o Gerenciador de Processos FastCGI. Para fazer isso você irá escrever um pequeno script PHP que irá mostrar todas as informações relacionadas ao PHP.

Executar o seguinte comando para escrever um arquivo com o seguinte nome:

  • sudo nano /var/www/your_domain/info.php

Adicionar o seguinte conteúdo no arquivo info.php> arquivo:

info.php
<?php phpinfo(); ?>

Agora visite a URL do seu servidor e anexe info.php no final assim: http://your_domain/info.php.

A entrada da API do servidor será FPM/FastCGI.

PHP Tela a entrada da API do servidor FPM/FastCGI

Apagar 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 estado de funcionamento do módulo MPM, os módulos que manipulam o FastCGI e o manuseio do código PHP.

Conclusão