Hosting scalabile per WordPress – vm02

Nel primo articolo abbiamo creato il server che fungerà da storage NFS per le pagine PHP e per i contenuti statici e che risponderà alla porta 80 per servire direttamente i contenuti statici e girare a dei server in load balancing le richeste di elaborazione dei contenuti dinamici PHP.

In questo secondo articolo andremo a creare vm2 che è, appunto, l’application server che servirà i contenuti PHP attraverso php-fpm.

Creiamo questa VM partendo da una installazione “vanilla” di Debian Squeeze (6.0.1), dotando la VM di 1024 MB di RAM, 2 VCPU (CPU virtuale), 0.50 CPU (assegnamo il 50% della potenza di una CPU fisica), 1 schede di rete con IP privato e 2048 MB Disco Swap.

Configurazione di base
Come per vm1 la prima cosa che andremo a fare è modificare alcune delle configurazoni di default, in particolare il file hosts che ci consentirà di raggiungere tramite mnemonico le VM del nostro sistema:

<strong>/etc/hosts</strong>
10.10.1.1   lb
10.10.1.2   php-appserver1 mysql
10.10.1.3   mysql-server1

e il file /etc/hostname

<strong>/etc/hostname</strong>
php-appserver1


Installazione di nginx

Come per il load balancer, anche su questo server installeremo nginx per tre ragioni: la prima è che così il server potrà servire anche contenuti non PHP ma che non vengono serviti direttamente da vm1 (ad esempio un file statico ma con estensione diversa da quelle dichiarate su vm1), la seconda che potrà essere utile nel caso di guasto di vm1 e la terza è che così si avrà un miglior controllo del numero di richeste contemporanee servite dalla vm.
Per procedere con l’installazione, analogamente a quanto eseguito su vm1, andiamo ad aggiungere la seguente riga al file /etc/apt/sources.list

<strong>/etc/apt/sources.list</strong>
deb http://packages.dotdeb.org stable all

Aggiungiamo la chiave PGP:

wget http://www.dotdeb.org/dotdeb.gpg
cat dotdeb.gpg | apt-key add -
rm dotdeb.gpg

ed installiamo nginx

apt-get update
apt-get install nginx

Creiamo, per semplicità, il link simbolico alla directory /usr/share/nginx/www:

ln -s /usr/share/nginx/www/ /var/www

Modifichiamo il file di configurazione per il server di default:

server {
                listen 80;
                server_name _;

                root /usr/share/nginx/www;
                index index.php;

                log_not_found off;

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

                location ~ \.php$ {
                        fastcgi_split_path_info ^(.+\.php)(/.+)$;
                        fastcgi_index  index.php;
                        fastcgi_pass   127.0.0.1:9000;
                        fastcgi_param  SCRIPT_FILENAME /usr/share/nginx/www$fastcgi_script_name;
                        include fastcgi_params;
                }

       }

Installazione del client NFS
Ora installiamo il client nfs:

apt-get install nfs-client

e modifichiamo il file /etc/fstab in modo da montare automaticamente il disco di rete aggiungendo la seguente riga:

<strong>/etc/fstab</strong>
lb:/usr/share/nginx/www        /usr/share/nginx/www         nfs4 hard,intr,_netdev  0       0

Configuriamo identd con:

<strong>/etc/default/nfs-common</strong>
NEED_IDMAPD=yes
NEED_GSSD=no

Riavviamo il servizio nfs-common con:

/etc/init.d/nfs-common restart

e montiamo il disco con:

mount -a

Installazione di php-fpm
Per installare php-fpm utilizziamo il package manager di debian. Assieme a php-fpm installeremo alcune estensioni che ci torneranno utili nella configurazione di wordpress:

apt-get install php5 php5-fpm php-pear php5-common php5-mcrypt php5-mysql php5-cli php5-gd php5-apc php5-memcache php5-memcached php5-suhosin

Ora modifichiamo la configurazione di php-fpm:

/etc/php5/fpm/pool.d/www.conf
pm.max_children = 25
pm.start_servers = 4
pm.min_spare_servers = 2
pm.max_spare_servers = 10
pm.max_requests = 500
request_terminate_timeout = 30s

Questa è una taratura adatta ad una VM con 512MB-1024MB di RAM, ma ovviamente la potenza reale della CPU influisce sulla validità di questi valori.
Ora riavviamo php-fpm per rendere attive le impostazioni.

/etc/init.d/php5-fpm restart

Installazione di memcached
Memcached è un demone per creare una cache distribuita che torna utile per velocizzare gli accessi al database. Per installarla è sufficiente lanciare il comando:

apt-get install memcached

Installazione di mysql-proxy
mysql-proxy è un demone che permette di utilizzare una batteria di server mysql in configurazione master-slave per distribuire il carico delle query in lettura. Al momento avremo un solo server mysql, ma in un futuro potrebbe tornare utile:

apt-get install mysql-client mysql-proxy

E configuriamolo con:

<strong>/etc/default/mysql-proxy</strong>
ENABLED="true"
OPTIONS="--proxy-address=:3306 --proxy-backend-addresses=mysql-server1:3306 --pr
oxy-read-only-backend-addresses=mysql-server1:3306"