Implantation



Ce tutoriel développe la mise en place d'un équilibrage de la charge pour une pool de trois serveurs Web Apache, contrôlée par deux répartiteurs.
Les serveurs Web ont une configuration pratiquement identique et utiliseront une ressource commune sur un NAS, puisqu'ils doivent fournir les mêmes informations aux visiteurs de nos sites Web.

Le principe de base consiste à interposer entre les consommateurs et une pool de ressources (serveurs Web dans cet exemple) un dispositif (le répartiteur) qui connaît l'état d'occupation de chaque ressource contenue dans la pool et qui est capable de diriger le consommateur vers la ressource la moins occupée, ou la plus facilement accessible.

Nous utiliserons le logiciel Keepalived. Il permet d'interfacer très facilement les commandes du projet LVS (Linux Virtual Server), de vérifier la santé des serveurs dans la pool LVS et grâce au protocole de redondance de routeur virtuel (VRRP), d'assurer la disponibilité des répartiteurs.

Les avantages de la répartition de charge :

- Augmentation de la disponibilité de service.
- Amélioration des temps de réponse des services.
- Capacité à palier la défaillance d'une ou de plusieurs machines.
- Possibilité d'ajouter des serveurs sans interruption de service.


Note :LVS et VRRP n'ont rien à voir avec la répartition de charge de type Round-robin effectué au niveau des serveurs DNS. Par exemple, l'adresse mx.alex.fr pointe vers mx1.alex.fr et mx2.alex.fr


Il y a trois techniques de répartition de charge IP. On peut avoir un serveur virtuel via du NAT, via du tunnel IP ou via du routage direct. Pour plus de détails voir le site LVS.

J'ai choisi la technique du routage direct car elle me semble la plus intéressante pour mon implantation.

Description des machines :
L'accès aux sites Web se fait par une seule IP publique (123.45.67.1) qui est associée à plusieurs sous domaines DNS (sous_domaine.alex.fr).
Le répartiteur MASTER (balancer1) active cette IP publique alors que le répartiteur BACKUP (balancer2) est en veille (les répartiteurs vérifient mutuellement leur état de santé).
Chaque serveur Web dans la pool possèdent deux cartes réseau.
La première est connectée au réseau privé (172.16.0.x/24) pour accéder aux services MySQL, LDAP, NFS, ...
La deuxième est connectée au réseau public, est dispose de deux adresses IP :
- Une adresse privée de classe C (192.168.1.x/24) pour que les deux répartiteurs l'interrogent et connaissent l'état de santé du service Web.
- Une adresse IP publique "fantôme" en alias (123.45.67.3), utilisée uniquement pour ouvrir une route vers la passerelle (123.45.67.14). Elle ne répond à aucune requête ARP et IP.

Et pour finir, sur la boucle locale, un alias IP publique (123.45.67.1) associé aux sous domaines DNS, qui ne répond pas aux requêtes ARP (donc pas connu par le routeur).


Principe de fonctionnement :
Un visiteur fait une requête HTTP/HTTPS vers l'adresse IP publique 123.45.67.1, le routeur de notre réseau demande au niveau ethernet quelle est l'adresse MAC associée à l'adresse IP 123.45.67.1.
Les serveurs Web de la pool ne répondent pas, alors qu'ils possèdent chacun cette adresse IP en alias.
Le répartiteur MASTER répond en donnant son adresse MAC pour accepter la requête du visiteur. Il transfère la requête vers un des serveurs Web de la pool en modifiant l'adresse MAC de destination.
Le serveur Web reçoit cette requête comme si elle venait directement du visiteur. Apache traite la requête puis y répond, la machine hébergeant le service Apache demande au niveau ethernet quelle est l'adresse MAC associée à l'adresse IP du routeur afin de joindre le visiteur.
Le routeur de notre réseau répond et la requête HTTP/HTTPS arrive au visiteur.




Configuration des répartiteurs balancer1 et balancer2



Configuration de Keepalived

Installation des packages


Sur balancer1.alex.dmz et balancer2.alex.dmz :

keepalived



Modifiez le fichier /etc/network/interfaces sur balancer1 :


# The loopback network interface
auto lo
iface lo inet loopback

# Interface pour vérifier la santé de la pool de serveurs.
auto eth0
allow-hotplug eth0
iface eth0 inet static
address 192.168.1.1
netmask 255.255.255.0

# Interface d'administration.
auto eth1
allow-hotplug eth1
iface eth1 inet static
address 172.16.0.11
netmask 255.255.255.0



Modifiez le fichier /etc/network/interfaces sur balancer2 :


# The loopback network interface
auto lo
iface lo inet loopback

auto eth0
allow-hotplug eth0
iface eth0 inet static
address 192.168.1.2
netmask 255.255.255.0

auto eth1
allow-hotplug eth1
iface eth1 inet static
address 172.16.0.12
netmask 255.255.255.0



Modifiez le fichier /etc/keepalived/keepalived.conf sur balancer1 :


! MASTER configuration File for keepalived

global_defs {
    # Adresses mail des destinataires.
    notification_email {
        superviseur@alex.lan
        superviseur@unfai.com
    }
    # Adresse de l'émetteur.
    notification_email_from balancer1@alex.dmz
    # Adresse IP du serveur mail distant (smtp.alex.dmz).
    smtp_server 172.16.0.7
    smtp_connect_timeout 30
    # Nom identifiant la machine (pas forcement son hostname).
    router_id balancer1
}

# Configuration d'une instance VRRP pour l'interface du coté externe,
# connectée au réseau IP Internet.
# Nous utilisons une seule instance dans cet exemple, mais selon vos
# besoins vous pouvez utiliser une autre instance VRRP pour l'interface
# du coté interne, sur le réseau IP coté LAN privé.
vrrp_instance outside_network {
    # Déclaration de cette machine comme MASTER.
    state MASTER
    # Nom de l'interface pour cette instance (ici, coté externe).
    interface eth0
    # Numéro de l'identifiant VRRP (n° arbitraire, commun aux membres de
    # cette instance)
    virtual_router_id 1
    # Priorité pour l'élection entre le MASTER et les autres machines en
    # attente (BACKUP).
    priority 100
    # Intervalle de vérification (secondes) de la santé des membres VRRP.
    advert_int 1
    # Permet de synchroniser les connexions entre le MASTER et le(s)
    # BACKUP en cas de basculement.
    # Pour ne pas perdre les connexions TCP en cours.
    lvs_sync_daemon_interface eth0

    # Authentification entre les membres de cette instance, doit être le
    # même sur tous les membres.
    authentication {
        auth_type PASS
        auth_pass myvrrpdpassword
    }

    # Adresses IP virtuelles qui seront activées ou désactivées selon le
    # passage de l'état MASTER à BACKUP. On en utilise qu'une seule ici.
    virtual_ipaddress {
        123.45.67.1/28 brd 123.45.67.15 dev eth0
    }

    # Vous pouvez ajouter ou supprimer des routes selon le changement
    # d'état (MASTER/BACKUP).
    #virtual_routes {
    # 0.0.0.0/0 via 123.45.67.14
    #}
}

# Déclaration d'un serveur virtuel avec l'IP 123.45.67.1 écoutant sur le
# port 80.
virtual_server 123.45.67.1 80 {
    # Intervalle entre chaque vérification de la santé des serveurs
    # réels.
    delay_loop 6
    # Algorithme de répartition des requêtes vers les serveurs réels.
    # Voir man ipvsadm (rr|wrr|lc|wlc|lblc|sh|dh).
    lb_algo wlc
    # Techniques de répartition de charge IP (NAT|DR|TUN).
    lb_kind DR
    # Délai de persistance de l'association d'une requête vers un
    # serveur réel.
    # Une valeur (secondes) à zéro, permet d'ignorer cette association.
    # Mettez à zéro pour faire vos tests.
    persistence_timeout 5
    # Seul le protocole TCP est implémenté.
    protocol TCP
    # Si l'adresse IP de ce serveur virtuel n'a pas pu être activée, le
    # contrôle des serveurs réels est suspendu.
    ha_suspend
    # Vous pouvez définir l'adresse d'un serveur vers qui rediriger les
    # requêtes si tous les serveurs réels sont injoignables.
    #sorry_server 123.45.67.12 80

    # Définition des serveurs réels écoutant sur le port 80.
    # node1 ici :
    real_server 192.168.1.3 80 {
        # Pondération associée à ce serveur réel. Si vous avez un serveur
        # plus puissant que les autres par exemple, vous pouvez lui
        # mettre une plus grande valeur pour qu'il soit plus souvent         # utilisé.
        weight 1
        # Si une vérification de la santé de ce serveur réel échoue, la
        # pondération passera à zéro => il ne sera plus utilisé.
        inhibit_on_failure

        # Méthode utilisée pour contrôler la santé de ce serveur réel.
        HTTP_GET {
            url {
                # URL à interroger, ici http://IP/
                # exemple : path /un/dossier/
                path /
                # Code de retour attendu pour valider son état de santé.
                status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

    # node2 :
    real_server 192.168.1.4 80 {
        weight 1
        inhibit_on_failure

        HTTP_GET {
            url {
                path /
                status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

    # node3 :
    real_server 192.168.1.5 80 {
        weight 1
        inhibit_on_failure

        HTTP_GET {
            url {
                path /
                status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

# Déclaration d'un serveur virtuel avec l'IP 123.45.67.1 écoutant sur le
# port 443.
virtual_server 123.45.67.1 443 {
    delay_loop 6
    lb_algo wlc
    lb_kind DR
    persistence_timeout 0
    protocol TCP
    ha_suspend

    # node1 :
    real_server 192.168.1.3 443 {
        weight 1
        inhibit_on_failure
        SSL_GET {
            url {
                path /
                status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

    # node2 :
    real_server 192.168.1.4 443 {
        weight 1
        inhibit_on_failure
        SSL_GET {
            url {
                path /
                status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

    # node3 :
    real_server 192.168.1.5 443 {
        weight 1
        inhibit_on_failure
        SSL_GET {
            url {
                path /
                status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}



Modifiez le fichier /etc/keepalived/keepalived.conf sur balancer2 :


! BACKUP configuration File for keepalived

global_defs {
    notification_email {
        superviseur@alex.lan
        superviseur@unfai.com
    }
    notification_email_from balancer2@alex.dmz
    smtp_server 172.16.0.7
    smtp_connect_timeout 30
    router_id balancer2
}

vrrp_instance outside_network {
    # Déclaration de cette machine comme BACKUP.
    state BACKUP
    interface eth0
    virtual_router_id 1
    # Nous sommes sur la machine BACKUP, la priorité doit être inférieure
    # au MASTER.
    priority 50
    advert_int 1
    lvs_sync_daemon_interface eth0
    # Quand le MASTER n'est plus disponible, une machine BACKUP est élue
    # MASTER en intérim. Quand le MASTER redevient disponible, la machine
    # BACKUP qui était MASTER, attend un certain temps avant de
    # redonner le pouvoir au MASTER. Le temps que l'état des connexions
    # TCP soit synchronisé entre les deux machines.
    # A mettre sur le BACKUP uniquement.
    preempt_delay 20

    authentication {
        auth_type PASS
        auth_pass myvrrpdpassword
    }

    virtual_ipaddress {
        123.45.67.1/28 brd 123.45.67.15 dev eth0
    }
}

# Déclaration d'un serveur virtuel avec l'IP 123.45.67.1 écoutant sur le
# port 80.
virtual_server 123.45.67.1 80 {
    delay_loop 6
    lb_algo wlc
    lb_kind DR
    persistence_timeout 0
    protocol TCP
    ha_suspend
    #sorry_server 123.45.67.12 80

    # Définition des serveurs réels écoutant sur le port 80.
    real_server 192.168.1.3 80 {
        weight 1
        inhibit_on_failure

        HTTP_GET {
            url {
                path /
                status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

    real_server 192.168.1.4 80 {
        weight 1
        inhibit_on_failure

        HTTP_GET {
            url {
                path /
                status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

    real_server 192.168.1.5 80 {
        weight 1
        inhibit_on_failure

        HTTP_GET {
            url {
                path /
                status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

# Déclaration d'un serveur virtuel avec l'IP 123.45.67.1 écoutant sur le
# port 443.
virtual_server 123.45.67.1 443 {
    delay_loop 6
    lb_algo wlc
    lb_kind DR
    persistence_timeout 0
    protocol TCP
    ha_suspend

    real_server 192.168.1.3 443 {
        weight 1
        inhibit_on_failure
        SSL_GET {
            url {
                path /
                status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

    real_server 192.168.1.4 443 {
        weight 1
        inhibit_on_failure
        SSL_GET {
            url {
                path /
                status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

    real_server 192.168.1.5 443 {
        weight 1
        inhibit_on_failure
        SSL_GET {
            url {
                path /
                status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}





Configuration de la pool de serveurs Web



Configurez sur chaque noeuds l'adresse IP de l'interface connectée au réseau privé (172.16.0.x/24) pour la première partie du tutoriel.

Installation des packages


Sur les trois serveurs Web :
iproute arptables nfs-common postfix monit apache2 openssl (php5 php5-mysql)

Répondre dans l'interface de configuration de Postfix :
         Type de configuration : Système satellite
         Nom de courrier : node1*.alex.dmz
         Serveur relais SMTP : smtp.alex.dmz

Note* : Mettez le nom d'hôte (node1, node2, ...)


Modifiez le fichier /etc/hosts sur chaque serveur en adaptant les adresses IP :

127.0.0.1      localhost
172.16.0.13    node1.alex.dmz
192.168.1.3    node1



Modifiez aussi le fichier /etc/resolv.conf :

search alex.dmz alex.fr alex.com alex.org alex.dmz
nameserver 172.16.0.1
nameserver 172.17.0.1




Configuration de la partie cliente NFS

Pour que les données des sites Web soit disponibles sur chaque serveurs Web, nous allons utiliser un partage NFS. Si vous disposez d'un SAN cette partie ne vous concerne pas.

Modifiez le fichier /etc/default/nfs-common sur chaque serveurs Web, pour l'utilisation de NFSv4 :

STATDOPTS=

NEED_LOCKD=

# Do you want to start the idmapd daemon? It is only needed for NFSv4.
NEED_IDMAPD=yes

NEED_GSSD=



Redémarrez le service nfs-common.




Configuration de Postfix

Modifiez le fichier /etc/aliases sur chaque serveurs Web, pour rediriger les mails envoyés au compte root vers un autre compte de votre choix (que vous avez créé dans un des annuaires par exemple) :

# See man 5 aliases for format
postmaster:    root
root:          blackhole@alex.dmz



Lancez la commande newaliases pour reconstruire la base de données des alias mail.

Redémarrez le service Postfix.



Configuration du serveur NFS

Sur la machine nas1 (ou plutôt la machine qui a le partage DRBD monté).
Modifiez le fichier /export/etc/exports :

# On ajoute les Ips 172.16.0.13, 172.16.0.14, 172.16.0.15
# mais en désactivant la transformation UID/GID 0 en UID/GID anonyme.
# En clair le compte root local a tous les droits sur ce partage.
/export 172.16.0.8(rw,sync,fsid=0,acl,no_subtree_check,root_squash) 172.16.0.13(rw,sync,fsid=0,acl,no_subtree_check,no_root_squash) 172.16.0.14(rw,sync,fsid=0,acl,no_subtree_check,no_root_squash) 172.16.0.15(rw,sync,fsid=0,acl,no_subtree_check,no_root_squash)



On prends en compte les modifications :

nas1:~# exportfs -r

nas1:~# exportfs -v
/export 172.16.0.8(rw,wdelay,root_squash,no_subtree_check,fsid=0,anonuid=65534,anongid=65534)
/export 172.16.0.13(rw,wdelay,no_root_squash,no_subtree_check,fsid=0,anonuid=65534,anongid=65534)
/export 172.16.0.14(rw,wdelay,no_root_squash,no_subtree_check,fsid=0,anonuid=65534,anongid=65534)
/export 172.16.0.15(rw,wdelay,no_root_squash,no_subtree_check,fsid=0,anonuid=65534,anongid=65534)
nas1:~#




Configuration d'Apache2

Sur node1 uniquement :

Arrêtez le service Apache2 et créez un répertoire /etc/apache2/ssl.

On génère un certificat SSL pour les sous domaines de alex.fr uniquement, puisque l'hébergement virtuel par nom ne peut pas être utilisé avec des serveurs sécurisés SSL à cause de la nature même du protocole SSL. Vous ne pouvez avoir qu'un seul certificat SSL par IP pour vos hôtes virtuels.
Si vous voulez utilisez le protocole HTTPS pour les sous domaines alex.com par exemple, vous devez utiliser une autre IP (123.45.67.2) et lui associer un autre certificat SSL.

node1:~# cd /etc/apache2/ssl
node1:/etc/apache2/ssl#

node1:/etc/apache2/ssl# openssl req -new -x509 -nodes -out alex.fr_apache2.crt -keyout alex.fr_apache2.key -days 3650

Generating a 1024 bit RSA private key
..........++++++
.++++++
writing new private key to 'alex.fr_apache2.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:FR
State or Province Name (full name) [Some-State]:Haute-Savoie
Locality Name (eg, city) []:Alex
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Alex
Organizational Unit Name (eg, section) []:Alex
Common Name (eg, YOUR name) []:*.alex.fr
Email Address []:webmaster@alex.fr
node1:/etc/apache2/ssl#



Changez les droits :

node1:/etc/apache2/ssl# chmod 600 /etc/apache2/ssl/*.key



Modifiez le fichier /etc/apache2/ports.conf :

Listen 80
Listen 443



Activez le module SSL :

node1:/etc/apache2/ssl# a2enmod ssl



Désactivez la configuration du site par défaut :

node1:/etc/apache2/ssl# a2dissite default



Créez le fichier /etc/apache2/sites-available/000-http qui contiendra tous les hôtes virtuels HTTP (deux dans cet exemple) :

NameVirtualHost *:80

<VirtualHost *:80>
    ServerAdmin webmaster@alex.fr
    ServerName www.alex.fr

    # Le partage NFS sera monté dans /import
    # Nous verrons plus bas comment procéder.
    DocumentRoot /import/www/htdocs/
    <Directory />
        Options FollowSymLinks
        AllowOverride None
    </Directory>
    <Directory /import/www/htdocs/>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride None
        Order allow,deny
        allow from all
    </Directory>

    ScriptAlias /cgi-bin/ /import/www/cgi-bin/
    <Directory "/import/www/cgi-bin">
        AllowOverride None
        Options ExecCGI -MultiViews +SymLinksIfOwnerMatch
        Order allow,deny
        Allow from all
    </Directory>

    ErrorLog /import/www/log/error.log
    LogLevel warn

    CustomLog /import/www/log/access.log combined
    ServerSignature Off

</VirtualHost>

<VirtualHost *:80>
    ServerAdmin webmaster@alex.fr
    ServerName groupware.alex.fr

    DocumentRoot /import/groupware/htdocs/
    <Directory /import/groupware/htdocs/>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride None
        Order allow,deny
        allow from all
    </Directory>

    ErrorLog /import/groupware/log/error.log
    LogLevel warn

    CustomLog /import/groupware/log/access.log combined
    ServerSignature Off

</VirtualHost>



Note : Les adresses DNS doivent être créées et résolvables avant de démarrer Apache.


Créez le fichier /etc/apache2/sites-available/000-https qui contiendra tous les hôtes virtuels HTTPS (deux dans cet exemple) :

NameVirtualHost *:443

<VirtualHost *:443>
    ServerAdmin webmaster@alex.fr
    ServerName secure.alex.fr

    # Pour activer SSL.
    SSLEngine on
    SSLCertificateFile /etc/apache2/ssl/alex_apache2.crt
    SSLCertificateKeyFile /etc/apache2/ssl/alex_apache2.key

    DocumentRoot /import/secure/htdocs/
    <Directory />
        Options FollowSymLinks
        AllowOverride None
    </Directory>
    <Directory /import/secure/htdocs/>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride None
        Order allow,deny
        allow from all
    </Directory>

    ScriptAlias /cgi-bin/ /import/secure/cgi-bin/
    <Directory "/import/secure/cgi-bin">
        AllowOverride None
        Options ExecCGI -MultiViews +SymLinksIfOwnerMatch
        Order allow,deny
        Allow from all
    </Directory>

    ErrorLog /import/secure/log/error.log
    LogLevel warn

    CustomLog /import/secure/log/access.log combined
    ServerSignature Off

</VirtualHost>

<VirtualHost *:443>
    ServerAdmin webmaster@alex.fr
    ServerName groupware.alex.fr

    SSLEngine on
    SSLCertificateFile /etc/apache2/ssl/alex_apache2.crt
    SSLCertificateKeyFile /etc/apache2/ssl/alex_apache2.key

    DocumentRoot /import/groupware/htdocs/
    <Directory /import/groupware/htdocs/>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride None
        Order allow,deny
        allow from all
    </Directory>

    ErrorLog /import/groupware/log/error.log
    LogLevel warn

    CustomLog /import/groupware/log/access.log combined
    ServerSignature Off

</VirtualHost>



Activez les virtualhosts configurés dans les deux fichiers précédant :

node1:~# a2ensite 000-http
node1:~# a2ensite 000-https



Créez le répertoire pour le montage NFS :

node1:~# mkdir /import



Modifiez le fichier /etc/fstab :

...
172.16.0.19:/www    /import  nfs4  rsize=32768,wsize=32768,soft  0    0



Montez le partage NFS :

node1:~# mount /import



Nous allons créer les répertoires pour nos hôtes virtuels :

node1:~# cd /import
node1:/import#

node1:/import# mkdir -p www/htdocs www/cgi-bin www/log www/stat
node1:/import# mkdir -p groupware/htdocs groupware/log groupware/stat
node1:/import# mkdir -p secure/htdocs secure/cgi-bin secure/log secure/stat



Créez un fichier index.html pour faire vos tests :

node1:/import# echo www > www/htdocs/index.html
node1:/import# echo groupware > groupware/htdocs/index.html
node1:/import# echo secure > secure/htdocs/index.html



On change les droits :

node1:/import# chown -R www-data: /import/*
node1:/import# chmod -R 770 /import/*



La configuration des serveurs Web doit être la même. Nous allons copier le répertoire /etc/apache2 vers le partage NFS :

node1:/import# cp -r /etc/apache2



On renomme le répertoire et on fait un lien symbolique de /import/apache2 vers /etc/ :

node1:/import# mv /etc/apache2 /etc/apache2.local
node1:/import# ln -s /import/apache2 /etc/




Configuration de Monit

Toujours sur node1, modifiez le fichier /etc/default/monit :

startup=1

CHECK_INTERVALS=60



Modifiez le fichier /etc/monit/monitrc :

# Fichier de configuration pour les noeuds de la pool LVS
#
## Global section
#
set logfile syslog facility log_daemon
set mailserver localhost
set eventqueue basedir /var/spool/monit slots 100
set alert superviseur@alex.dmz
set alert superviseur@unfai.com

## Services
#
# Liste des ressources à surveiller.
#

# Charge serveur
check system localhost
    if loadavg (1min) > 30 for 8 cycles then alert
    group system

# Apache2
check process apache2 with pidfile /var/run/apache2.pid
    start program = "/etc/init.d/apache2 start"
    stop program = "/etc/init.d/apache2 stop"
    if cpu > 95% for 10 cycles then restart
    if children > 250 then restart
    if failed host 127.0.0.1 port 80 protocol HTTP and request "/" with timeout 10 seconds then restart
    if failed host 127.0.0.1 port 443 type TCPSSL protocol HTTP and request "/" with timeout 10 seconds then restart
    if 5 restarts within 5 cycles then timeout
    group web
    depends on nfs-mountpoint-import

# nfs-mountpoint-import
# On vérifie la présence d'un fichier dans le partage NFS.
check file nfs-mountpoint-import with path /import/file_checking_for_monit
    start program = "/bin/mount /import"
    stop program = "/bin/umount -f /import"
    if failed permission 0400 then restart
    group web

# Postfix
check process postfix with pidfile /var/spool/postfix/pid/master.pid
    start program = "/etc/init.d/postfix start"
    stop program = "/etc/init.d/postfix stop"
    if failed host 127.0.0.1 port 25 protocol SMTP with timeout 10 seconds then restart
    if 5 restarts within 5 cycles then timeout
    group web



Créez le fichier vérifié par Monit dans le partage NFS :

node1:~# touch /import/file_checking_for_monit
node1:~# chmod 400 /import/file_checking_for_monit




Maintenant que toutes les configurations sont faites :
- Copiez depuis node1 les fichiers /etc/default/monit et /etc/monit/monitrc vers les autres noeuds.

- Sur node2 et node3 :
Créez un répertoire /import
Ajoutez le montage NFS dans le fichier /etc/fstab et montez le partage.
Arrêtez le service apache2.
Déplacez le répertoire /etc/apache2 vers /etc/apache2.local
Faites un lien symbolique de /import/apache2 vers /etc/



Configuration des interfaces sur les noeuds LVS

Modifiez le fichier /etc/network/interfaces.

Sur node1 :

# The loopback network interface
auto lo
iface lo inet loopback

# Création de l'alias IP public associé aux sous domaines DNS sur
# l'interface loopback. Pour éviter que l'interface réponde aux
# requêtes ARP, on utilise arptables (comme iptables mais pour ARP).
# L'alias IP est monté avec un masque à 32 (255.255.255.255).
auto lo:0
iface lo:0 inet manual
up arptables -A INPUT -d 123.45.67.1 -j DROP
up ip addr add 123.45.67.1/32 dev lo label lo:0
down ip addr del 123.45.67.1/32 dev lo label lo:0

# Une adresse privée de classe C pour que les deux répartiteurs
# l'interrogent et connaissent l'état de santé du service Web.
auto eth0
allow-hotplug eth0
iface eth0 inet static
address 192.168.1.3
netmask 255.255.255.0

# Création d'un alias "fantôme" avec une adresse IP dans le même réseau
# que l'alias IP public associée aux sous domaines DNS dans le but
# unique d'ouvrir une route vers la passerelle (123.45.67.14).
# Elle ne répond à aucune requête ARP et IP entrante.
auto eth0:0
iface eth0:0 inet static
address 123.45.67.3
netmask 255.255.255.240
pre-up arptables -A INPUT -d 123.45.67.3 -j DROP
up iptables -A INPUT -d 123.45.67.3 -j DROP
gateway 123.45.67.14

# Une adresse privée pour accéder aux services MySQL, LDAP, NFS, ...
auto eth1
allow-hotplug eth1
iface eth1 inet static
address 172.16.0.13
netmask 255.255.255.0



Sur node2 :

# The loopback network interface
auto lo
iface lo inet loopback

# Le même alias IP public associé aux sous domaines DNS.
auto lo:0
iface lo:0 inet manual
up arptables -A INPUT -d 123.45.67.1 -j DROP
up ip addr add 123.45.67.1/32 dev lo label lo:0
down ip addr del 123.45.67.1/32 dev lo label lo:0

auto eth0
allow-hotplug eth0
iface eth0 inet static
address 192.168.1.4
netmask 255.255.255.0

# Le même alias "fantôme".
auto eth0:0
iface eth0:0 inet static
address 123.45.67.3
netmask 255.255.255.240
pre-up arptables -A INPUT -d 123.45.67.3 -j DROP
up iptables -A INPUT -d 123.45.67.3 -j DROP
gateway 123.45.67.14

auto eth1
allow-hotplug eth1
iface eth1 inet static
address 172.16.0.14
netmask 255.255.255.0



Sur node3 :

# The loopback network interface
auto lo
iface lo inet loopback

# Le même alias IP public associé aux sous domaines DNS.
auto lo:0
iface lo:0 inet manual
up arptables -A INPUT -d 123.45.67.1 -j DROP
up ip addr add 123.45.67.1/32 dev lo label lo:0
down ip addr del 123.45.67.1/32 dev lo label lo:0

auto eth0
allow-hotplug eth0
iface eth0 inet static
address 192.168.1.5
netmask 255.255.255.0

# Le même alias "fantôme".
auto eth0:0
iface eth0:0 inet static
address 123.45.67.3
netmask 255.255.255.240
pre-up arptables -A INPUT -d 123.45.67.3 -j DROP
up iptables -A INPUT -d 123.45.67.3 -j DROP
gateway 123.45.67.14

auto eth1
allow-hotplug eth1
iface eth1 inet static
address 172.16.0.15
netmask 255.255.255.0



Reboutez les trois noeuds pour que leurs nouvelles adresses soient activées.

Vérifiez que le montage NFS s'est réalisé, même si Monit doit s'en charger.
Démarrez Keepalived sur les répartiteurs en surveillant les logs (syslog).

Faites des requêtes HTTP/HTTPS depuis un poste tierce sur Internet pour simuler un visiteur.

Sur le routeur, vérifiez par la commande "arp -a" (si c'est un Linux/Unix) que l'adresse MAC du répartiteur MASTER est bien associée à l'IP publique 123.45.67.1.
Contrôlez les logs sur les noeuds Web pour savoir sur quel noeud arrive les requêtes de votre visiteur depuis Internet.







Dernière modification : 09/01/08

 

Copyright © 04/02/2004, Arnofear

Contrat Creative Commons Ce document est publié sous licence Creative Commons
Paternité - Pas d'Utilisation Commerciale - Partage des Conditions Initiales à l'Identique :
http://creativecommons.org/licenses/by-nc-sa/3.0/deed.fr