Come configurare Apache e PHP per siti web ad alto traffico su server Linux

Quasi ogni tutorial su come installare lo stack LAMP (Linux, Apache, MySQL, PHP) raccomanderà di utilizzare il modulo Apache integrato per l’elaborazione degli script PHP. Ad esempio, su Ubuntu attiveresti questo quando utilizzi un comando come sudo apt install libapache2-mod-php per installare un pacchetto. Questo costringerebbe Apache a utilizzare mpm_prefork. Ogni volta che un visitatore accede al tuo sito web, verrà avviato un nuovo processo per gestire quella connessione. Questo funziona bene quando il traffico è basso.
Ma diventa un grande problema se ricevi un improvviso afflusso di traffico. Ad esempio, un post su Reddit potrebbe includere il tuo sito web, e se il post diventa popolare, potresti ricevere migliaia di visitatori in pochi minuti.
Nel miglior scenario possibile, se Apache riesce a gestire l’aumento di traffico, alcuni sfortunati visitatori potrebbero dover aspettare forse trenta o sessanta secondi finché la pagina non viene caricata, il che è assurdo nel mondo di oggi. Nel peggiore dei casi, il server inizierà a rallentare notevolmente e alcune connessioni verranno semplicemente interrotte a causa della mancanza di risorse. In questo caso i visitatori vedranno un errore nei loro browser.
Non è uno scenario positivo in entrambi i casi, poiché hai potenzialmente perso l’attenzione di centinaia o migliaia di lettori, clienti o fan interessati.
Sfortunatamente, PHP è un grande consumatore di risorse in ogni caso. Ma con mpm_event, Apache può gestire gli improvvisi aumenti di traffico in modo molto più efficiente. Si raccomanda, tuttavia, che il tuo server abbia almeno 2 GB di RAM e 2 core CPU, reali o virtuali, e ancora di più se ti aspetti di avere picchi di traffico intensi, come più di dieci visitatori al secondo. Se stai utilizzando un server privato virtuale, aggiungi più core CPU virtuali alla tua situazione e spazio di archiviazione SSD. La RAM è secondaria.
Leggi anche: Nginx vs Apache: Qual è il migliore per te?
Come utilizzare Apache MPM Event e PHP-FPM su distribuzioni basate su Debian
Su Debian, Ubuntu o altre distro di questa famiglia, evita semplicemente di installare il pacchetto “libapache2-mod-php”. Quando installi Apache, utilizza MPM event di default. Ma dopo aver installato il pacchetto menzionato, uno script disabilita MPM event e abilita MPM prefork. Il modulo PHP di Apache può funzionare (in sicurezza) solo con mpm_prefork. Ovviamente, senza “libapache2-mod-php”, non hai un elaboratore per i file PHP. Quindi utilizzerai PHP-FPM invece del modulo PHP incluso in Apache. Ecco come installeresti uno stack LAMP su un server fresco. Puoi adattare i passaggi in base ai requisiti della tua applicazione web.
Per prima cosa, accedi come root. Quindi, installa Apache.
apt update && apt install apache2A questo punto puoi vedere che Apache effettivamente offre MPM event abilitato per default.
apachectl -V
Installa PHP-FPM.
apt install php-fpmVedrai istruzioni su come abilitare l’elaboratore PHP in Apache.

Abilita il protocollo FastCGI.
a2enmod proxy_fcgiAbilita la configurazione predefinita di PHP-FPM per Apache.
a2enconf php7.0-fpmNota: nelle future versioni di Debian/Ubuntu, questo comando potrebbe cambiare in qualcos’altro, ad esempio a2enconf php7.6-fpm, perché PHP-FPM sarebbe una versione diversa.
Riavvia Apache.
systemctl restart apache2Installa il resto dei requisiti per la tua applicazione PHP. Ecco un esempio:
apt install mariadb-server php-mysqlQuesto installerà un server di database e il modulo PHP MySQL in modo che la tua applicazione PHP possa connettersi a un database.
Leggi anche: Come proteggere contro DDoS con Mod_evasive su server Apache
Come utilizzare Apache MPM Event e PHP-FPM su distribuzioni basate su RedHat
L’altra scelta popolare di distribuzione del server è RedHat, o CentOS. Nello stesso modo di sopra, verrà offerto un esempio di una installazione pulita di Apache con MPM event abilitato e PHP-FPM.
Accedi come root e installa Apache.
yum install httpdA differenza delle distribuzioni basate su Debian, qui vedrai che Apache utilizza MPM prefork di default, almeno sull’ultima versione di CentOS 7 disponibile al momento della scrittura.
apachectl -V
Per abilitare MPM event, devi modificare un file di configurazione.
sed -i '/mpm_prefork\.so$/s/^/#/' /etc/httpd/conf.modules.d/00-mpm.confQuesto aggiungerà un segno # per commentare (disattivare) la linea LoadModule mpm_prefork_module modules/mod_mpm_prefork.so.

Ora uncommenta (attiva) la linea #LoadModule mpm_event_module modules/mod_mpm_event.so rimuovendo il segno # precedente con il comando successivo.
sed -i '/mpm_event\.so$/s/^#//'/etc/httpd/conf.modules.d/00-mpm.confAvvia Apache e abilitane l’avvio automatico all’avvio.
systemctl start httpd.service
systemctl enable httpd.serviceControlla se Apache ora utilizza MPM event.
apachectl -V
Installa PHP-FPM e il modulo FastCGI.
yum install php-fpm mod_fcgidCrea “/etc/httpd/conf.d/php.conf” per istruire Apache su come elaborare i file PHP. Copia TUTTO il contenuto qui sotto, e incollalo tutto in una volta nel terminal, poi premi INVIO.
cat</etc/httpd/conf.d/php.conf
# Redirect to local php-fpm if mod_php is not available
# Enable http authorization headers
SetEnvIfNoCase ^Authorization$ "(.+)" HTTP_AUTHORIZATION=$1
#SetHandler "proxy:unix:/run/php/php7.0-fpm.sock|fcgi://localhost"
SetHandler "proxy:fcgi://127.0.0.1:9000"
# Deny access to raw php sources by default
# To re-enable it's recommended to enable access to the files
# only in specific virtual host or directory
Require all denied
# Deny access to files without filename (e.g. '.php')
Require all denied
PASTE Il merito di questa grande configurazione va a Debian. Altre fonti raccomandano un semplice file di configurazione come:
SetHandler "proxy:fcgi://127.0.0.1:9000"
Ma questo è vulnerabile ad alcuni attacchi, e se certi servizi falliscono, potresti esporre i file PHP al pubblico, esponendo potenzialmente password, codice e dati sensibili.
Riavvia Apache.
systemctl restart httpd.serviceAvvia PHP-FPM e abilitane l’avvio automatico all’avvio.
systemctl start php-fpm.service
systemctl enable php-fpm.serviceConclusione
Ora hai un server Apache che scala molto meglio con il traffico. Tuttavia, ricorda che stai utilizzando le impostazioni predefinite, come quelle “migliori” per la maggior parte delle persone. Se vuoi davvero ottenere il massimo dal tuo server HTTP, devi leggere riguardo a varie variabili che puoi ottimizzare. I valori corretti per queste sono fortemente dipendenti dalle risorse del tuo server, dal traffico previsto e dall’applicazione PHP.