lug 222011
 

Nella precedente serie di articoli, abbiamo utilizzato un insieme di tre macchine per realizzare un hosting altamente ottimizzato per ospitare blog in WordPress.
In questo articolo modificheremo la configurazione per poter ospitare più blog all’interno di un’unico insieme di VM.

1) Creazione di utenti distinti per gli script php
Sia sul Load Balancer, sia sull’application server, andremo a creare un utente specifico per far girare gli script php di ogni sito. QUesta impostazione ci consente di mantenere un sistema sicuro in quanto uno script del “sito1″ non avrà accesso ai file del “sito2″.
Lanciamo quindi i seguenti comandi su entrami i server:

useradd sito1
useradd sito2

2) Modifica della path del sito web e settaggio dei permessi
Innanzi tutto, abbiamo tutti i file del nostro sito wordpress all’interno della directory /var/www e la cosa non va certo bene per l’impostazione che stiamo per realizzare.
Sul Load Balancer, lanciamo i seguenti comandi:

cd /var/www
mkdir sito1
mv * sito1
chown -R sito1:www-data sito1
chmod 750 sito1
mkdir sito2
chown -R sito2:www-data sito2
chmod 750 sito2
mkdir default
chown -R root:www-data default
chmod 750 default
touch default/index.hrml

Con questa impostazione, abbiamo creato due directory per i nostri Virtual Hosting, bloccando l’accesso in lettura/scrittura al solo proprietario della directory.

3) Configurazione di nginx sul load balancer
E’ necessario modificare la configurazione di nginx sul Load Balancer in modo da abilitare il Virtual Hosting. Con l’occasione aggiungeremo qualche limite per amentare ulteriormente la sicurezza del sistema.

/etc/nginx/nginx.conf
user www-data;
worker_processes  2;
error_log  /var/log/nginx/error.log;
pid        /var/run/nginx.pid;
events {
    worker_connections  1024;
}
http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    access_log /var/log/nginx/access.log;
    server_names_hash_bucket_size 64;
    sendfile        on;
    tcp_nopush     on;
    tcp_nodelay        on;
    gzip              on;
    gzip_comp_level   5;
    gzip_http_version 1.0;
    gzip_min_length   0;
    gzip_vary         on;

    ## Start: Size Limits & Buffer Overflows ##
    client_body_buffer_size  1k;
    client_header_buffer_size 2k;
    client_max_body_size 1k;
    large_client_header_buffers 2 2k;
    ## END: Size Limits & Buffer Overflows ##

    ## Start: Timeouts ##
    client_body_timeout   10;
    client_header_timeout 10;
    keepalive_timeout     5 5;
    send_timeout          10;
    ## End: Timeouts ##

    ### Directive describes the zone, in which the session states are stored i.e. store in slimits. ###
    ### 1m can handle 32000 sessions with 32 bytes/session, set to 5m x 32000 session ###
    limit_zone slimits $binary_remote_addr 5m;

    ### Control maximum number of simultaneous connections for one session i.e. ###
    ### restricts the amount of connections from a single ip address ###
    limit_conn slimits 5;

    upstream appservers {
        fair weight_mode=idle no_rr;
        server php-appserver1 weight=10;
    }
    server {
        listen       80;
        server_name  _;
        index index.htm
        access_log /var/log/nginx/default.access.log;

       location / {
            root /usr/share/nginx/www/default;
    	}
    }

    include /etc/nginx/sites-enabled/*;

}

Creiamo quindi i due file sito1 e sito2 per il Virtual Hosting:

/etc/nginx/sites-available/sito1 
    server {
        listen       80;
        server_name  sito1;
        access_log /var/log/nginx/sito1.access.log;

        location / {
    	    ## Only allow these request methods ##
    	    if ($request_method !~ ^(GET|HEAD|POST)$ ) {
        	return 444;
    	    }
    	    ## Do not accept DELETE, SEARCH and other methods ##

    	    ## Deny certain Referers ###
    	    if ( $http_referer ~* (babes|forsale|girl|jewelry|love|nudit|organic|poker|porn|sex|teen) )
    	    {
        	# return 404;
         	return 403;
    	    }
    	    ##
            proxy_pass http://appservers;
            include /etc/nginx/conf.d/proxy.conf;
       	}
	location ~* ^.+.(jpe?g|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|js|swf|avi|mp3)$ {
    	    ## Only allow these request methods ##
    	    if ($request_method !~ ^(GET|HEAD|POST)$ ) {
        	return 444;
    	    }
    	    ## Do not accept DELETE, SEARCH and other methods ##

    	    ## Deny certain Referers ###
    	    if ( $http_referer ~* (babes|forsale|girl|jewelry|love|nudit|organic|poker|porn|sex|teen) )
    	    {
        	# return 404;
         	return 403;
    	    }
    	    ##

            expires 30d;
            root /usr/share/nginx/www/sito1;
    	}
    }
/etc/nginx/sites-available/sito2 
    server {
        listen       80;
        server_name  sito2;
        access_log /var/log/nginx/sito2.access.log;

        location / {
    	    ## Only allow these request methods ##
    	    if ($request_method !~ ^(GET|HEAD|POST)$ ) {
        	return 444;
    	    }
    	    ## Do not accept DELETE, SEARCH and other methods ##

    	    ## Deny certain Referers ###
    	    if ( $http_referer ~* (babes|forsale|girl|jewelry|love|nudit|organic|poker|porn|sex|teen) )
    	    {
        	# return 404;
         	return 403;
    	    }
    	    ##
            proxy_pass http://appservers;
            include /etc/nginx/conf.d/proxy.conf;
       	}
	location ~* ^.+.(jpe?g|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|js|swf|avi|mp3)$ {
    	    ## Only allow these request methods ##
    	    if ($request_method !~ ^(GET|HEAD|POST)$ ) {
        	return 444;
    	    }
    	    ## Do not accept DELETE, SEARCH and other methods ##

    	    ## Deny certain Referers ###
    	    if ( $http_referer ~* (babes|forsale|girl|jewelry|love|nudit|organic|poker|porn|sex|teen) )
    	    {
        	# return 404;
         	return 403;
    	    }
    	    ##

            expires 30d;
            root /usr/share/nginx/www/sito2;
    	}
    }

Quindi abilitiamo i due siti e ricarichiamo la configurazione di nginx:

ln -s /etc/nginx/sites-available/sito1 /etc/nginx/sites-enambled
ln -s /etc/nginx/sites-available/sito2 /etc/nginx/sites-enambled
/etc/init.d/nginx restart

3) Configurazione di nginx sull’application server
Analoga configurazione andrà eseguita sull’application server. Partiamo con il file di configurazione generale di nginx:

/etc/nginx/nginx.conf
user www-data;
worker_processes 4;
pid /var/run/nginx.pid;

events {
	worker_connections 768;
	# multi_accept on;
}

http {

	##
	# Basic Settings
	##

	sendfile on;
	tcp_nopush on;
	tcp_nodelay on;
	keepalive_timeout 65;
	types_hash_max_size 2048;

	include /etc/nginx/mime.types;
	default_type application/octet-stream;

	##
	# Logging Settings
	##

	access_log /var/log/nginx/access.log;
	error_log /var/log/nginx/error.log;

	##
	# Gzip Settings
	##

	gzip on;
	gzip_disable "msie6";

        ##
	# Virtual Host Configs
	##

	include /etc/nginx/conf.d/*.conf;
	include /etc/nginx/sites-enabled/*;
}

E i file dei due siti ospitati:

/etc/nginx/sites-available/sito1
           server {
                listen 80;
                server_name sito1

                root /usr/share/nginx/www/sito1;
                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:9001;
                  	fastcgi_param  SCRIPT_FILENAME /usr/share/nginx/www$fastcgi_script_name;
                  	include fastcgi_params;
                }

       }
/etc/nginx/sites-available/sito2 
           server {
                listen 80;
                server_name sito2

                root /usr/share/nginx/www/sito2;
                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:9002;
                  	fastcgi_param  SCRIPT_FILENAME /usr/share/nginx/www$fastcgi_script_name;
                  	include fastcgi_params;
                }

       }

Da notare la porta diversa nella direttiva fastcgi_pass: difatti ciascun sito avrà la propria istanza di php-fpm che dovrà rispondere ad una porta univoca. Verdemo come al prossimo punto, per il momento limitiamoci a rendere attive le modifiche con:

ln -s /etc/nginx/sites-available/sito1 /etc/nginx/sites-enambled
ln -s /etc/nginx/sites-available/sito2 /etc/nginx/sites-enambled
/etc/init.d/nginx restart

4) Configurazione di php-fpm
Quindi ciascun sito, avrà la propria istanza di php-fpm avviata. Per farlo è necessario creare un file di configurazione per ogni sito in /etc/php5/fpm/pool.d:

/etc/php5/fpm/pool.d/sito1
[sito1]
listen = 127.0.0.1:9001
user = sito1
group = sito1
pm = dynamic
pm.max_children = 25
pm.start_servers = 4
pm.min_spare_servers = 2
pm.max_spare_servers = 10
pm.max_requests = 500
/etc/php5/fpm/pool.d/sito2
[sito1]
listen = 127.0.0.1:9002
user = sito1
group = sito1
pm = dynamic
pm.max_children = 25
pm.start_servers = 4
pm.min_spare_servers = 2
pm.max_spare_servers = 10
pm.max_requests = 500

Quindi riavviamo php-fpm con:

/etc/init.d/php5-fpm restart
lug 202011
 

In quest’ultimo articolo, completeremo l’installazione del sistema con l’installazione del server mysql e con il download, l’installazione e la configurazione di WordPress.
Partiamo con la creazione della VM destinata al database: sarà una semplicissima VM con installato MySQL.

Creiamo questa VM partendo da una installazione “vanilla” di Debian Squeeze (6.0.1), dotando la VM di 512MB di RAM, 1 VCPU (CPU virtuale), 0.25 CPU (assegnamo il 50% della potenza di una CPU fisica), 1 scheda di rete con IP privato, 1024 MB Disco Swap e un disco Datablock per il mysql.

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:

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

e il file /etc/hostname

/etc/hostname
mysql-server1

Assicuriamoci di aver montato il datablock nella directory /var/lib/mysql:

/etc/fstab
/dev/sdc       /var/lib/mysql   ext3    defaults        0       0

Installazione di mysql
Per installare mysql è sufficiente lanciare il comando:

apt-get install mysql-server

e modifichiamo il file /etc/mysql/my.cnf per rispondere alle richieste di rete:

/etc/mysql/my.cnf
...
bind-address            = 0.0.0.0
...

Infine facciamo in modo che l’utente root possa autenticarsi sul server mysql da qualsiasi host in rete locale:

mysql -p
mysql> create database wordpress;
mysql> GRANT ALL ON wordpress.* TO 'wordpress'@'%' identified by 'password01';
mysql> flush privileges;
mysql> quit;

A questo punto potete provare a spostarvi su vm2 e lanciare il comando:

mysql -h mysql -p -u wordpress wordpress

per verificare che l’installazione di mysql sia corretta

Installazione di WordPress
Spostamoci su vm1 e lanciamo i seguenti comandi:

cd /var/www
wget http://wordpress.org/latest.tar.gz
tar zxvf latest.tar.gz
rm latest.tar.gz
chown -R www-data:www-data wordpress
mv wordpress/* .
rmdir wordpress

Ora andando via web all’indirizzo pubblico del load balancer sarà possibile iniziare la procedura standard di installazione di wordpress. Ricordarsi di inserire come dati di autenticazione sul database;

Database Name: wordpress
User Name: wordpress
Password: password01
Database Host: mysql

Alla fine del processo di installazione, wordpress sarà attivo e funzionante come su un qualsiasi altro hosting… solo un po’ più veloce.

Ottimizzazione di WordPress
L’ottimizzazione di WordPress, in realtà riguarda solamente l’installazione di due plugin.
Il primo plugin da installare è senza dubbio il più importante ed è nginx Compatibility: questo permette di sfruttare la configurazione di nginx nel server vm2 per attivare i permalink di wordpress proprio come su apache. La funzionalità dei permalink, permette di modificare il comportamento dei link di wordpress per renderli più idonei al funzionalmento con i motori di ricerca.
Il secondo plugin da installare per sfruttare appieno l’installzione è W3 Total Cache: questo plugin permette di gestire in maniera efficente memcached e apc per tenere una cache sia del precompilato php (per questo il mio consiglio è di utilizzare APC) sia per tenere una cache di oggetti e query al database (e per questo è praticamente obbligatorio usare memcached).

lug 182011
 

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:

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

e il file /etc/hostname

/etc/hostname
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

/etc/apt/sources.list
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:

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

Configuriamo identd con:

/etc/default/nfs-common
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:

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

Come anticipato in questo articolo, ho spostato il blog su una piattaforma cloud IaaS realizzata con OpenNebula e datastore su filesystem MooseFS, realizzata in collaborazione con Genesi Srl.

Le VM che ospitano il blog, non sono delle semplici istanze LAMP, ma seguono il metodo per realizzare un hosting scalabile ottimizzato per WordPress illustrato negli articoli che stiamo pubblicando in questi giorni.

Purtroppo, trattandosi di una variazione di indirizzo IP sul DNS, sono necessarie 24/36 ore perchè la modifica si propaghi, periodo nel quale potrebbero verificarsi momentanei disservizi per i quali ci scusiamo anticipatamente.

Se anche tu hai un blog wordpress e vuoi ospitarlo su questa piattaforma, contattami!

lug 142011
 

Come annunciato nel precedente articolo, vm1 sarà la VM di frontend, l’unica dotata di indirizzo IP pubblico che gestirà le richieste provenienti dal web.

Creiamo questa VM partendo da una installazione “vanilla” di Debian Squeeze (6.0.1), dotando la VM di 256 MB di RAM, 1 VCPU (CPU virtuale), 0.25 CPU (assegnamo il 25% della potenza di una CPU fisica), 2 schede di rete (una con IP pubblico e una con IP privato), 512 MB Disco Swap e 1024 MB Datablock per li contenuti statici e i file PHP.

Configurazione di base
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:

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

Inoltre modifichiamo l’hostname:

/etc/hostname
lb

Installazione di nginx
Come già detto in questo articolo, nginx è un server web molto veloce che ben si adatta per fare da frontend per rispondere alle richieste provenienti dal web; rispetto all’installazione del precedente articolo in cui gestivamo le richieste di contenuti statici in locale e reindirizzavamo le richieste di file php al server Apache, aggiungeremo una sezione per predisporre il server in modo da gestire il reindirizzamento delle richieste PHP a più appserver.
E’ possibile installare nginx su Debian attraverso un pacchetto non ufficiale; pertanto è necessario modificare il file con i repository di debian aggiungendo la seguente riga:

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

a questo punto dobbiamo aggiungere la chiave GnuPG così:

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

Ora siamo pronti ad installare nginx attraverso il seguente comando:

apt-get update
apt-get install nginx

La web directory di nginx è usr/share/nginx/www/, per cui creiamo un link simbolico in modo che in futuro sia più facile accedervi:

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

Ora modifichiamo il file /etc/fstab in modo da montare automaticamente il Datablock aggiungendo la seguente riga:

/etc/fstab
/dev/sdc        /usr/share/nginx/www           ext3    defaults 0       0

e montiamo il disco con:

mount -a

Ora è giunto il momento di configurare nginx.

/etc/nginx/nginx.conf
user www-data;
worker_processes  2;
error_log  /var/log/nginx/error.log;
pid        /var/run/nginx.pid;
events {
    worker_connections  1024;
}
http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    access_log /var/log/nginx/access.log;
    server_names_hash_bucket_size 64;
    sendfile        on;
    tcp_nopush     on;
    #keepalive_timeout  0;
    keepalive_timeout  65;
    tcp_nodelay        on;
    gzip              on;
    gzip_comp_level   5;
    gzip_http_version 1.0;
    gzip_min_length   0;
    gzip_vary         on;

    upstream appservers {
        fair weight_mode=idle no_rr;
        server php-appserver1 weight=10;
    }

    server {
        listen       80;
        server_name  _;
        access_log /var/log/nginx/default.access.log;

        location / {
            proxy_pass http://appservers;
            include /etc/nginx/conf.d/proxy.conf;
       }
       location ~* ^.+.(jpe?g|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|js|swf|avi|mp3)$ {
            expires 30d;
            root /usr/share/nginx/www;
        }
    }
}
include /etc/nginx/sites-enabled/*;

La configurazione di nginx è simile a quella del precedente articolo, se si esclude l’aggiunta della sezione “upstream” che assolve il compito di load balancer (anche se in questo momento abbiamo un solo server). Esiste un modulo standard per il load balancer, però preferisco usare il modulo alternativo “fair” che meglio si adatta all’idea del cloud: questo modulo, al contrario dello standard, tiene conto di quante richieste contemporanee sta gestendo ciascun appserver. Il parametro weight_mode=idle no_rr obbliga il load balancer a disabilitare la funzionalità round-robin e girare le richeste al primo appserver finchè non raggiunge il valore di picco settato attraverso il parametro weight: ciò vuol dire che se utilizzassimo un sistema di cloud in cui si paga solo il tempo in cui la macchina lavora, non avremo consumi derivanti dall’utilizzo di server poco sfruttati ma si riesce a massimizzare l’utilizzo di ciascun appserver.
Ovviamente, continuando nell’analisi, ogni linea “server” identifica un application server e, come già detto, il parametro weight identifica il numero massimo di connessioni gestibili dal server.

Ora aggiungiamo il file di configurazione del proxy, identico a quello del precedente articolo:

/etc/nginx/conf.d/proxy.conf
proxy_redirect          off;
proxy_set_header        Host            $host;
proxy_set_header        X-Real-IP       $remote_addr;
proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size    10m;
proxy_connect_timeout   90;
proxy_send_timeout      90;
proxy_read_timeout      90;
proxy_buffer_size   16k;
proxy_buffers       32   16k;
proxy_busy_buffers_size 64k;

Rimuoviamo il file /etc/nginx/sites-enabled/default in quanto è già presente nel file nginx.conf la configurazione del default virtualhost:

rm /etc/nginx/sites-enabled/default

Installazione di NFS ed export della directrory www
Ora installiamo NFS per esportare la directory /usr/share/nginx/www verso gli appserver:

apt-get install nfs-kernel-server nfs-common portmap

ed editiamo il file /etc/exports aggiungendo la seguente riga:

/etc/exports
/usr/share/nginx/www    10.10.1.2(rw,sync,no_root_squash,no_subtree_check)

Quindi configuriamo l’avvio di idmapd per sincronizzare l’id utente tra server e client:

/etc/default/nfs-common
NEED_IDMAPD=yes
NEED_GSSD=no
/etc/default/nfs-kernel-server
NEED_SVCGSSD=no

Ora riavviamo il demone con:

/etc/init.d/nfs-common restart
/etc/init.d/nfs-kernel-server restart

esportiamo il filesystem con:

exportfs -a

Configurazione di IP Forwarding
Il nostro Load Balancer si occuperà come ultima cosa di fungere da gateway per i server interni.
Per far ciò aggiungiamo le seguenti righe nel file /etc/rc.local:

/etc/rc.local
iptables --flush                         # Flush all the rules in filter and nat tables
iptables --table nat --flush
iptables --delete-chain                  # Delete all chains that are not in default filter and nat table
iptables --table nat --delete-chain

# Set up IP FORWARDing and Masquerading
iptables --table nat --append POSTROUTING --out-interface eth0 -j MASQUERADE
iptables --append FORWARD --in-interface eth1 -j ACCEPT         # Assuming one NIC to local LAN

echo 1 > /proc/sys/net/ipv4/ip_forward    # Enables packet forwarding by kernel