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

Apache Php Fpm Featured

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 apache2

A questo punto puoi vedere che Apache effettivamente offre MPM event abilitato per default.

apachectl -V

Apache Php Fpm Check Mpm Debian

Installa PHP-FPM.

apt install php-fpm

Vedrai istruzioni su come abilitare l’elaboratore PHP in Apache.

Apache Php Fpm Enable Php Instructions

Abilita il protocollo FastCGI.

a2enmod proxy_fcgi

Abilita la configurazione predefinita di PHP-FPM per Apache.

a2enconf php7.0-fpm

Nota: 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 apache2

Installa il resto dei requisiti per la tua applicazione PHP. Ecco un esempio:

apt install mariadb-server php-mysql

Questo 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 httpd

A 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

Apache Php Fpm Check Mpm Centos

Per abilitare MPM event, devi modificare un file di configurazione.

sed -i '/mpm_prefork\.so$/s/^/#/' /etc/httpd/conf.modules.d/00-mpm.conf

Questo aggiungerà un segno # per commentare (disattivare) la linea LoadModule mpm_prefork_module modules/mod_mpm_prefork.so.

Apache Php Fpm Mpm Conffile On Centos

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.conf

Avvia Apache e abilitane l’avvio automatico all’avvio.

systemctl start httpd.service  
systemctl enable httpd.service

Controlla se Apache ora utilizza MPM event.

apachectl -V

Apache Php Fpm Mpm Event Enabled Status Centos

Installa PHP-FPM e il modulo FastCGI.

yum install php-fpm mod_fcgid

Crea “/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.service

Avvia PHP-FPM e abilitane l’avvio automatico all’avvio.

systemctl start php-fpm.service  
systemctl enable php-fpm.service

Conclusione

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.