Esecuzione di script PHP
NGINX non supporta nativamente gli script PHP; per questo motivo, delega la loro esecuzione a un servizio esterno (php-fpm), comportandosi quindi come un Reverse Proxy.
Installazione di PHP-fpm
Per prima cosa, bisogna installare php-fpm attraverso un package manager.
$ apt update
# Installa l'ultima versione stabile di PHP disponibile
$ apt install -y php-fpm
Php-fpm viene già configurato in automatico come un servizio systemctl.
Configurazione di NGINX
Direttiva index
La prima cosa da includere è la direttiva index, che specifica quale file caricare le l'URI punta a una directory. Di default corrisponde a index.html, ma per eseguire uno script php è necessario che punti a index.php.
Accetta più possibilità.
index index.php index.html;
Impostazione della location
Si imposta una location / con all'interno un try_files che prova prima a risolvere $uri, poi prova a risolvere l'URI di una cartella nel caso in cui fosse richiesta una cartella tramite $uri/, per poi andare a risultare nella pagina 404 di default di NGINX tramite =404.
location / {
try_files $uri $uri/ =404;
}
Regole proxy
Bisogna poi specificare una location che risolve tutte le richieste *.php.
NGINX passerà le richieste a php-fpm tramite il protocollo fastCGI, un protocollo per il trasferimento di dati binari. Si usa fastCGI perché è più veloce del protocollo HTTP.
location ~ *.php {
# Include il necessario per fastCGI
include fastcgi.conf;
# Passa a php-fpm tramite un socket unix
# In questo esempio la versione PHP è 7.1
fastcgi_pass unix:/run/php/php7.1-fpm.sock;
}
502 bad gateway
Provando la configurazione con un file PHP, si otterrà l'errore 502: Bad Gateway. Questo errore è dovuto al fatto che l'utente NGINX (nobody di default) non ha i permessi di eseguire il socket php-fpm (che invece è eseguito dall'utente www-data).
La soluzione più semplice e sicura è quella di configurare NGINX per essere eseguito dall'utente www-data tramite la direttiva user nel main context.
user www-data;
Configurazione finale
user www-data;
events {}
http {
include mime.types;
server {
listen 80;
server_name nuuskamuikkunen.truppaperot.it;
root /sites/demo;
index index.php index.html;
location / {
try_files $uri $uri/ =404;
}
location ~\.php$ {
include fastcgi.conf;
fastcgi_pass unix:/run/php/php7.1-fpm.sock;
}
}
}