Come installare NGINX su WordPress

Come installare NGINX su WordPress

Che la maggioranza dei siti web in WordPress usi Apache (lo stack cosiddetto LAMP, Linux + Apache + MySQL + PHP) è una cosa praticamente scontata: molti webmaster, in effetti, neanche si pongono il problema, visto che (htaccess a parte) non sempre si troveranno a mettere mano alle impostazioni avanzate, tipo quelle per attivare HTTP/2 che abbiamo visto ieri. Del resto, ormai da tempo, esiste un’ottima alternativa: il server Nginx, sviluppato in C da Igor Sysoev e diventato popolare perchè il sito ufficiale di WP, ad esempio, lo usa ormai da molto tempo.

WordPress funziona con Nginx?

WordPress supporta al 100% Nginx, con qualche piccola eccezione: ad esempio il file htaccess non sarà più utilizzabile. Questa cosa potrebbe mandarci nel panico ma è una paura ingiustificata: i permalink SEO-friendly che usano quasi tutti i siti web in WP funzionano lo stesso, a patto di configurare correttamente il file default dentro la cartella /etc/nginx/sites-available/. Cambia un po’ l’ottica di configurazione, chiaramente, ma i servizi disponibili rimangono sempre gli stessi.

Ci sono molti modi per configurare Nginx: è possibile usarlo sia come web server stand alone (che è la configurazione che vedremo qui, quindi Nginx al posto di Apache) oppure come puro reverse proxy (in modo da velocizzare il caricamento di contenuti statici come immagini, file CSS, file JS e così via) mantenendo attivo Apache come web server. Non esiste una configurazione ottimale in assoluto: dipende sempre da quello che andremo a inserire nella configurazione, e le prestazioni saranno sempre proporzionali a quello che abbiamo impostato ed alla macchina server che utilizziamo. A volte lo stack Nginx + MySQL + PHP + Linux viene chiamato, in gergo, stack LEMP, per distinguerlo dal LAMP classico.

In questa guida useremo Ubuntu 16.04 come distro linux da configurare per Nginx, quindi sempre via SSH e ad esempio sfruttando le VPS di DigitalOcean. Attenzione che, in ogni caso, questo tutorial è pensato per personale tecnico con competenze di alto livello, visto che un principiante potrebbe facilmente bloccarsi tra un passaggio e l’altro: in ogni caso, Google is your friend e basterà cercare gli eventuali errori per capire come risolvere, con un po’ di pazienza. Evitate di mettere mano a queste configurazioni se non sapete usare molto bene SSH e se, soprattutto (lo ripeto), se è un momento in cui il sito ha necessità di essere sempre funzionante ed online.

Pubblicità:

Per sicurezza, infine, fatevi un bel backup completo del vostro sito prima di cambiare la configurazione.

Requisiti

Ci servirà un account con privilegi root via SSH sulla macchina che vogliamo configurare: quindi dovremo connetterci con privilegi sudo, e saremo pronti a fare tutto. Ovviamente se stiamo agendo su un sito online ci sarà un periodo di downtime in cui il sito non sarà raggiungibile (mentre ci lavoriamo) o potrebbe dare errore al visitatore, cosa da tenere in conto se il sito riceve molte visite.

Versioni di riferimento

Per scrivere questa guida ho utilizzato:

Installare Nginx

Per installare Nginx in Ubuntu si usano i package ufficiale disponibili via apt, quindi come prima cosa daremo i due comandi:

sudo apt-get update

sudo apt-get install nginx

di cui il primo aggiorna la distribuzione Linux all’ultima versione, mentre il secondo installa Nginx.

Configurare il firewall (ufw)

Potrebbe essere necessario mettere mano alle impostazioni del firewall, quindi mediante ufw andremo a verificare che la porta 80 sia accessibile da Nginx, e facendo attenzione al potenziale conflitto tra due server che provano ad usare la stessa porta. In genere questo passaggio è opzionale, nel senso che la VPS potrebbe essere già pronta all’uso senza bisogno di fare nulla: la cosa da fare, a quel punto, prima di iniziare, è quella di spegnere Apache (da qui in poi il sito, se online, non funzionerà più):

service apache stop

e poi aggiungere Nginx come processo autorizzato:

sudo ufw allow ‘Nginx HTTP’

Per verificare lo stato del firewall date questo comando:

sudo ufw status

il che dovrebbe restituire qualcosa del genere:

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere                  
Nginx HTTP                 ALLOW       Anywhere                  
OpenSSH (v6)               ALLOW       Anywhere (v6)             
Nginx HTTP (v6)            ALLOW       Anywhere (v6)

Se è stato tutto configurato a dovere: aprendo la home del sito dovreste vedere la pagina di benvenuto di Nginx (“Welcome to nginx“): a questo punto, l’installazione è avvenuta con successo. Assumeremo nel seguito di aver già installato MySQL, visto che è sempre lo stesso che usavate con Apache, e che ovviamente non deve essere cambiato o disinstallato per evitare di perdere il vecchio database del sito WordPress.

Questo va bene per HTTP, ma non per HTTPS (che ormai usano quasi tutti i siti web): giusto per arrivare pronti alla parte finale della procedura, aggiungete anche la connessione HTTPS come autorizzata:

sudo ufw allow ‘Nginx Full’

sudo ufw delete allow ‘Nginx HTTP’

Installare PHP-fpm

Esattamente come nel caso HTTP/2, anche Nginx richiede il packagephp-fpm, e dovrà poter comunicare col database via Nginx: per cui andremo ad installare tutto quello che ci serve così:

sudo apt-get install php-fpm php-mysql

Per rendere sicura l’installazione conviene impostare il file php.ini della versione PHP che state usando (per scoprirla digitate da SSH php -v), ed ammesso che sia la PHP 7.2 editate il file .ini (nota: io uso quasi sempre pico, ovviamente potete usare anche editor diversi come nano e via dicendo):

sudo pico /etc/php/7.2/fpm/php.ini

e rimuovete il commento dalla riga in cui trovate cgi.fix_pathinfo,  impostandolo a 0 di default. La pericolosità di questa impostazione è ovviamente legata allo scenario di versione PHP che state considerando, ma da quello che sono riuscito a capire conviene comunque impostare così le cose.

Salvate il file e procediamo oltre, non prima di aver riavviato PHP (ammetterò nel seguito di usare sempre PHP 7.2):

  • sudo systemctl restart php7.2-fpm

Configurare PHP con Nginx

Ora come ora, se provate ad aprire una pagina WordPress qualsiasi il browser vi restituirà un file di testo in PHP non processato: significa che il PHP ed il server non si “conoscono” a vicenda, per cui dobbiamo risolvere. Se vi capita che un sito su una VPS abbia un problema del genere, per inciso, dovrete effettuare una configurazione sulla falsariga di quello che vedremo qui.

Anche nginc permette di editare dei “blocks” di configurazione che sono in parte corrispondenti con quelli di htdocs e htaccess di Apache: a mio avviso, pero’, la sintassi è molto più semplice.

Configurazione di default di Nginx

Se adesso andiamo ad editare il file di default di Nginx:

  • sudo pico /etc/nginx/sites-available/default

e dovreste vedere qualcosa del genere (in Nginx questa sezione è detta request processing, cioè configurazione delle richieste HTTP(S) ):

server {
    listen 80 default_server;
    listen [::]:80 default_server;

    root /var/www/html;
    index index.html index.htm index.nginx-debian.html;

    server_name _;

    location / {
        try_files $uri $uri/ =404;
    }
}

Qui ci sono un po’ di opzioni da tenere in considerazione:

  • il server è in ascolto sulla porta 80
  • ssss
  • la root del sito è quella classica di Ubuntu, cioè /var/www/html
  • avremo bisogno di indicare il file di default (index.php) che è il primo che viene eseguito nella root;
  • dovremo configurare il nome del server;
  • dovremo dire a Nginx come “trattare” le varie richieste sulla pagine web del sito
  • potremo dire a Nginx, inoltre, di ignorare esplicitamente il file .htaccess.

Ogni direttiva deve essere conclusa con il simbolo ;, mentre per verificare che la configurazione sia OK basterà dare il comando di check una volta usciti dall’editor:

nginx -t

Ecco una possibile configurazione del file per WordPress:

server {
    listen 80 default_server;
    listen [::]:80 default_server;

    root /var/www/html;
    index index.php index.html index.htm index.nginx-debian.html;

    server_name nome_del_sito.est www.nome_del_sito.est;

    location / {
        try_files $uri $uri/ =404;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php7.2-fpm.sock;
    }

    location ~ /\.ht {
        deny all;
    }
}

in cui in grassetto ho indicato le modifiche necessarie: index.php come primo file da cercare, dove si trova la versione PHP da usare (path incluso), ignorare il file htaccess.

Salvate ed uscite dal file, poi controllate che la sintassi sia OK:

sudo nginx -t

e se ci sono errori correggeteli; ad esempio, se riportate la stessa direttiva due volte sarà considerato un errore dal parser.

Quando il check da’ l’OK sarete pronti a ricaricare Nginx con la nuova configurazione mediante:

sudo systemctl reload nginx

Testare PHP con NGINX

Per verificare questo aspetto andremo a creare un file di prova con all’interno la funzione phpinfo(), che ci fornirà i dettagli della configurazione attuale; se funziona, è tutto ok. Per farlo, basta aprire un nuovo file info.php:

  • sudo pico /var/www/html/info.php

ed incollare:

<?php
phpinfo();

poi bisogna salvare ed uscire dal file.

Se adesso provate ad aprire il file da browser mediante:

http://nome_del_sito.est/info.php

dovreste vedere la pagina di default con le informazioni tecniche su PHP, il che conferma che è tutto OK. Per sicurezza, il file info.php andrebbe cancellato ora che non vi serve più. Per farlo basta un semplice:

sudo rm /var/www/html/info.php

Configurare HTTPS (Let’s Encrypt) su nginx

Vi manca un ultimo passaggio prima di concludere l’installazione del nuovo server: installare HTTPS su Nginx. Per farlo, ammesso che abbiate già installato da prima Let’s Encrypt (come ho spiegato qui), basta mettere al corrente Nginx della presenza di HTTPS. C’è un plugin purtroppo in beta (e spesso da installare a parte), ma funzionante, per fare questo ultimo passaggio. Basta dare un:

sudo certbot --nginx -d nome_del_sito.com -d www.nome_del_sito.com

che servirà a dire a Nginx che esiste un certificato SSL di Let’s Encrypt. Seguite le richieste che saranno identiche a quelle che avete usato per configurare o rinnovare HTTPS anche in Apache, e sarete a posto. Poi controllate che sia attivo l’autorenew del certificato ed avrete finito:

sudo certbot renew --dry-run

Per ulteriori informazioni fate riferimento ai forum per sviluppatori ed alla documentazione ufficiale.

Pubblicità:

Informazioni sull'autore

Salvatore Capolupo

Consulente SEO, ingegnere informatico e fondatore di Trovalost.it, Pagare.online, Lipercubo.it e tanti altri. Di solito passo inosservato e non ne approfitto.
Ti piace questo articolo?

0 voti

Su Trovalost.it puntiamo sulla qualità dei contenuti da quando siamo nati: la tua sincera valutazione può aiutarci a migliorare ogni giorno.