Server con un RaspberryPi: si può fare! (parte 2) – nginx, php-fpm, WordPress e SQLite

Nella prima puntata abbiamo configurato il nostro Raspberry Pi con un ambiente Debian di base e con un pizzico di overclock.

Scrivo la seconda parte dell’articolo perché SI: sono riuscito a migrare i miei servizi web ed il sito che state leggendo in questo momento gira sul mio Raspberry :)

Veniamo al dunque.

Il tradizionale stack LAMP (Linux + Apache + MySQL + PHP) non è assolutamente adatto per il nostro Pi. E’ una configurazione troppo pesante e noi abbiamo a disposizione solo 256MB di RAM, quindi dobbiamo risparmiare ogni kB possibile.

Ultimamente sono entrato in contatto con nginx (si pronuncia engine-x), un web server nato in Russia che si sta facendo apprezzare per la sua incredibile velocità e leggerezza, soprattutto nel distribuire contenuti statici.
E’ bravo a gestire molte richieste contemporaneamente senza riempire la memoria e sempre più server hanno iniziato ad utilizzarlo, magari mettendolo davanti ad Apache come reverse-proxy, o accoppiandolo a FastCGI per distribuire contenuti dinamici server-side.

Avendolo già usato su un server con poca memoria, ottenendo risultati eccezionali, ho deciso di metterlo alla prova anche sul Pi.

Oltre al server web, per far girare WordPress avevo bisogno anche di PHP, quindi ho deciso di accoppiare nginx con php-fpm, un demone che esegue script PHP e si interfaccia con nginx attraverso il protocollo FastCGI.

In questo modo se arriva una richiesta di un contenuto statico, nginx risponde immediatamente senza creare processi figli, se invece arriva la richiesta di un contenuto dinamico, nginx inoltra la richiesta all’interprete PHP attraverso FastCGI, sempre senza creare nuovi processi.

Questo rappresenta un enorme vantaggio in termini di risorse rispetto alla vecchia accoppiata Apache + apache-mod-php. Nel “vecchio” sistema infatti, ogni volta che arrivava una richiesta, anche di un contenuto statico come un’immagine o uno script Javascript, Apache creava un nuovo processo per gestire la richiesta, copiando anche tutto lo stack PHP, mantenendo multiple copie di PHP in memoria.

Quando si tratta di gestire più richieste contemporaneamente questo fa decisamente la differenza.

Bando alle chiacchiere, installiamo nginx e php-fpm:

aptitude install nginx php5-fpm

A questo punto modifichiamo poche impostazioni di default di PHP.

Di default php-fpm si mette in ascolto su una porta TCP, a me però stanno più simpatici i socket unix per servizi che devono rimanere nella stessa macchina e non devono affacciarsi all’esterno.

Apriamo il file /etc/php5/fpm/pool.d/www.conf

vim /etc/php5/fpm/pool.d/www.conf

Modifichiamo la direttiva “listen” in questo modo:

listen = /var/run/php5-fpm.sock

Salviamo e chiudiamo il file.

Evitiamo l’esecuzione di codice PHP arbitrario caricato dall’utente attraverso upload di file:

vim /etc/php5/fpm/php.ini

Cerchiamo la direttiva cgi.fix_pathinfo, riga 765 e disattiviamola

cgi.fix_pathinfo=0

A questo punto creiamo la cartella che diventerà la nostra web root

mkdir /var/www

Creiamo un nuovo virtualserver nella configurazione di nginx

vim /etc/nginx/sites-avalaible/miosito

Per i riferimenti sulla configurazione di nginx vi rimando alla documentazione ufficiale, comunque ritengo che questa sia una buona base per configurare un sito con WordPress:

 server {
 listen 80 default_server;
 server_name miosito.it www.miosito.it;
 root /var/www;
 index index.php;

location /wp-content/database {
 deny all;
 return 404;
}

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

location ~ \.php$ {
 fastcgi_pass unix:/var/run/php5-fpm.sock;
 fastcgi_index index.php;
 include fastcgi_params;
}

}

Attiviamo il virtualserver:

ln -s /etc/nginx/sites-avalaible/miosito /etc/nginx/sites-enabled/miosito

A questo punto possiamo inserire un file PHP di prova in /var/www/index.php

<?php phpinfo(); ?>

Riavviamo nginx e php per leggere la nuova configurazione

service nginx restart
service php5-fpm restart

Se collegandoci al nostro sito riusciamo a visualizzare una pagina con la configurazione di PHP, allora è andato tutto a buon fine, altrimenti  usiamo il buon vecchio Google :)

WordPress e SQLite

Il mio CMS preferito purtroppo gira solo con MySQL, che pur essendo un buon DBMS, richiede troppe risorse per il nostro piccolo Pi.

Dopo molto sudore e diversi scartavetramenti di noci di cocco, sono riuscito ad installare WordPress con SQLite, un gestore di database molto leggero e veloce che si appoggia su un unico file e non ha bisogno di un demone in esecuzione continua.

Questo risultato è stato possibile grazie a PDO (SQLite) For WordPress, un plugin che modifica le query di WordPress incapsulandole in query PDO, un layer di astrazione che permette di utilizzare diversi DBMS.

Per la procedura da seguire vi rimando ad un articolo molto ben realizzato che spiega ogni dettaglio e alla tradizionale guida di installazione di WordPress.

Potete scegliere due strade: installare WordPress ed installarlo con il plugin passo passo seguendo la procedura descritta nella guida oppure utilizzare il pacchetto messo a disposizione che contiene WordPress già installato e pronto ad essere utilizzato con SQLite.

Personalmente vi consiglio di seguire la prima via per diversi motivi:

  • Familiarizzare con l’installazione di WordPress permette di capire meglio il suo funzionamento e le prossime volte che vi troverete a farlo sarete più veloci
  • La procedura è descritta passo passo ed è fatta molto bene
  • Il pacchetto pronto è in inglese, mentre noi possiamo partire dalla versione in italiano

Fate attenzione, l’installazione fila liscia solo partendo da una vecchia versione di WordPress: la 2.9.2

Comunque non temete: una volta installato WordPress potete tranquillamente effettuare l’upgrade all’ultima versione senza intoppi.

A questo punto dovrete ritrovarvi un’installazione pulita di WordPress, con il database sqlite contenuto nella cartella /wp-content/database.

Esporre il database al web non è mai una buona idea, ma se avete seguito le mie istruzioni nginx dovrebbe negare ogni accesso a tale cartella.

Comunque voi CONTROLLATE :)

Per migliorare il tempo di caricamento della pagine, diminuire gli accessi al database e quindi appesantire meno il nostro lampone quando ci sono molti accessi vi CONSIGLIO VIVAMENTE  di installare il plugin Quick Cache, basta attivarlo e senza configurare nulla il nostro Worpress può migliorare le prestazioni anche di 10 volte!

Quanto abbiamo appesantito il nostro Raspberry?

POCO!

L’insieme di nginx e php-fpm occupa circa 30MB in memoria in condizioni di carico normale.
Le prestazioni del sito sono del tutto soddisfacenti: il tempo medio di accesso di 20 connessioni simultanee è di 2.61 secondi!

Naturalmente il risultato sarebbe molto diverso senza cache, arrivando anche a 8 secondi.
Purtroppo il processore del Raspberry è piccolo e non possiamo pretendere chissà quali prestazioni, ma se consideriamo che la cache non funziona solo quando siamo noi ad utilizzare il sito loggandoci per pubblicare gli articoli, sono disposto ad aspettare :)

Riuscirà il nostro coraggioso Raspberry Pi a diventare anche un server di posta? Lo scopriremo nella prossima puntata :)

You may also like...

1 Response

Lascia un Commento

L'indirizzo email non verrà pubblicato. I campi obbligatori sono contrassegnati *

È possibile utilizzare questi tag ed attributi XHTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>