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

Articoli simili

 Leave a Reply

(required)

(required)

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>