A tutta velocita’ con PHP-FPM

PHP-FPM Very Fast

Come sa bene chiunque si occupi di creare e gestire un servizio Web moderno, il primo aspetto che viene ricercato e di cui si chiede la massima affidabilita’, e’ la velocita’ di risposta, cosi da garantire la presenza online delle imprese supportando il lavoro quotidiano delle Web Agency.

Nonostante oggi giorno ci siano nuovi linguaggi di sviluppo e di scripting il PHP rimane comunque ancora uno dei piu’ utilizzati e, grazie alle nuove funzionalita’ del PHP-FPM, questo linguaggio tornera’ sicuramente ad avere un ruolo di rilievo.

Ma, facciamo un piccolissimo passo indietro per rivedere come sono state gestite fino a ieri tutte le richieste php fatte dagli utenti ai vostri siti.

La maggior parte degli amministratori di siti sa che il PHP può essere incorporato nell’ HTML e che funziona con i principali web server. Tuttavia, l’aspetto meno conosciuto è la modalità con cui può essere eseguito il PHP sul web server, e questo può avvenire in diversi modi.

Aggiungiamo nell’equazione anche l’acronimo LAMP che, per chi non lo conoscesse, indica una piattaforma software per lo sviluppo di applicazioni web e sta per :

  • Linux (il sistema operativo)
  • Apache (il server web)
  • MySQL o MariaDB (il database management system)
  • PHP (il linguaggio di programmazione)

Come stavamo dicendo, fino a ieri  la modalità con cui si eseguivano le richieste e i processi di php sulla piattaforma LAMP era il PHP FastCGI.

Si tratta di un protocollo generico utilizzato per l’interfacciamento con un server web. Nello specifico è una variante della precedente Common Gateway Interface (CGI) che ha come obiettivo quello di ridurre il sovraccarico associato all’ interfacciamento tra web server e programmi CGI, consentendo ad un server di gestire più richieste contemporaneamente.

Ma con FastCGI è possibile configurare più versioni di PHP, cosa particolarmente utile quando si hanno vecchi siti web creati, ad esempio, in PHP 5.1 che non sono compatibili con l’ultima versione, inoltre, con FastCGI è possibile supportare diversi utenti ognuno con le proprie istanze di PHP. Questa funzione è particolarmente importante per migliorare la sicurezza in un ambiente condiviso, in cui è possibile avere utenti diversi che gestiscono ciascuno i propri siti web.

Andiamo ancora avanti, quindi grazie al protocollo PHP FastCGI il webserver genera un’ unico processo in fase di inizializzazione che, al termine della fase di start-up, si mette in attesa. Ogni volta che arriva una nuova richiesta in ingresso, il webserver apre una connessione con il processo fast-cgi (in attesa) che a sua volta genera l’output sulla connessione con il client, trasferitagli dal server. Il vantaggio principale di questo protocollo è la creazione dei processi solo in fase di inizializzazione, ottimizzando così il numero dei processi php.

Bene, quindi cerchiamo di capire adesso che cosa cambia con l’introduzione di PHP-FPM ?

PHP-FPM è una modalità più recente (nato nel 2004 come patch di PHP) di utilizzare PHP con un server web, ed è un’alternativa al precedente PHP FastCGI con l’implementazione di alcune funzionalità aggiuntive molto utili, in particolare ai siti che gestiscono quotidianamente sempre più traffico (dai siti vetrina agli e-commerce). Per queste tipologie di siti web è sempre piu’ necessario avere a disposizione strumenti sempre più performanti, proprio come il PHP-FPM.

Fino ad oggi una delle grosse mancanze di FastCGI è stata l’impossibilità di avere un numero di CHILD (processi) PHP che cambi in modo dinamico a seconda delle richieste effettive.

Nel suo insieme, il funzionamento è molto simile al FastCGI e si basa dunque sull’ esecuzione ottimizzata dei processi php che vengono creati solo in fase di inizializzazione e rimangono in attesa di una nuova richiesta. La grossa differenza sta nel fatto che è lo stesso PHP-FPM ad eseguire il processo e non più il web server.

Il “Process Manager” è uno script che gestisce direttamente i processi PHP, nella pratica attende e riceve istruzioni dal server web ed esegue gli script PHP richiesti, permettendo cosi ad un sito web di gestire carichi intensi. Il PHP-FPM mantiene dei “pool” per rispondere alle richieste PHP e i processi che si generano sono direttamente “figli” (CHILD) del Process Manager e possono quindi essere gestiti separatamente dal web server.

Questa modalità garantisce una maggiore robustezza del servizio, poiché tutte le operazioni come i cambi di configurazione o il restart dei processi, impattano i singoli pool FPM e non più l’intero web server.

Ecco alcune delle interessanti caratteristiche tecniche:

  • Demonizzazione dei processi PHP (file PID, file log, setsid(), setuid(), setgid(), chroot();
  • Possibilità di riavviare i processi PHP senza causare alcuna interruzione delle richieste in fase di processamento, si potra’ quindi cambiare qualsiasi parametro nel file di configurazione o addirittura aggiornare PHP senza avere nemmeno 1 secondo di downtime;
  • Possibilità di non processare le richieste provenienti da un determinato IP;
  • Possibilità di avviare i CHILD sotto differenti UID/GID/CHROOT e con differenti impostazioni di PHP (php.ini) il tutto senza bisogno di safe mode;
  • Possibilità di loggare tramite stdout e stderr;
  • In caso di corruzione della memoria RAM condivisa utilizzata da un OPCode Cache, PHP-FPM può effettuare un riavvio di emergenza di tutti i CHILD PHP;
  • Forza l’arresto dell’esecuzione di uno script nel caso in cui set_time_limit() avesse dei problemi.

Secondo un recente articolo pubblicato su CloudWays, effettuare uno switch da mod_php a PHP-FPM permetterebbe, tra i tanti vantaggi attesi, di ridurre del 300% i tempi di caricamento delle Web Application a traffico elevato.

LXC Linux Containers

LXC - Linux Container

LXC – Linux Container

LXC è una nuova tecnologia per il controllo degli userspace attraverso i Linux Containers, un meccanismo leggerissimo e sicuro per avere un sistema virtuale.

LXC è un’evoluzione di chroot per implementare sistemi completi virtuali, con l’aggiunta di meccanismi di gestione avanzate delle risorse attraverso cgroup e che offre un avanzato grado di isolamento sia di sistema che di applicazione.

I containers Linux adottano un approccio completamente diverso rispetto alle tecnologie di virtualizzazione come Xen e KVM.

E’ possibile virtualizzare solamente macchine linux su linux. Le macchine virtualizzate condividono con il sistema ospitante il kernel con un sistema molto efficiente di isolamento e di sicurezza, e come si può ben capire molto molto efficiente in termini di risorse utilizzate. Con questo sistema si è in grado di supportare simultaneamente centinaia di sistemi emulati su un singolo server. Le macchine virtuali non avranno nessuna perdita di prestazioni rispetto alla macchina che ospita il tutto.

E non è tutto! Il bello sta nella facilità di installazione e di gestione delle macchine virtuali. Non necessita di nessuna modifica al kernel. E’ possibile comprimere una intera macchina virtuale e clonarla in pochi secondi, impressionante direi…

INSTALLAZIONE

Da terminale diventate Root e installate i pacchetti necessari.

sudo -s
apt-get install lxc debootstrap bridge-utils

# creiamo un container
root@lxc:~# lxc-create -n ubuntu01 -t ubuntu
Checking cache download in /var/cache/lxc/trusty/rootfs-i386 …
Installing packages in template: ssh,vim,language-pack-en,language-pack-it
Downloading ubuntu trusty minimal …
……..
………
dopo molte molte righe dovreste ottenere qualcosa come questo :
##
# The default user is ‘ubuntu’ with password ‘ubuntu’!
# Use the ‘sudo’ command to run tasks as root in the container.
##

ora possiamo verificare se e quali container vengono effettivamente visti dal sistema :

root@lxc:~# lxc-ls 
ubuntu01

adesso non rimane che far partire il nostro nuovo container tramite il comando :

root@lxc:~# lxc-start -n ubuntu01 -d

se non ci sono errori la shell non dovrebbe restituirvi altro che il cursore per andare avanti e poterci ora collegare alla console del container :

root@lxc:~# lxc-console -n ubuntu01

ora ci verra’ presentata una schermata di login in cui entrare con le credenziali sopra indicate in fase d’installazione :

Ubuntu 14.04.1 LTS ubuntu01 tty1

ubuntu01 login: ubuntu
Password: 
Welcome to Ubuntu 14.04.1 LTS (GNU/Linux 3.13.0-32-generic i686)
ubuntu@ubuntu01:~$

 …da qui in avanti le possibilita’ di utilizzo sono quasi infinite e dipendono dall’uso che meglio si adatta alle vostre esigenze, vi rimando quindi alle guide ufficiali del progetto:
lxc_container

A volte basta poco !

Ovvero fare un CHROOT dentro un sistema non funzionante !

Prima di continuare la panoramica dei tool salva filesystem/files volevo aggiungere che in alcuni casi quello che ci serve e che ci puo’ bastare e’ gia sotto il nostro naso, li pronto per riparare il nostro Linux e si trova gia’ dentro il sistema, sto parlando di chroot. Poniamo il caso che vi accorgiate di un mal funzionamento in cui forse avete danneggiato il boot loader (GRUB) , oppure avete cancellato per errore qualche pacchetto/libreria importante, la cui mancanza impedisce  l’avvio di Linux. In questi ed in altri casi simili si puo’ provare a ricorrere proprio a “chroot” che potete trovare su qualunque distro su cui stiate lavorando o studiando; CHROOT vi dara’ accesso , come utente root, ad un sistema, ad esempio, che non si avvia.

Usandolo potrete fare il boot da una LiveCD e successivamente eseguire qualsiasi programma come se aveste fatto un normale boot. Per testare questa opzione avviate il vostro pc con la LiveCD, aprite un terminale e diventate l’utente root ( su – ). Poi ipotizzando che il vostro Linux, che non si avvia, sia installato su ” / “eseguiamo i seguenti comandi :

  • con il comando mount scoprite qual’e’ la vostra partizione di root, la mia e’ /dev/sdd1
  • /$ mkdir /mnt/guasto
  • /$ mount /dev/sdd1 /mnt/guasto
  • /$ chroot /mnt/guasto

da questo momento in avanti, tutti i comandi che impartirete al sistema avranno effetto sulla vostra installazione di Linux e non sulla LiveCD, quindi anche qualunque file andrete a modificare sara’ riferito al vostro sistema.

A questo punto per ultimare l’esempio e riparare il boot loader potremo decidere di riconfigurare GRUB nell’MBR (Master Boot Record) eseguendo update-grub .

Una volta ultimata questa fase per uscire dall’ambiente shell di chroot bastera’ digitare exit, saremo quindi pronti per testare il funzionamento del boot riparato sul nostro sistema originario effettuando un reboot del PC ed estraendo il supporto che contiene la nostra LiveCD.

** Leggi anche ( ” linux rescue file system ” )