Come configurare Apache HTTP con MPM Event e PHP-FPM su Ubuntu 18.04

L’autore ha selezionato il COVID-19 Relief Fund per ricevere una donazione come parte del programma Write for DOnations.

Introduzione

Il server web Apache HTTP si è evoluto negli anni per lavorare in diversi ambienti e risolvere diverse esigenze. Un problema importante che Apache HTTP deve risolvere, come ogni server web, è come gestire diversi processi per servire una richiesta del protocollo http. Questo comporta l’apertura di un socket, l’elaborazione della richiesta, il mantenimento della connessione aperta per un certo periodo, la gestione di nuovi eventi che si verificano attraverso quella connessione, e la restituzione del contenuto prodotto da un programma fatto in un linguaggio particolare (come PHP, Perl o Python). Questi compiti sono eseguiti e controllati da un modulo multiprocesso (MPM).

Apache HTTP è dotato di tre diversi MPM:

  • Pre-fork: Un nuovo processo viene creato per ogni connessione in entrata che raggiunge il server. Ogni processo è isolato dagli altri, quindi nessuna memoria è condivisa tra loro, anche se stanno eseguendo chiamate identiche ad un certo punto della loro esecuzione. Questo è un modo sicuro per eseguire applicazioni collegate a librerie che non supportano il threading – tipicamente vecchie applicazioni o librerie.
  • Lavoratore: Un processo padre è responsabile del lancio di un pool di processi figli, alcuni dei quali sono in ascolto di nuove connessioni in entrata e altri servono il contenuto richiesto. Ogni processo è threaded (un singolo thread può gestire una connessione) così un processo può gestire diverse richieste contemporaneamente. Questo metodo di trattare le connessioni incoraggia un migliore utilizzo delle risorse, pur mantenendo la stabilità. Questo è il risultato del pool di processi disponibili, che spesso ha thread liberi pronti a servire immediatamente nuove connessioni.
  • Evento: Basato su worker, questo MPM fa un passo avanti ottimizzando il modo in cui il processo genitore programma i compiti ai processi figli e i thread associati a questi. Una connessione rimane aperta per 5 secondi per impostazione predefinita e si chiude se non si verifica alcun nuovo evento; questo è il valore predefinito della direttiva keep-alive, che mantiene il thread associato ad essa. L’Event MPM permette al processo di gestire i thread in modo che alcuni thread siano liberi di gestire nuove connessioni in entrata, mentre altri sono tenuti legati alle connessioni attive. Consentire la ridistribuzione dei compiti assegnati ai thread migliorerà l’utilizzo delle risorse e le prestazioni.

Il modulo Event MPM è un modulo di multiprocesso veloce disponibile sul server web Apache HTTP.

PHP-FPM è il FastCGI Process Manager per PHP. Il protocollo FastCGI è basato sulla Common Gateway Interface (CGI), un protocollo che si trova tra le applicazioni e i server web come Apache HTTP. Questo permette agli sviluppatori di scrivere applicazioni separatamente dal comportamento dei server web. I programmi eseguono i loro processi in modo indipendente e passano il loro prodotto al server web attraverso questo protocollo. Ogni nuova connessione che necessita di essere elaborata da un’applicazione creerà un nuovo processo.

Combinando l’evento MPM in Apache HTTP con il PHP FastCGI Process Manager (PHP-FPM) un sito web può caricarsi più velocemente e gestire più connessioni simultanee utilizzando meno risorse.

In questo tutorial migliorerai le prestazioni dello stack LAMP cambiando il modulo multi-processing predefinito da pre-fork a event e utilizzando il gestore di processi PHP-FPM per gestire il codice PHP invece del classico mod_php in Apache HTTP.

Prequisiti

Prima di iniziare questa guida avrete bisogno di quanto segue:

  • Un server Ubuntu 18.04 configurato seguendo la guida alla configurazione iniziale del server Ubuntu 18.04, incluso un utente sudo non root e un firewall.
  • Lo stack LAMP installato sul tuo server seguendo Come installare Linux, Apache, MySQL, PHP (stack LAMP) su Ubuntu 18.04.

Passo 1 – Cambiare il modulo Multi-Processing

Ubuntu eredita gli script per abilitare o disabilitare i moduli HTTP Apache dalla sua distribuzione madre, Debian. Userai questo set di strumenti in questo passo per disabilitare il modulo Pre-fork e abilitare il modulo Event.

In questo passo fermerai Apache HTTP, disabiliterai il modulo PHP 7.2 collegato al modulo Pre-fork, e poi disabiliterai Pre-fork per abilitare immediatamente il modulo Event.

Prima fermerai il servizio Apache HTTP:

  • sudo systemctl stop apache2

Ora puoi disabilitare il modulo PHP 7.2, che è legato al modulo Pre-fork:

  • sudo a2dismod php7.2

Poi disabilita il modulo Pre-fork MPM:

  • sudo a2dismod mpm_prefork

Abilita ora il modulo Event MPM:

  • sudo a2enmod mpm_event

Hai cambiato il MPM da pre-fork a event e rimosso la connessione del modulo PHP 7.2 tra PHP e Apache HTTP. Nel prossimo passo installerai il modulo php-fpm, così come le relative librerie e i moduli proxy. Configurerai Apache HTTP in modo che possa comunicare anche con PHP.

Passo 2 – Configurare Apache HTTP per usare il FastCGI Process Manager

A questo punto hai cambiato il modo in cui Apache HTTP processa le connessioni passando da Pre-fork MPM a Event. Tuttavia lungo la strada hai disabilitato il modulo PHP che collegava Apache HTTP con qualsiasi programma in esecuzione su PHP.

In questo passo installerai il processore PHP-FPM in modo che Apache HTTP sia di nuovo in grado di elaborare programmi PHP. E installerai anche le librerie di dipendenza e abiliterai i moduli in modo che entrambi possano cooperare senza problemi e più velocemente di prima.

Prima installa php-fpm. Il seguente comando installerà il pacchetto PHP-FPM e abiliterà automaticamente il servizio php7.2-fpm integrato con systemd, in modo che il servizio venga avviato all’avvio:

  • sudo apt install php-fpm

Per comunicare, Apache HTTP e PHP hanno bisogno di una libreria che abiliti tale capacità. Ora installerete libapache2-mod-fcgid, che è in grado di servire da interfaccia tra i programmi con i server web, ed è specifica per Apache HTTP. Questa comunicazione avverrà attraverso un socket UNIX.

Installa questa libreria:

  • sudo apt install libapache2-mod-fcgid

Hai installato php-fpm e la libapache2-mod-fcgid, ma nessuno dei due è ancora abilitato.

Prima abilita il modulo php-fpm con il seguente comando:

  • sudo a2enconf php7.2-fpm

Secondo abilita il modulo Apache HTTP proxy:

  • sudo a2enmod proxy

Terzo abilita il modulo FastCGI proxy in Apache HTTP:

  • sudo a2enmod proxy_fcgi

Nota: Puoi leggere la configurazione di questa interazione tra i programmi PHP e Apache HTTP attraverso un socket UNIX con il seguente:

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

Tutto è ora a posto, quindi puoi avviare Apache HTTP. Farete prima un controllo di configurazione:

  • sudo apachectl configtest
Output
Syntax OK

Dopo di che potete procedere a riavviare Apache HTTP, poiché è stato avviato automaticamente quando è stata installata la libreria FastCGI libapache2-mod-fcgid:

  • sudo systemctl restart apache2

Avete installato il modulo php-fpm, configurato Apache HTTP per lavorare con esso, abilitato i moduli necessari al funzionamento del protocollo FastCGI e avviato i servizi corrispondenti.

Ora che Apache ha il modulo Event MPM abilitato e PHP-FPM è presente e funzionante, è il momento di controllare che tutto funzioni come previsto.

Passo 3 – Controllare la tua configurazione

Per controllare che le modifiche alla configurazione siano state applicate, esegui alcuni test. Il primo verificherà quale modulo multi-processing sta usando Apache HTTP. Il secondo verificherà che PHP stia usando il gestore FPM.

Controlla il server Apache HTTP eseguendo il seguente comando:

  • sudo apachectl -M | grep 'mpm'

Il tuo output sarà il seguente:

Output
mpm_event_module (shared)

Puoi ripetere lo stesso per il modulo proxy e FastCGI:

  • sudo apachectl -M | grep 'proxy'

L’output mostrerà:

Output
proxy_module (shared)proxy_fcgi_module (shared)

Se volete vedere l’intera lista dei moduli, potete rimuovere la seconda parte del comando dopo -M.

Ora è il momento di controllare se PHP sta usando il FastCGI Process Manager. Per farlo scriverai un piccolo script PHP che ti mostrerà tutte le informazioni relative a PHP.

Esegui il seguente comando per scrivere un file chiamato come segue:

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

Aggiungi il seguente contenuto nel file info.php:

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

Ora visita l’URL del tuo server e aggiungi info.php alla fine così: http://your_domain/info.php.

La voce API del server sarà FPM/FastCGI.

PHP Screen the Server API entry FPM/FastCGI

Cancella il file info.php dopo questo controllo in modo che nessuna informazione sul server sia rivelata pubblicamente:

  • sudo rm /var/www/yourdomain.com/info.php

Hai controllato lo stato di funzionamento del modulo MPM, i moduli che gestiscono FastCGI e la gestione del codice PHP.

Conclusione