Se stai usando WordPress, WooCommerce, Magento, Shopware, Oxid, un CMS o qualsiasi altro software standard, di solito sia il frontend che il backend utilizzano lo stesso pool fpm applicativo. Anche per le applicazioni sviluppate autonomamente con Symfony o altri framework questo è spesso il caso.
Il back-end/amministratore può quindi includere numerose operazioni lente, operazioni amministrative ed esportazioni di dati che possono richiedere molto tempo. Ciò potrebbe congestionare la coda di elaborazione dei server web riducendo il throughput per i tuoi clienti che potrebbero semplicemente fare clic sul pulsante di pagamento e visualizzare un errore 502 Bad Gateway.
Mettere frontend e backend su server fisici diversi è una soluzione, ma può essere troppo costoso per la maggior parte dei casi d’uso visto che andremo di fatto a raddoppiare i costi per le due macchine o istanze.
Separazione Pool PHP-FPM tra frontend e backend
Una soluzione semplice per questo problema consiste nell’utilizzare diversi pool PHP-FPM per il frontend e il backend, ciascuno con la propria configurazione per il numero massimo di richieste consentite.
Immagina ad esempio di essere il proprietario di un bar ed avere un solo bagno utilizzato sia dai clienti che dai dipendenti. Si possono verificare situazioni spiacevoli, in cui il cliente deve aspettare che il dipendente finisca per poter usare il bagno, o il caso di una coda di persone molto grande, magari ad una festa, ed il dipendente che deve necessariamente mettersi in fila ed aspettare il suo turno.
Capite che una dinamica del genere crei dei disservizi non indifferenti e delle problematiche sia al dipendente che al cliente. Infatti, a causa di ciò è prassi comune ormai vedere dotati esercizi pubblici di bagni riservati ai clienti e bagni riservati ai dipendenti in modo da non dover “mischiare” le code di attesa e le relative priorità.
Lo stesso principio può essere usato a livello server quando vogliamo separare la parte frontend dalla parte backend.
Esempio di amministrazione e frontend Magento
Come appare? Usiamo Magento come esempio, puoi configurare due pool in php-fpm.conf
:
; php-fpm.conf [frontend] listen = /var/run/php-fpm-frontend.sock pm = static pm.max_children = 50
[backend] listen = /var/run/php-fpm-backend.sock pm = ondemand pm.max_children = 5 pm.process_idle_timeout = 5
Il frontend è configurato per un massimo di 50 richieste simultanee e il backend per un massimo di 5 richieste simultanee. I lavoratori di back-end vengono creati su richiesta e i lavoratori di front-end sono statici per evitare il fork overhead. Discuterò le differenze tra le configurazioni del pool PHP-FPM in un futuro post sul blog.
È quindi possibile modificare la configurazione di Nginx vhost per l’installazione di Magento con il seguente interruttore:
server { // ....
set $fpm_socket "unix:/var/run/php-fpm-frontend.sock";
if ($uri ~* "^/admin/") { set $fpm_socket "unix:/var/run/php-fpm-backend.sock"; }
location ~ .php$ { // ...
fastcgi_pass $fpm_socket; } }
In base al ^/admin
percorso nell’uri della richiesta, selezionerà ora il diverso pool FPM PHP e frontend e backend non competeranno più e si ruberanno le risorse a vicenda.
Se invece lavorassimo con WordPress o WooCommerce il percorso sarebbe ^/wp-admin.
Ciò che conta è ovviamente il concetto alla base, ovvero la possibilità di creare code separate e basate su path.