(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.
nginx (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.
La 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.
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:
an[email protected]:~$ 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).
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
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
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
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:
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:
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.
Commenti
5 risposte a “Installare WordPress su nginx, PHP-FPM e MariaDB”
Applausi !
nginx (& Beggi) rulez !!!
Ci mancano tanto i post di una volta…..
Complimenti, ottimo come sempre !
(Ogni tanto un post come una volta).
Ci metterei php 7 già che ci siamo.
http://www.zend.com/en/resources/php7_infographic
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?