Plusieurs serveurs web sur une seule machine

Pour divers raisons, il peut être utile d'utiliser plusieurs serveurs web sur une même machine. Et là c'est le drame : chacun devant écouter sur un port différent, on se retrouve avec des URLs dégueulasses. Heureusement, il y a une solution propre : HAProxy.

HAProxy, késako?

HAProxy est :

Mise en place de la solution

Le principe est très simple : HAProxy écoute sur le port 80 tandis que chaque serveur web écoute sur un port quelconque (typiquement 8000, 8080, etc). C'est donc HAProxy qui va réceptionner les requêtes HTTP des clients et, en fonction de règles que nous auront défini, les transmettre au bon serveur.
schéma
Dans cet exemple, nous avons deux serveurs web, s1.example.com et s2.example.com, écoutant respectivement sur les ports 8080 et 8000. HAProxy écoute quant à lui sur le port 80.

La configuration d'HAProxy

global
        daemon
        maxconn 4096
        chroot  /usr/share/haproxy
        user    haproxy
        group   haproxy

defaults
        mode    http
        timeout connect 5000ms
        timeout client  5000ms
        timeout server  5000ms

frontend http-in
        bind            *:80
        acl             is_s2 hdr_dom(host) -i s2.example.com
        use_backend     web2 if is_s2
        default_backend web1

backend web1
        server  web1-1 127.0.0.1:8080 maxconn 1024

backend web2
        server  web2-1 127.0.0.1:8000 maxconn 32

global

  • Faites bien attention à ce que le répertoire de chroot existe, soit totalement vide et que personne n'ai le droit d'y écrire.
  • En fonction de votre OS, utilisez l'utilisateur et le groupe approprié (haproxy/haproxy, nobody/nobody, …)

frontend

C'est là que l'on fais écouter HAProxy sur le port 80 et qu'on lui dis quoi faire des requêtes :

  • avec acl on définit le test is_s2, vrais si le host (nom de domaine) est égal à s2.example.com ;
  • avec use_backend on dis d'utiliser le backend donné si le test est vrai ;
  • avec default_backend on dis que dans tous les autre cas, il faut utiliser le backend web1.

backend

On définis deux backends :

  • un pour s1.example.com (web1)
  • un pour s2.example.com (web2)

Chacun de ces backends comprend un seul serveur. Dans le cas où l'on fait du load balancing il est possible de spécifier plusieurs serveurs, mais ceci dépasse la portée de ce billet.

Conséquences

La configuration précédente fait que :

  • si la requête porte sur s2.example.com, le serveur web écoutant sur le port 8000 est utilisé ;
  • pour toutes les autres requêtes (donc s1.example.com), c'est le serveur web écoutant sur le port 8080 qui est utilisé.

Et plus encore

HAProxy ne sert pas uniquement à ce cas d'utilisation. Non seulement les serveurs sur lesquels il redirige n'ont aucune obligation d'être sur la même machine, mais il est également possible de spécifier plusieurs serveurs dans un même backend. L'utilité ici est de se servir de la machine avec HAProxy pour répartir les requêtes sur plusieurs serveurs web identiques : c'est de la répartition de charge. HAProxy ne se contente pas non plus de repartir en fonction d'un nom de domaine. Les possibilités sont nombreuses, d'où l'importance de bien lire sa documentation.

Tags