Création d'une affinitée de session sur du loadbalancing HaProxy vers de l'apache.

1. Avant-propos
1.1. Présentation
1.1.1 Schéma d'architecture
1.1.2 Schéma fonctionnel
1.2. Introduction
2. Installation du HaProxy
2.1. Configuration du HaProxy
2.2. Démarrage du service HaProxy

1. Avant-propos


1.1 - Présentation.


Afin de mieux comprendre le mecanisme des cookies de session, je vous ai fais deux schémas.
Le premier présente l'architecture permettant de balancer les requêtes d'un serveur web à l'autre.
Et le deuxième schéma, nous montre le mécanisme qui permet au client web (internet explorer, firefox, google chrome etc..) de garder la session sur le même serveur.

Pourquoi garder la même session sur le même serveur Apache, tout simplement pour ne pas à avoir à ce reconnecter toutes les 5 minutes.

1.1.1 - Schema d'architecture


Nous voyons dans le schéma technique ci-dessous, qu'une fois le cookies de session initialisé, nommé ici HaProxyTurlanSESSIONID.
Le cookies de session prendra le nom de host du serveur Apache sur lesquel le client web se sera connecté la première fois.
Ce qui permettra au serveur proxy de rediriger le client (I.E, firefox etc..) toujours sur le bon serveur.

+-------------------------------------+                                     +--------------------------------------+ 
| Client FireFox                      |                                     | Serveur HaProxy                      | 
| Hostname : windaube                 |                                     | Version : 1.5.2                      | 
| Os : Windows 7                      |                                     | Hostname : arecibo                   | 
|                                     |                                     |                                      | 
| IP : 10.25.85.125                   |                                     | IP : 10.25.85.56                     | 
|                                     |                                     |                                      | 
| +---------------------------------+ |        https://10.25.85.56          | +---------------------------------+  | 
| | FireFox ou I.E (beurk)          |-|-------------------------------------|-|---> Proxy                       |  | 
| | Cookie : HaProxyTurlanSESSIONID | |                                     | |                                 |  |
| +---------------------------------+ |                                     | |                                 |  |
|                                     |                                     | |  Load Balancing                 |  |
|                                     |                                     | |                                 |  |
|                                     |                                     | +---------------------------------+  | 
+-------------------------------------+                                     +--------------------------------------+ 
                                                                               A                     A
                                                                              /                      |
                                                                             /                       |
                                                                     +----------------+      +----------------+ 
                                                      +--------------|Port 80 --> 443 |      | Port 80 --> 443|
                                                     /               +----------------+      +----------------+
                                                    /                                                |
                                                   /                                                 |
  +----------------------------------+            /            +---------------------------------+   |
  | HaProxyTurlanSESSIONID = jupiter |           V             | HaProxyTurlanSESSIONID = saturn |   V
  |                         +---------------------------+      |                          +------------------------+
  +-------------------------|  Hostname : Jupiter       |      +--------------------------| Hostname : Saturne     |
                            |  Apache : 2.2.15          |                                 | Apache : 2.2.15        |
                            |  Php : 5.4.26             |                                 | Php : 5.4.26           |
                            |  Zend : 2.4.0             |                                 | Zend : 2.4.0           |
                            |                           |                                 |                        |
                            |  I.P : 168.2.15.23        |                                 | I.P : 168.2.15.24      |
                            |  Port : 80                |                                 | Port : 80              |
                            +---------------------------+                                 +------------------------+



1.1.2 - Schema fonctionnel


Afin de mieux comprendre le fonctionnement voici un petit schéma de ce qui se passe au moment de la requête d'un navigateur.

                           +---------------------+
                           |   Requête cliente   |
                           +---------------------+
                                      |
                                      V
                           +---------------------+
                           |   HAProxy Frontend  |
                           +---------------------+
                                      |
                                      V
                           +---------------------+
                           |    backend choice   |
                           +---------------------+
                                      |
                                      V
                           +---------------------+
                           |   HAproxy Backend   |
                           +---------------------+
                                      |
                                      V
+-----------------------------------------------------------------------------------+
| Est-ce que la requête cliente à déjà été faite ?                                  |
| Est-ce qu'il y a un cookies de session HaProxyTurlanSESSIONID dans le client ?    |
| Donc si il y a des cookies de session dans le client WEB données par le HaProxy   |---+
+-----------------------------------------------------------------------------------+   |
                         |                                                              |
                         | NON                                                          |
                         V                                                              |
          +--------------------------------+                                            |
          |       Le serveur choisi        |                                            |  OUI
          |   l'algorithm load-balancing   |                                            |
          |           roundrobin           |                                            |
          |             latest             |                                            |
          |              etc...            |                                            |
          +--------------------------------+                                            |
                         |                                                              |
                         V                                                              |
     +---------------------------------------------------------------+                  |
     |          Envoi de la requête au serveur WEB                   |<-----------------+
     +---------------------------------------------------------------+
      



1.2 - Introduction


Nous allons réaliser l'installation d'un HaProxy en paramettrant les cookies de session.

2. Installation du HaProxy


Dans l'exemple suivant nous allons configurer le HaProxy pour qu'il distribut le traffic sur nos deux serveur Apache.
Tout en leur attribuant des cookies de session.

2.1 - Configuration du HaProxy


Dans la configuration ci-dessous ce qui nous intéresse se sont les lignes suivantes :

# affinite de session
  cookie HaProxyTurlanSESSIONID insert indirect nocache
  server    jupiter 168.2.15.23:80 cookie jupiter check
  server    saturne 168.2.15.24:80 cookie saturne check


Pour ajouter ces lignes, allez dans le répertoire /etc/haproxy du serveur arecibo, puis modifier le fichier haproxy.cfg
[root@saturne] # vi haproxy.cfg

# ============================
# Global
# ============================
global
  chroot  /var/lib/haproxy
  daemon
  group  haproxy
  log localhost local3
  maxconn  4000
  user  haproxy
  stats socket /var/run/haproxy.sock
  tune.ssl.default-dh-param 1024
  ssl-default-bind-ciphers ECDHE-RAS-AES128-SHA256:AES128-GCM-SHA256:RC4:HIGH:!MD5:!aNULL:!EDH


# ============================
# Defaults
# ============================
defaults
  log  global
  mode  http
  option dontlognull
  timeout client  50s
  timeout connect  5s
  timeout server  50s
  errorfile 403 /etc/haproxy/403forbid.http

# ============================
# front-ends
# ============================

# Redirection HTTP vers HTTPS
frontend unsecureFrontend *:80
  redirect scheme https code 301 if !{ ssl_fc }

# Le frontend écoute en SSL
frontend nuageFrontend
  bind            10.25.85.56:443 ssl crt /etc/ssl/haproxy/haproxy.pem
  option          forwardfor
  rspadd          Strict-Transport-Security:\ max-age=31536000
  acl             valid_url   path      /
  acl             valid_url   path_beg  /core/
  acl             valid_url   path_beg  /sync-clients/
  acl             valid_url   path_beg  /ocs/
  acl             valid_url   path_beg  /apps/
  acl             valid_url   path_beg  /index.php
  acl             valid_url   path_beg  /nuage_appli_dgfip.cer
  acl             valid_url   path_beg  /settings/
  acl             valid_url   path_beg  /server-status
  acl             valid_url   path_beg  /check
  acl             valid_url   path_beg  /status.php
  acl             valid_url   path_beg  /remote.php
  http-request    allow if valid_url
  option httplog
  http-request    deny
  reqadd          X-Forwarded-Proto:\ https
  default_backend owncloudBackend

# IP dédiée à l'administration
listen admin
  bind          10.25.85.57:80
  mode          http
  stats         enable
  stats         uri   /haproxy/stats
  stats         realm  HAProxy\ Statistics
  stats         auth   admin:PassAturlan94
  stats         refresh 10s
  acl           graphite path_beg /graphite/
  acl           graphite path_beg /browser/
  acl           graphite path_beg /dashboard/
  acl           graphite path_beg /composer/
  acl           graphite path_beg /content/
  acl           graphite path_beg /render
  acl           graphite path_beg /metrics/
  acl           graphite path_beg /account/
  acl           graphite path_beg /admin/
  acl           graphite path_beg /graphlot/
  acl           graphite path_beg /haproxy/
  http-request  allow if graphite
  http-request  deny
  use_backend   graphiteBackend if graphite

# ============================
# Backends
# ============================

# Répartition de charge entre les serveurs applicatifs:
# Chacun des serveurs doit répondre à http://ip_serveur/check par un code 200 pour
# qu'il soit considéré en vie.
backend owncloudBackend
  balance   roundrobin
#  balance   leastconn
  mode      http
  option    httpchk GET /check

# affinite de session
  cookie HaProxyTurlanSESSIONID insert indirect nocache
  server    jupiter 168.2.15.23:80 cookie jupiter check
  server    saturne 168.2.15.24:80 cookie saturne check

# Graphite est sur un virtualhost bindé sur localhost:88
backend graphiteBackend
  server    localhost localhost:88 check


2.2 - Démarrage du service HaProxy


Afin de démarrer notre serveur HaProxy nous allons lancer la commande suivante.
[root@saturne] # /etc/init.d/haproxy start

[root@saturne] # /etc/init.d/haproxy start
Démarrage de haproxy :                                     [  OK  ]
[root@saturne] #