Questa procedura è stata pubblicata inizialmente quando Rocky Linux 8.x era l'unica versione. Questa procedura deve essere testata e riscritta per Rocky Linux 9.x.
PHP (PHP Hypertext Preprocessor) è un linguaggio di scripting sorgente, appositamente progettato per lo sviluppo di applicazioni web. Nel 2021, PHP rappresentava poco meno dell'80% delle pagine web generate nel mondo. PHP è open-source ed è il nucleo dei più famosi CMS (WordPress, Drupal, Joomla!, Magento, ...).
PHP-FPM (FastCGI Process Manager) è integrato nel PHP dalla sua versione 5.3.3. La versione FastCGI di PHP offre ulteriori funzionalità.
CGI (Common Gateway Interface) e FastCGI permettono la comunicazione tra il server web (Apache, Nginx, ...) e un linguaggio di sviluppo (PHP, Python, Java):
Nel caso di CGI, ogni richiesta porta alla creazione di un nuovo processo, che è meno efficiente in termini di prestazioni.
FastCGI si basa su un certo numero di processi per il trattamento delle sue richieste client.
PHP-FPM, oltre a prestazioni migliori, porta con sé:
La possibilità di una migliore separazione delle applicazioni: lancio di processi con uid/gid diversi, con file php.ini personalizzati,
La gestione delle statistiche,
Gestione del registro,
Gestione dinamica dei processi e riavvio senza interruzione del servizio ('graceful').
Nota
Poiché Apache ha un modulo PHP, php-fpm è più comunemente usato su un server Nginx.
Rocky Linux, come il suo upstream, offre molte versioni del linguaggio. Alcuni di essi hanno raggiunto la fine del loro ciclo di vita, ma vengono mantenuti per continuare a ospitare applicazioni storiche che non sono ancora compatibili con le nuove versioni di PHP. Fare riferimento alla pagina versioni supportate del sito web php.net per scegliere una versione supportata.
Per ottenere un elenco delle versioni disponibili, basta inserire il seguente comando:
Per prima cosa, vediamo come installare e utilizzare PHP in modalità CGI. Possiamo farlo funzionare solo con il server web Apache e il suo modulo mod_php. Vedremo più tardi in questo documento, nella parte FastCGI (php-fpm) come integrare PHP in Nginx (ma anche in Apache).
Il vhost predefinito dovrebbe funzionare subito. PHP fornisce una funzione phpinfo() che genera una tabella riassuntiva della sua configurazione. È molto utile per testare il buon funzionamento di PHP. Tuttavia, fate attenzione a non lasciare tali file di prova sui vostri server. Rappresentano un enorme rischio per la sicurezza della vostra infrastruttura.
Creare il file /var/www/html/info.php (/var/www/html è la cartella vhost della configurazione predefinita di apache):
<?php
phpinfo();
?>
Utilizzare un browser web per verificare il corretto funzionamento del server accedendo alla pagina http://your-server-ip/info.php.
Nome del pool di processi. Il file di configurazione può comprendere diversi pool di processi (il nome del pool tra parentesi inizia una nuova sezione).
listen
Definisce l'interfaccia di ascolto o il socket unix utilizzato.
Configurazione del modo di accedere ai processi di php-fpm¶
Configurazione del modo di accedere ai processi di php-fpm.
Tramite un'interfaccia inet come:
listen = 127.0.0.1:9000.
O tramite un socket Unix:
listen = /run/php-fpm/www.sock.
Nota
Utilizzando un socket quando il server web e il server PHP si trovano sulla stessa macchina, si elimina il livello TCP/IP e si ottimizzano le prestazioni.
Quando si opera tramite un'interfaccia, è necessario configurare listen.owner, listen.group, listen.mode per specificare il proprietario, il gruppo di proprietari e i diritti del socket Unix. Attenzione: entrambi i server (web e PHP) devono avere i diritti di accesso al socket.
Quando si lavora tramite un socket, è necessario configurare listen.allowed_clients per limitare l'accesso al server PHP a determinati indirizzi IP.
I processi di PHP-FPM possono essere gestiti staticamente o dinamicamente.
In modalità statica, il numero di processi figli è impostato dal valore di pm.max_children;
pm=static
pm.max_children=10
Questa configurazione avvierà 10 processi.
In modalità dinamica, PHP-FPM lancerà al massimo il numero di processi specificato dal valore di pm.max_children, iniziando a lanciare un numero di processi corrispondente a pm.start_servers, e mantenendo almeno il valore di pm.min_spare_servers di processi inattivi e al massimo pm.max_spare_servers di processi inattivi.
PHP-FPM creerà un nuovo processo per sostituire quello che ha elaborato un numero di richieste equivalente a pm.max_requests.
Per impostazione predefinita, pm.max_requests è impostato a 0, il che significa che i processi non vengono mai riciclati. L'uso dell'opzione pm.max_requests può essere interessante per applicazioni con problemi di memoria.
C'è una terza modalità di funzionamento, la modalità ondemand. Questa modalità avvia un processo solo quando riceve una richiesta. Non è una modalità ottimale per i siti con forti pressioni e deve essere riservata a esigenze specifiche (siti con richieste molto deboli, backend di gestione, ecc.).
Nota
La configurazione della modalità operativa di PHP-FPM è essenziale per garantire un funzionamento ottimale del server web.
La direttiva slowlog specifica il file che riceve la registrazione delle richieste troppo lunghe (cioè, il cui tempo supera il valore della direttiva request_slowlog_timeout).
La posizione predefinita del file generato è /var/log/php-fpm/www-slow.log.
La configurazione di apache per utilizzare un pool PHP è abbastanza semplice. È sufficiente usare i moduli proxy con una direttiva ProxyPassMatch, per esempio:
È essenziale ottimizzare il numero di richieste che potranno essere servite e analizzare la memoria utilizzata dagli script PHP, per ottimizzare la quantità massima di thread lanciati.
Prima di tutto, dobbiamo conoscere la quantità media di memoria utilizzata da un processo PHP, con il comando:
whiletrue;dops--no-headers-o"rss,cmd"-Cphp-fpm|grep"pool www"|awk'{ sum+=$1 } END { printf ("%d%s\n", sum/NR/1024,"Mb") }'>>avg_php_proc;sleep60;done
Dopo un po' di tempo, questo dovrebbe darci un'idea abbastanza precisa dell'occupazione media di memoria di un processo PHP su questo server.
Per il resto di questo documento, diciamo che il risultato è un'impronta di memoria di 120 Mb per processo a pieno carico.
Su un server con 8 Gb di RAM, mantenendo 1 Gb per il sistema e 1 Gb per la OPCache (si veda il resto di questo documento), rimangono 6 Gb per elaborare le richieste PHP dei client.
Si può facilmente concludere che questo server può accettare al massimo 50 thread((6*1024) / 120).
Una buona configurazione di php-fpm specifica per questo caso d'uso sarebbe:
L'opcache (Optimizer Plus Cache) è il primo livello di cache su cui possiamo intervenire.
Mantiene gli script PHP compilati in memoria, il che ha un forte impatto sull'esecuzione delle pagine web (elimina la lettura su disco degli script + il tempo di compilazione).
Per configurarla, dobbiamo lavorare su:
La dimensione della memoria dedicata alla opcache in base alla percentuale di successo, configurandola in modo corretto
il numero di script PHP da memorizzare nella cache (numero di chiavi + numero massimo di script)
il numero di stringhe da mettere in cache
Per installarla:
sudodnfinstallphp-opcache
Per configurarla, modificare il file di configurazione /etc/php.d/10-opcache.ini:
opcache.memory_consumption corrisponde alla quantità di memoria necessaria per l'opcache (da aumentare fino a ottenere un corretto rapporto di successo).
opcache.interned_strings_buffer la quantità di stringhe da mettere in cache.
opcache.max_accelerated_files è prossimo al risultato del comando find ./ -iname "*.php"|wc -l.
Si può fare riferimento a una pagina info.php (compresa la funzione phpinfo();) per configurare l'opcache (vedi per esempio i valori di Cached scripts e Cached strings).
Nota
A ogni nuova distribuzione di nuovo codice, sarà necessario svuotare la opcache (ad esempio riavviando il processo php-fpm).
Nota
Non sottovalutate il guadagno di velocità che si può ottenere impostando e configurando correttamente l'opcache.