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;
    }

  }
}