Configuration des répartiteurs balancer1 et balancer2
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
}
}
}
!
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
127.0.0.1 localhost
172.16.0.13 node1.alex.dmz
192.168.1.3 node1
search
alex.dmz alex.fr alex.com alex.org alex.dmz
nameserver
172.16.0.1
nameserver
172.17.0.1
STATDOPTS=
NEED_LOCKD=
# Do
you want to start the idmapd daemon? It is only needed for NFSv4.
NEED_IDMAPD=yes
NEED_GSSD=
#
See man 5 aliases for format
postmaster: root
root: blackhole@alex.dmz
#
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)
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:~#
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#
node1:/etc/apache2/ssl# chmod 600 /etc/apache2/ssl/*.key
Listen
80
Listen
443
node1:/etc/apache2/ssl# a2enmod ssl
node1:/etc/apache2/ssl# a2dissite default
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>
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>
node1:~#
a2ensite 000-http
node1:~#
a2ensite 000-https
node1:~# mkdir /import
...
172.16.0.19:/www /import nfs4 rsize=32768,wsize=32768,soft 0 0
node1:~# mount /import
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
node1:/import#
echo www > www/htdocs/index.html
node1:/import#
echo groupware > groupware/htdocs/index.html
node1:/import#
echo secure > secure/htdocs/index.html
node1:/import#
chown -R www-data: /import/*
node1:/import#
chmod -R 770 /import/*
node1:/import# cp -r /etc/apache2
node1:/import#
mv /etc/apache2 /etc/apache2.local
node1:/import#
ln -s /import/apache2 /etc/
startup=1
CHECK_INTERVALS=60
#
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
node1:~#
touch /import/file_checking_for_monit
node1:~#
chmod 400 /import/file_checking_for_monit
#
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
#
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
#
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
Copyright © 04/02/2004, Arnofear
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 |