[Tuto/HowTo] [GNU/Linux] Load Balancing - redirection vers plusieurs vhost avec HaProxy

Avatar du membre
voxdemonix
Messages : 1336
Enregistré le : lun. févr. 02, 2015 7:28 pm

[Tuto/HowTo] [GNU/Linux] Load Balancing - redirection vers plusieurs vhost avec HaProxy

Message par voxdemonix » mar. sept. 19, 2017 2:10 am

musique d'ambiance : Les Choristes - Vois Sur Ton Chemin (Paraphonics Remix) LES RAMONEURS DE MENHIRS - Dans An Diaoul
Testé avec succès sur : Ubuntu Minimal 16.04
Difficulté : moyen
demo_HaProxy+apache2.png

Mise en place HaProxy (load balancing)
  1. Installez les pré-requis
  2. Activez HaProxy
    • Code : Tout sélectionner

      sed -i "s/ENABLED=0/ENABLED=1/g" /etc/default/haproxy
      sed -i "s/ENABLED=0/ENABLED=1/g" /etc/init.d/haproxy
  3. Créez le dossier qui va accueillir les certificats TLS (exSSL)
  4. Concaténez chaque certificat (clés publique) et sa clés privés (recommencez pour chaque certificat)
    • Code : Tout sélectionner

      DOMAIN='cloud.linuxfr.org' sudo -E bash -c 'cat /etc/letsencrypt/live/$DOMAIN/fullchain.pem /etc/letsencrypt/live/$DOMAIN/privkey.pem > /etc/haproxy/certs/$DOMAIN.pem'
      DOMAIN='cloud.linuxfr.org' => remplacez par votre nom de domaine
      /etc/letsencrypt/live/ => le chemin d'accès (PATH) vers vos fichiers, ici c'est le dossier par défaut de Let's Encrypt.
      Note : pas la peine de concaténer tout vos certificats/clés privé dans un seul gros fichiers, cela ne fonctionne pas.
  5. Éditez /etc/haproxy/haproxy.cfg
  6. Ajoutez la partie traitant de l'écoute (frontend)
    Note : dans cet exemple on défini deux noms de domaines (cloud.linuxfr.org et www.0rion.netlib.re)
    • Code : Tout sélectionner

      frontend https
          bind *:80
              bind *:443 ssl crt /etc/haproxy/certs/cloud.linuxfr.org.pem crt /etc/haproxy/certs/forum.linuxfr.org.pem
              mode http
              option httpclose
              option forwardfor
              reqadd X-Forwarded-Proto:\ https
      
                      # gestion des logs
              log /dev/log local0 info
              http-request add-header X-CLIENT-IP %[src]
      
                      #on force https (pas obligatoire)
              acl http      ssl_fc,not
              http-request redirect scheme https if http
              
              # si le visiteurs tentent de joindre depuis un hostname inconnu, on renvoie vers cette config serveur
              default_backend serveur_web
              
              # On défini les hostnames
              acl host_cloud.linuxfr.org hdr(host) -i cloud.linuxfr.org
              acl host_forum.linuxfr.org hdr(host) -i forum.linuxfr.org
      
              ## On associe quelle config serveur (backend) va avec quel hostname
              use_backend serveur_cloud if host_cloud.linuxfr.org
              use_backend serveur_web if host_forum.linuxfr.org
      
      frontend https => On défini le bloc de configuration frontend. Format frontend nomUnique.
      bind *:80 => on écoute sur le port 80 (utile ici afin de rediriger vers https)
      bind *:443 ssl crt /etc/haproxy/certs/cloud.linuxfr.org.pem crt /etc/haproxy/certs/www.0rion.netlib.re.pem => on écoute sur le port 443 et on lui associe deux certificats
      default_backend serveur_web => on défini "serveur_web" comme config backend par défaut (en cas de visite via un hostname inconnu)
      acl host_cloud.linuxfr.org hdr(host) -i cloud.linuxfr.org => on défini nos hostnames et l'identifiant qui y est lié. format acl nomUnique hdr(host) -i www.monHostname.com
      use_backend serveur_cloud if host_cloud.linuxfr.org => on défini quelle config serveur est associé à l'identifiant unique créé précédemment.
  7. Ajoutez la partie traitant des différents serveurs (backend)
    Note : dans cet exemple on défini les serveurs pour les deux noms de domaines.
    • Code : Tout sélectionner

      backend serveur_cloud
              mode http
              balance leastconn
              option forwardfor
              option httpchk HEAD /haproxytest.txt HTTP/1.0
              cookie SERVERID insert indirect nocache
              server serveurCloud serveurCloud:80 check cookie serveurCloud
      
      backend serveur_web
              mode http
              balance roundrobin
              option forwardfor
              option httpchk HEAD /haproxytest.txt HTTP/1.0
              cookie SERVERID insert indirect nocache
              server superRaspberry superRaspberry:443 check cookie superRaspberry ssl verify none
      
      backend serveur_web => On défini le bloc de configuration backend. Format backend nomUnique.
      mode http => écoute en http
      balance leastconn => on défini quel algorithme de sélection des serveurs à utiliser. Accepte : roundrobin , leastconn, source. (infos)
      option forwardfor => on active la transmission des IPs des clients via l'header HTTP "X-Forwarded-For"
      option httpchk HEAD /haproxytest.txt HTTP/1.0 => on défini un fichier sur les serveurs backend, HaProxy vérifiera l'existence de ce fichier sur chaque serveur toutes les deux secondes. Si le fichier n'est pas présent sur un serveur, HaProxy considérera ce serveur comme inactif. Pour les applications PHP et les CMS, je vous conseil fortement de pointer le fichier index.php.
      cookie SERVERID insert indirect nocache => option concernant les cookies
      server superRaspberry superRaspberry:443 check cookie superRaspberry ssl verify none => Une ligne par serveur. server superRaspberry superRaspberry:443 on défini notre serveur (son nom puis sont hostname:port). check signifie qu'il faut tester l'existence du fichier de test (haproxytest.txt), cookie superRaspberry qu'il faut transférer les cookies valide pour superRaspberry et ssl verify none qu'il ne faut pas vérifier le certificat TLS du serveur backend.
Configurer apache2
Note : n'oubliez pas de redémarrer apache2 après avoir apporté une ou plusieurs modifications

  1. Installez les pré-requis
  2. Éditez le ficher /etc/apache2/mods-enabled/rpaf.conf
  3. Ajoutez la liste des adresses IP de vos proxy/frontend au paramètre RPAFproxy_ips
    • RPAFproxy_ips 127.0.0.1 ::1 10.8.1.42
  4. Redémarrez apache2 Obligatoire

    Créer le fichier vide sur tout vos serveurs apache2, il va servir à HaProxy pour vérifier la disponibilité des serveurs.
    • Code : Tout sélectionner

      touch /var/www/html/haproxytest.txt
      Adaptez éventuellement le PATH à votre configuration. Vous pouvez tout à fait vérifier l'existence d'un autre fichier (par exemple index.html, robot.txt, etc). Sachez toute fois que plus ce fichiers est gros et plus sa vérification va consommer de ressources/électricité.

    Optionnel

    Supprimer les checks de HaProxy des fichiers logs d'apache2
    • Éditez votre fichier vhost (/etc/apache2/sites-available/) Et ajoutez les lignes suivantes en adaptant éventuellement le PATH des fichiers logs à votre config
      • Code : Tout sélectionner

        SetEnvIf Request_URI haproxytest.txt dontlog
        #SetEnvIf Remote_Addr "10\.8\.0\.1" dontlog # si vous voulez aussi ban une ip
        CustomLog /var/log/apache2/access.log combined env=!dontlog
        Il va de soit que si votre HaProxy check un autre fichier que haproxytest.txt vous devez le mentionner.
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Modifié en dernier par voxdemonix le sam. nov. 04, 2017 1:26 pm, modifié 30 fois.
~ Infernalis Creatorem ~
  • Rejoins le côté obscure, on a des cookies !
Donation Bitcoin : 1N8QGrhJGWdZNQNSspm3rSGjtXaXv9Ngat
Donation Dash : XmowiBRku3tsEREp7PhpheY4TgeLLDyKdM

Avatar du membre
voxdemonix
Messages : 1336
Enregistré le : lun. févr. 02, 2015 7:28 pm

Re: [Tuto/HowTo] [GNU/Linux] Load Balancing - redirection vers plusieurs vhost avec HaProxy

Message par voxdemonix » mar. sept. 19, 2017 1:08 pm

Modifié en dernier par voxdemonix le mar. nov. 21, 2017 11:13 pm, modifié 4 fois.
~ Infernalis Creatorem ~
  • Rejoins le côté obscure, on a des cookies !
Donation Bitcoin : 1N8QGrhJGWdZNQNSspm3rSGjtXaXv9Ngat
Donation Dash : XmowiBRku3tsEREp7PhpheY4TgeLLDyKdM

Avatar du membre
voxdemonix
Messages : 1336
Enregistré le : lun. févr. 02, 2015 7:28 pm

Re: [Tuto/HowTo] [GNU/Linux] Load Balancing - redirection vers plusieurs vhost avec HaProxy

Message par voxdemonix » mar. sept. 19, 2017 8:30 pm

Activer les statistiques de HaProxy

Adaptez puis ajoutez les lignes suivantes dans /etc/haproxy/haproxy.cfg
  • Code : Tout sélectionner

    listen stats
    	bind *:1936
    	mode http
    	stats enable
    	stats uri /
    	stats hide-version
    	stats auth login:password
    bind *:1936 => le port sur lequel écouter pour joindre la WEBUI des statistiques de HaProxy
    stats auth login:password => le couple login et password. Une ligne par couple login:password, vous pouvez ajouter autant de ligne que vous le souhaitez.
Modifié en dernier par voxdemonix le mer. sept. 20, 2017 11:00 pm, modifié 4 fois.
~ Infernalis Creatorem ~
  • Rejoins le côté obscure, on a des cookies !
Donation Bitcoin : 1N8QGrhJGWdZNQNSspm3rSGjtXaXv9Ngat
Donation Dash : XmowiBRku3tsEREp7PhpheY4TgeLLDyKdM

Avatar du membre
voxdemonix
Messages : 1336
Enregistré le : lun. févr. 02, 2015 7:28 pm

Re: [Tuto/HowTo] [GNU/Linux] Load Balancing - redirection vers plusieurs vhost avec HaProxy

Message par voxdemonix » mar. sept. 19, 2017 11:00 pm

Source : https://www.haproxy.com/support/faq/how ... pache.html
Testé avec succès sur : Raspbian 8 (Jessie), Ubuntu Minimal 16.04

Transmettre les IP des clients de HaProxy (frontend) vers apache2 (backend)

Préambule
  • Avec ça les fichiers logs d'apache2 retrouvent une tronche normale mais par contre $_SERVER[’REMOTE_ADDR’] continue de renvoyer l'IP du frontend. Pour afficher l'adresse IP du client, vous devez passer par $_SERVER["HTTP_X_FORWARDED_FOR"]. (exemple)
    Toutes ces commandes sont à exécuter en admin (root).

Côté HaProxy
  1. Éditez le fichier de configuration de HaProxy
  2. Ajoutez option forwardfor dans les blocs de commandes dédié au frontend et au backend

Côté Apache2
  1. Lancez les commandes suivantes
    • Code : Tout sélectionner

      apt-get install libapache2-mod-rpaf
      a2enmod rpaf
      nano /etc/apache2/mods-enabled/rpaf.conf
  2. Collez les lignes suivantes
    • Code : Tout sélectionner

      </IfModule rpaf_module>
      	RPAFenable On
      	RPAFsethostname On
      		# list your proxies IP address below
      	RPAFproxy_ips 10.0.0.1 10.0.0.2
      	RPAFheader X-Real-IP
      </IfModule>
      RPAFproxy_ips 10.0.0.1 10.0.0.2 => adaptez cette ligne pour indiquer la ou les IP de vos frontends
  3. CTRL+X pour sauver et quitter
  4. Redémarrez le serveur web
Modifié en dernier par voxdemonix le sam. nov. 04, 2017 1:34 pm, modifié 2 fois.
~ Infernalis Creatorem ~
  • Rejoins le côté obscure, on a des cookies !
Donation Bitcoin : 1N8QGrhJGWdZNQNSspm3rSGjtXaXv9Ngat
Donation Dash : XmowiBRku3tsEREp7PhpheY4TgeLLDyKdM

Avatar du membre
voxdemonix
Messages : 1336
Enregistré le : lun. févr. 02, 2015 7:28 pm

Re: [Tuto/HowTo] [GNU/Linux] Load Balancing - redirection vers plusieurs vhost avec HaProxy

Message par voxdemonix » mer. sept. 20, 2017 10:55 pm

Note : j'ai oublié d'indiquer comment activer dans HaProxy les logs des différentes requêtes
~ Infernalis Creatorem ~
  • Rejoins le côté obscure, on a des cookies !
Donation Bitcoin : 1N8QGrhJGWdZNQNSspm3rSGjtXaXv9Ngat
Donation Dash : XmowiBRku3tsEREp7PhpheY4TgeLLDyKdM

Avatar du membre
voxdemonix
Messages : 1336
Enregistré le : lun. févr. 02, 2015 7:28 pm

Re: [Tuto/HowTo] [GNU/Linux] Load Balancing - redirection vers plusieurs vhost avec HaProxy

Message par voxdemonix » sam. nov. 04, 2017 2:04 pm

Exemple de script PHP pour afficher l'ip du client
  • Code : Tout sélectionner

    <?php
    
    if ($_SERVER["HTTP_X_FORWARDED_FOR"] === NULL){
    		// client lambda
    	$myIP=$_SERVER["REMOTE_ADDR"];
    }else{
    		// client derrière proxy / frontend
    	$myIP=$_SERVER["HTTP_X_FORWARDED_FOR"];
    }
    
    echo $myIP;
    
    ?>
    Attention, ne l'utilisez pas dans un cadre de sécurité, en effet si votre serveur est directement exposé sur internet (pas derrière un frontend HaProxy), le client peut facilement envoyer une fausse valeur pour HTTP_X_FORWARDED_FOR (ainsi que pour REMOTE_ADDR, voir IP Spoofing)
~ Infernalis Creatorem ~
  • Rejoins le côté obscure, on a des cookies !
Donation Bitcoin : 1N8QGrhJGWdZNQNSspm3rSGjtXaXv9Ngat
Donation Dash : XmowiBRku3tsEREp7PhpheY4TgeLLDyKdM

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 0 invité