On continu d’avancer et on touche presque à la fin. A la fin de ce tuto, on aura une plateforme web fonctionnelle. Aujourd’hui nous allons mettre en place le load balancer HAPROXY qui aura pour objectif de répartir la charge entre les deux frontaux web installés mais aussi stunnel qui s’occupera de gérer la couche SSL (HAPROXY en étant dépourvu). Cette machine portera l’IP publique de notre site.
Le flux passera donc par HAProxy pour les connexions HTTP qui répartira la charge sur les frontaux web. Dans le cas du HTTPS, stunnel reçoit la connexion, la forward à HAProxy qui la forward au frontaux web.
J’entend d’ici : mais c’est un SPOF ! On se calme, l’étape 5 va nous permettre de clusteriser cette brique (et le MySQLProxy aussi
) .
Sans plus attendre, on attaque !
Prérequis :
- 4vCPU
- 1024Mo de RAM
- Un disque (j’utilise des VMDK) 8Go pour le système
- 2 cartes réseau sur, une sur VLAN LB-Front et l’autre sur l’Internet
L’OS qui portera ce beau monde est : FreeBSD 8.2 x64. On a besoin d’une stack TCP/IP robuste et d’un OS économe en resource (je viens de donner une partie de la définition de FreeBSD).
Installation de HAPROXY :
La version de HAPROXY étant relativement récente dans les dépôts FreeBSD, on lance une installation à la FreeBSD, très classique :
root@haproxy-pts/0 [/usr/ports]# cd /usr/ports/net/haproxy
root@haproxy-pts/0 [/ports/net/haproxy]# make config && make && make clean
Et voilà ! HAProxy est déployé ! On l’ajoute aux services à lancer au démarrage du système :
root@haproxy-pts/0 [~]# echo 'haproxy_enable="YES"' >> /etc/rc.conf
Installation de stunnel :
La version de stunnel étant tout aussi récente, on utilise le même mécanisme :
root@haproxy-pts/0 [~]# cd /usr/ports/security/stunnel
root@haproxy-pts/0 [/ports/security/stunnel]# make config && make && make clean
On ajoute stunnel aux services à lancer au démarrage du système :
root@haproxy-pts/0 [~]# echo 'stunnel_enable="YES"' >> /etc/rc.conf
Configuration HAProxy
Toute la configuration de HAProxy tient dans un seul fichier : /usr/local/etc/haproxy.conf. Ci dessous ma configuration avec les commentaires qui vont bien :
global
#On log en local
log 127.0.0.1 syslog
#On gere 10000 connexions sec
maxconn 10000
#On chroot pour plus de secu
chroot /usr/share/haproxy
#On lance le bousin avec le user nobody
uid 65534
gid 65534
defaults
#Niveau de log
log global
#On forward les requetes RFC-Compliants
mode http
#On log les requete http et les timers
option httplog
#Onlog pas le vide...
option dontlognull
#On redistribu les session en cas de fail d un node
option redispatch
#On active les X-Forwarded-For
option forwardfor
#Nombre de test avant de declarer un node mort
retries 3
#Assez explicit...
contimeout 1000
clitimeout 10000
srvtimeout 10000]
#On cree une interface uniquement pour les stats sur le port 1000
listen admin_page :1000
mode http
stats enable
stats hide-version
stats realm HA\ Proxy\ Stats\
stats auth raff:hehehyesfdsf
stats uri /
listen test :80
bind :80
#URL a tester
option httpchk /
contimeout 1000
clitimeout 10000
srvtimeout 10000
retries 5
maxconn 10000
balance roundrobin
cookie SERVERID nocache rewrite
server oaf-prj-web01 192.168.10.1:80 cookie
server oaf-prj-web02 192.168.10.2:80 cookie
#On capture les new visiteurs
capture cookie vgnvisitor= len 32
Configuration stunnel
Tout comme HAProxy, toute la configuration de stunnel tient en un fichier. On crée donc le fichier /usr/local/etc/stunnel/stunnel.conf :
;On configure le demon
setuid = stunnel
setgid = nogroup
pid = /tmp/stunnel.pid
;On met les certificats par defaut
cert = /usr/local/etc/stunnel/test.madeinsyria.fr.crt
key = /usr/local/etc/stunnel/test.madeinsyria.fr.key
;On renforce la stack SSL
options = NO_SSLv2
options = SINGLE_ECDH_USE
options = SINGLE_DH_USE
;On configure les logs
output = /var/log/stunnel.log
;On configure les services https
[https]
accept = 443
connect = 80
TIMEOUTclose = 0
Le services est donc joignable sur sont IP publique en HTTP et HTTPS. De plus l’outil de stats est joignable sur l’IP publique sur le port 1000 avec le login et mot de passe spécifiés plus haut.
[...] HAPROXY [...]