Andrea Beggi

Everything you need is already inside.

Installare WordPress su nginx, PHP-FPM e MariaDB

A T T E N Z I O N E ! Questo post ha piu' di sei mesi. Le informazioni contenute potrebbero non essere aggiornate.

(Ogni tanto un post come una volta).

La tradizionale architettura LAMP (Linux, Apache MySQL, PHP) su cui si basa la maggior parte delle installazioni di WordPress ha sempre funzionato bene e tutt’ora fa il suo lavoro in maniera egregia. Il problema di questa soluzione sono le prestazioni: su un server poco carrozzato o con siti ad alto traffico la modalità di funzionamento di Apache + PHP tende a saturare le risorse fino a smettere di servire pagine nei casi più estremi.

nginxnginx (pronunciato “enginèx”) è nato qualche anno fa per ottimizzare le prestazioni di alcuni siti russi ad altissimo traffico e si è evoluto fino ad essere una specie di coltellino svizzero delle infrastrutture di servizi. E’ un server dalle molteplici funzioni: è un server HTTP, un reverse proxy, un mail proxy server, un generico proxy TCP e può anche essere utilizzato come bilanciatore di carico. Rispetto ad Apache, come webserver, fa molte meno cose ma le fa moooolto più velocemente; è nato per servire contenuti statici, ma può passare le richieste a un gestore di processi come PHP-FPM. Non parlerò del perché nginx è più veloce di Apache e utilizza meno risorse: è una questione abbastanza complicata che riguarda il modo in cui vengono gestite le richieste dei client. A noi basta sapere che nginx è più veloce e usa meno memoria. Giusto per darvi un’idea: WordPress.com usa nginx come load balancer dal 2008 e già allora un singolo server riusciva a inoltrare 10.000 richieste al secondo verso i server WordPress.com. (!!!!)

Quindi.

Scenario: devi installare WordPress su un serverino a basse prestazioni, magari un VPS economico da 4 euro al mese, oppure hai problemi di prestazioni perché il tuo sito ha troppo traffico e il tuo server fatica a reggere.

Mariadb-seal-shaded-browntext-altLa soluzione potrebbe essere utilizzare nginx, con PHP-FPM, un gestore di processi molto veloce che lavora bene con nginx, e anche in questo caso non ci interessa sapere perché PHP-FPM è più veloce del tradizionale PHP FastCGI. Giusto per variare completamente la ricetta, invece di MySQL server usiamo MariaDB, un fork che funziona bene ed è completamente compatibile. Anche MariaDB è più veloce di MySQL, quindi lo usiamo. (Solo un appunto: un prodotto che vuole affermarsi nel mondo dei db relazionali professionali sceglie un nome come MariaDB e usa una foca nel logo? Mah.)

I requisiti necessari sono: un server appena installato in modalità minimale, senza alcun servizio, e una certa dimestichezza con la riga di comando poiché tutte le operazioni verranno fatte dal terminale. Tutti i software citati sono Open Source. L’accesso può avvenire direttamente dalla console o via SSH, non ha importanza, ed è necessario disporre di un account utente e della password di root. Nell’esempio che segue ho utilizzato una VM su VirtualBox con 768 MB RAM e 8GB HD su cui ho installato Ubuntu 15.10 server a 64bit.

Schermata del 2015-12-12 20-53-49

Il server, in un impeto di fantasia, si chiama “test” e nel seguito del post sostituisci il nome con quello del tuo server. Come prima cosa diamo una botta di apt-get per aggiornare il sistema:

andrea@test:~$ sudo apt-get update && sudo apt-get upgrade

Cominciamo installando nginx:

sudo apt-get install nginx -y

E controlliamo che il servizio funzioni inserendo nel browser http://test (o l’indirizzo IP ottenuto tramite il comando ifconfig se il tuo DNS non lo risolve ancora).

Schermata del 2015-12-12 21-18-31

Installiamo poi MariaDB:

sudo apt-get install mariadb-server mariadb-client -y

E controlliamo che stia effettivamente girando:

sudo service mysql status

Ottenendo

● mysql.service - LSB: Start and stop the mysql database server daemon
Loaded: loaded (/etc/init.d/mysql)
Active: active (running) since...

 

Procediamo quindi a metterlo “in sicurezza”:

sudo mysql_secure_installation

Inseriamo una password per l’amministrazione di MariaDB e accettiamo il default sul resto delle domande.

Continuiamo installando PHP-FPM:

sudo apt-get install php5-fpm php5-mysql -y

E, nuovamente, controlliamone il funzionamento:

sudo service php5-fpm status

Ottenendo:

● php5-fpm.service - The PHP FastCGI Process Manager
Loaded: loaded (/lib/systemd/system/php5-fpm.service; enabled; vendor preset: enabled)
Active: active (running) since...

 

Passiamo ora alla configurazione di tutto il cucuzzaro.  Come prima cosa bisogna dire a nginx di utilizzare un numero corretto di istanze simultanee, e per farlo dobbiamo conoscere il numero di CPU core a disposizione del nostro server. Impartiamo il comando:

cat /proc/cpuinfo

Intorno alla dodicesima riga il mio server dice: cpu cores : 1

Editiamo il file di configurazione di nginx:

sudo nano /etc/nginx/nginx.conf

Sostituiamo il valore

worker_processes auto;

Con

worker_processes 1;

In modo da istruire nginx a utilizzare una sola istanza che corrisponde al core a nostra disposizione. Adatta il valore alle caratteristiche del tuo server. Salviamo il file e passiamo alla configurazione del server HTTP.

sudo nano /etc/nginx/sites-available/default

Prendiamo intanto nota del valore root nella sezione server: indica la cartella in cui andranno caricati i file di WordPress; il default sulle distribuzioni derivate da Debian (come Ubuntu) è /var/www/html e io assumerò che sia quello da ora in poi. Sempre in server, sostituiamo la riga

index index.html index.htm index.nginx-debian.html;

Con:

index index.php index.html index.htm;

E impostiamo servername con il nome del server.

Andiamo quindi nella sezione location ~ \.php$ e “scommentiamo” alcune righe in modo che appaia così:

location ~ \.php$ {
include snippets/fastcgi-php.conf;
# With php5-cgi alone:
# fastcgi_pass 127.0.0.1:9000;
# With php5-fpm:
fastcgi_pass unix:/var/run/php5-fpm.sock;
}

Salviamo e usciamo. Mettiamo a posto l’index di default:

sudo mv /var/www/html/index.nginx-debian.html /var/www/html/index.html

Facciamo ripartire il servizio per recepire le modifiche:

sudo service nginx restart

Ricontrolliamo http://test

Schermata del 2015-12-12 21-18-31

Creiamo un file:

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

Inseriamo al suo interno:

<?php
phpinfo();
?>

Usiamolo per controllare che PHP-FPM stia funzionando correttamente: http://test/info.php

Schermata del 2015-12-13 16-16-49

Fin qui tutto bene. Procediamo quindi a installare WordPress.

cd /var/www/html (oppure la server root che avevamo individuato nei passi precedenti)

sudo wget https://it.wordpress.org/wordpress-4.4-it_IT.tar.gz

(Questo è l’indirizzo dell’attuale versione italiana, controlla sul sito che sia quella corretta e la più recente)

sudo gzip -d wordpress-4.4-it_IT.tar.gz
sudo tar -xvf wordpress-4.4-it_IT.tar

Queste operazioni creano la directory /var/www/html/wordpress ma se vuoi installare WordPress nella root, sposta tutti i file da ./wordpress al livello superiore.

Creiamo e configuriamo il database:

sudo mysql -u root -p (attenzione a inserire correttamente prima la pw di root poi quella di MariaDB, se richiesta) e fai attenzione a mettere il punto e virgola alla fine delle righe di comando.

MariaDB [(none)]> CREATE USER 'wordpress-user'@'localhost' IDENTIFIED BY 'una_password_utente';

(“wordpress-user” è lo user del db e “una_password_utente” la sua password.)

Otteniamo: Query OK, 0 rows affected (0.04 sec)

MariaDB [(none)]> CREATE DATABASE wordpress-db;

Otteniamo: Query OK, 1 row affected (0.01 sec)

MariaDB [(none)]> GRANT ALL PRIVILEGES ON wordpress-db.* TO "wordpress-user"@"localhost";

Otteniamo: Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> FLUSH PRIVILEGES;

Otteniamo: Query OK, 0 rows affected (0.01 sec)

E finalmente:

MariaDB [(none)]> exit

Ora configuriamo WordPress:

cd /var/www/html/wordpress
sudo cp wp-config-sample.php wp-config.php
sudo nano wp-config.php

Compiliamo i campi necessari:

define('DB_NAME', 'wordpress-db');
define('DB_USER', 'wordpress-user');
define('DB_PASSWORD', 'una_password_utente');
define('DB_HOST', 'localhost');

Compiliamo la sezione chiavi univoche di autenticazione tramite https://api.wordpress.org/secret-key/1.1/salt/ e salviamo uscendo. Navighiamo su http://test/wordpress/wp-admin/install.php e completiamo il processo di installazione di WordPress. Controlliamo che stia funzionando su http://test/wordpress

Schermata del 2015-12-13 16-40-00

Per far funzionare i permalink personalizzati è necessaria un’ulteriore modifica:

sudo nano /etc/nginx/sites-available/default

Se WorpPress è installato in una sottocartella come in questo caso, aggiungiamo una sezione:

location /wordpress/ {
try_files $uri $uri/ /wordpress/index.php?$args;
}

Subito sotto l’ultima che abbiamo modificato prima.

Se WordPress è installato nella root del webserver va solo cambiata la riga try_files nella sezione location / in questo modo:

try_files $uri $uri/ /index.php?q=$args;

Facciamo ripartire nginx:

sudo service nginx restart

Impostamo i permalink personalizzati e controlliamo che funzionino:

Schermata del 2015-12-13 17-04-58

Per far funzionare bene gli aggiornamenti di WordPress, e anche dei temi e dei plugin, modifichiamo il proprietario dei file. Controlliamo che nginx giri con l’utente www-data:

sudo ps -aux | grep nginx

E in effetti una delle righe dice:

www-data  1292  0.0  0.6 125224  4916 ?        S    00:10   0:00 nginx: worker process

Quindi assegnamo a www-data la proprietà dei file di WordPress:

sudo chown -R www-data:www-data /var/www/html/wordpress

Se ci serve installiamo anche PHPMyAdmin:

sudo apt-get install phpmyadmin php5-mcrypt -y
sudo php5enmod mcrypt
sudo service php5-fpm restart

Non scegliamo nessun webserver durante l’installazione di PHPMyAdmin, poi eseguiamo:

ln -s /usr/share/phpmyadmin /var/www/html

E controlliamo che funzioni:

Schermata del 2015-12-13 17-16-28

Congratulazioni! Hai installato WordPress su nginx, PHP-FPM e MariaDB! Questa è una buona base per partire, e la configurazione può essere affinata per ottimizzare le prestazioni e aumentare la sicurezza.

5 Commenti

mario | #

Ci mancano tanto i post di una volta…..

Complimenti, ottimo come sempre !

(Ogni tanto un post come una volta).

Anna | #

Complimeti,bella guida,
nonostante tutto ho un problema,quando punto a http://localhost/php.ini o phpmyadmin mi esce un file da scaricare e non la pagina come la guida..come risolvo?

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *