Come configurare Apache HTTP con MPM Event e PHP-FPM su FreeBSD 12.0

L’autore ha selezionato l’Open Internet/Free Speech 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 necessità. 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 applicazioni o librerie più vecchie.
  • 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 ulteriore 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 si miglioreranno le prestazioni dello stack FAMP cambiando il modulo multi-processing di default da pre-fork a event e utilizzando il process manager 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 FreeBSD 12.0 configurato seguendo questa guida.
  • Lo stack FAMP installato sul vostro server seguendo questo tutorial.
  • Accesso ad un utente con privilegi di root (o permesso usando sudo) al fine di apportare modifiche alla configurazione.

Step 1 – Cambiare il modulo Multi-Processing

Si inizierà cercando la direttiva pre-fork nel file httpd.conf. Questo è il principale file di configurazione per Apache HTTP in cui è possibile abilitare e disabilitare i moduli. Puoi modificare e impostare direttive come la porta di ascolto dove Apache HTTP servirà il contenuto o la posizione del contenuto da visualizzare in questo file.

Per fare queste modifiche, userai il programma nl, number line, con il flag -ba per contare e numerare le linee in modo che nulla sia sbagliato in una fase successiva. Combinato con grep questo comando prima conterà tutte le linee nel file specificato nel percorso, e una volta finito, cercherà la stringa di caratteri che stai cercando.

Esegui il seguente comando in modo che il programma nl processerà e numererà le linee in httpd.conf. Poi, grep elaborerà l’output cercando la data stringa di caratteri 'mod_mpm_prefork':

  • nl -ba /usr/local/etc/apache24/httpd.conf | grep 'mod_mpm_prefork'

Come output vedrai qualcosa di simile a:

Output
67 LoadModule mpm_prefork_module libexec/apache24/mod_mpm_prefork.so

Modifichiamo la linea 67 con il tuo editor di testo. In questo tutorial, userai vi, che è l’editor predefinito su FreeBSD:

  • sudo vi +67 /usr/local/etc/apache24/httpd.conf

Applica un simbolo # all’inizio della linea in modo che questa linea sia commentata, così:

/usr/local/etc/apache24/httpd.conf
...# LoadModule mpm_prefork_module libexec/apache24/mod_mpm_prefork.so...

Applicando il simbolo # hai disabilitato il modulo MPM pre-fork.

Ora troverete la direttiva evento nello stesso file httpd.conf.

  • nl -ba /usr/local/etc/apache24/httpd.conf | grep mpm_event

Vedrai un output simile al seguente:

Output
...66 #LoadModule mpm_event_module libexec/apache24/mod_mpm_event.so...

Ora rimuoverai il simbolo # nella linea 66 per abilitare l’evento MPM:

  • sudo vi +66 /usr/local/etc/apache24/httpd.conf

La direttiva ora sarà così:

/usr/local/etc/apache24/httpd.conf
...LoadModule mpm_event_module libexec/apache24/mod_mpm_event.so...

Ora che hai cambiato la configurazione dal pre-fork MPM all’evento, puoi rimuovere il pacchetto mod_php73 che collega il processore PHP ad Apache HTTP, poiché non è più necessario e interferirà se rimane sul sistema:

  • sudo pkg remove -y mod_php73

Assicurati che la configurazione sia corretta eseguendo il seguente comando di test:

  • sudo apachectl configtest

Se vedi Syntax OK nel tuo output, puoi riavviare il server Apache HTTP:

  • sudo apachectl restart

Nota: Se ci sono altre connessioni HTTP in esecuzione sul tuo server si raccomanda un riavvio grazioso invece di un riavvio regolare. Questo assicurerà che gli utenti non vengano spinti fuori, perdendo la loro connessione:

  • sudo apachectl graceful

Hai cambiato l’MPM da pre-fork a evento e rimosso il modulo mod_php73 di connessione PHP ad Apache HTTP. Nel prossimo passo installerai il modulo PHP-FPM e configurerai Apache HTTP in modo che possa comunicare con PHP più velocemente.

Passo 2 – Configurare Apache HTTP per usare il gestore di processi FastCGI

FreeBSD ha diverse versioni supportate di PHP che puoi installare tramite il gestore dei pacchetti. Su FreeBSD vengono compilati diversi binari delle varie versioni disponibili invece di usarne uno solo come la maggior parte delle distribuzioni GNU/Linux offrono nei loro repository di default. Per seguire le migliori pratiche userai la versione supportata, che puoi controllare alla pagina delle versioni supportate di PHP.

In questo passo aggiungerai PHP-FPM come servizio in esecuzione da avviare all’avvio. Configurerai anche Apache HTTP per lavorare con PHP aggiungendo una configurazione dedicata al modulo e abilitando alcuni altri moduli in httpd.conf.

Prima di tutto aggiungerai 'php_fpm_enable=YES' al file /etc/rc.conf in modo che il servizio PHP-FPM possa partire. Lo farai usando il comando sysrc:

  • sudo sysrc php_fpm_enable="YES"

Ora aggiungerai il modulo php-fpm nella directory del modulo Apache, così sarà configurato per essere usato da Apache HTTP. Crea il seguente file per farlo:

  • sudo vi /usr/local/etc/apache24/modules.d/030_php-fpm.conf

Aggiungi il seguente in 030_php-fpm.conf:

/usr/local/etc/apache24/modules.d/030_php-fpm.conf
<IfModule proxy_fcgi_module> <IfModule dir_module> DirectoryIndex index.php </IfModule> <FilesMatch "\.(php|phtml|inc)$"> SetHandler "proxy:fcgi://127.0.0.1:9000" </FilesMatch></IfModule>

Questo afferma che se il modulo 'proxy_fcgi' è abilitato così come il 'dir_module' allora qualsiasi file elaborato che corrisponde alle estensioni tra parentesi dovrebbe essere gestito dal gestore di processi FastCGI in esecuzione sulla macchina locale attraverso la porta 9000-come se la macchina locale fosse un server proxy. È qui che il modulo PHP-FPM e Apache HTTP si interconnettono. Per ottenere ciò, attiverai altri moduli durante questo passo.

Per abilitare il modulo proxy, dovrai prima cercarlo nel file httpd.conf:

  • nl -ba /usr/local/etc/apache24/httpd.conf | grep mod_proxy.so

Vedrai un output simile al seguente:

Output
...129 #LoadModule proxy_module libexec/apache24/mod_proxy.so...

Scommenterai la linea rimuovendo il simbolo #:

  • sudo vi +129 /usr/local/etc/apache24/httpd.conf

La linea apparirà come segue una volta modificata:

/usr/local/etc/apache24/httpd.conf
...LoadModule proxy_module libexec/apache24/mod_proxy.so...

Ora potete attivare il modulo FastCGI. Trova il modulo con il seguente comando:

  • nl -ba /usr/local/etc/apache24/httpd.conf | grep mod_proxy_fcgi.so

Vedrai qualcosa di simile al seguente:

Output
...133 #LoadModule proxy_fcgi_module libexec/apache24/mod_proxy_fcgi.so...

Ora decommenta la linea 133 come hai già fatto con gli altri moduli:

  • sudo vi +133 /usr/local/etc/apache24/httpd.conf

Lasci la linea come segue:

/usr/local/etc/apache24/httpd.conf
...LoadModule proxy_fcgi_module libexec/apache24/mod_proxy_fcgi.so...

Una volta fatto questo avvierai il servizio PHP-FPM:

  • sudo service php-fpm start

E riavvierai Apache in modo che carichi le ultime modifiche di configurazione che incorporano il modulo PHP:

  • sudo apachectl restart

Hai 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 vi /usr/local/www/apache24/data/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_server_IP_address/info.php.

La voce Server API sarà FPM/FastCGI.

PHP Screen the Server API entry FPM/FastCGI

Ricordati di cancellare il file info.php dopo questo controllo in modo che nessuna informazione sul server sia rivelata pubblicamente.

  • sudo rm /usr/local/www/apache24/data/info.php

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

Conclusione

Leave a Reply