Haute disponibilité avec Apache

Facebooktwitterredditpinterestlinkedinmail

Apache 2 est capable, en mode serveur mandataire (ou proxy), d’apporter une répartition de charge (ou load-balancing) et / ou une tolérance de panne (ou fail-safe) entrante vers tout serveur HTTP, FTP ou AJP. Nous allons voir comment mettre en place ce type de solution.

Le présent article traite d’Apache 2.2.22 sur Ubuntu 13.04. Les directives sont susceptibles de changer si vous utilisez des versions différentes des applications.

Mise en place du répartiteur

Après avoir suivi les instructions de l’Architecture commune en ayant nommé la machine apache-lb, j’installe Apache 2 avec apt-get install apache2. Sur Ubuntu 13.04, tous les modules utiles étaient installés par défaut avec Apache, comme j’ai pu le voir en jetant un œil dans /etc/apache2/mods-available/. J’active les modules mod_proxy et mod_proxy_balancer (a2enmod proxy et a2enmod proxy_balance). Selon le protocole que l’on souhaite répartir (HTTP, FTP, ou AJP), on installe le module correspondant. Dans mon cas, mod_proxy_http (a2enmod proxy_http). Rien n’empêche d’installer plusieurs protocoles et de les utiliser sur le même répartiteur.

Si l’on souhaite utiliser l’interface de gestion (et c’est notre cas), on vérifie aussi qu’est installé et activé mod_status (a2enmod status). Il est temps de redémarrer Apache (service apache2 restart), et de vérifier que l’on a bien la page d’accueil par défaut lorsqu’on appelle son adresse IP depuis un navigateur. Je vais d’ailleurs de suite remplacer le magnifique “It works!” par le nom de la machine (apache-lb), afin de différencier dans le futur la machine sur laquelle je tombe depuis mon navigateur. Pour mémoire, la page d’accueil par défaut sur cette distribution est /var/www/index.html.

ATTENTION: Mettre en place un serveur mandataire non protégé vous expose à ce que n’importe quelle personne mal intentionnée l’utilise afin d’accéder à Internet en usurpant son adresse IP pour aller commettre n’importe quelle cochonnerie. Par défaut, la directive ProxyRequests est placée à Off. Mais je préfère toujours, par principe, ajouter cette directive dans les paramètres par défaut du serveur (Dans notre cas /etc/apache2/sites-available/default). D’une part, cela montre explicitement aux éventuels autres administrateurs du système que ce serveur n’est pas autorisé comme mandataire sortant; d’autre part, si pour une raison ou une autre ce paramètre devait avoir été changé en amont, ce serait une sécurité de plus. Placer ProxyRequests à Off n’empêchera que le mode mandataire sortant, et ne gênera en aucun cas le mode mandataire entrant qui nous intéresse dans le cas présent.

Interface de gestion

Je commence par activer l’interface de gestion du répartiteur de charge. Elle permet de vérifier et d’aider à affiner la configuration. Dans le futur elle permettra aussi de la surveiller.

Je crée un virtual host dans /etc/apache2/sites-available/balancer-manager :

Explications :

  1. Les requêtes concernant /balancer-manager seront ignorées par le proxy, et servies localement.
  2. L’URL permettant d’accéder à l’interface de gestion sera, dans notre cas, /balancer-manager.
  3. Les requêtes concernant /balancer-manager seront gérées par le module qui sert à gérer la répartition de charge.
  4. Paramètres de sécurité d’accès à l’interface. Ici on interdit l’accès par défaut (Order deny,allow + Deny from all), puis on l’autorise depuis
  5. l’hôte local, qu’il soit en IPv4 (127.0.0.1) ou en IPv6 (::1). L’intégralité de ces règles doit être respecté (Satisfy all)).

J’active cet hôte avec a2ensite balancer-manager et je redémarre Apache avec service apache2 restart. Je dois pouvoir y accéder par l’URL http://192.168.1.203/balancer-manager

Mise en place d’une grappe

Si j’ai suivi les instructions de l’Architecture commune en ayant nommé les machines apache-w1 et apache-w2, je n’ai rien de plus à faire.

De retour sur le répartiteur de charge (apache-lb), je crée un second virtual host qui va définir ma première grappe de machines (ou cluster) :

Explications :

  1. Les requêtes concernant /c1 seront traitées par le répartiteur cluster1.
  2. Déclaration de la grappe de serveurs cluster1.
  3. Déclaration de chaque serveur membre de la grappe. Ici j’utilise les noms que j’avais indiqué dans le fichier hosts, mais toute URL valide fera l’affaire (ex: http://192.168.1.204:80/mon_appli/).

Puis je l’active, je redémarre apache, et je teste sa présence en retournant sur le balancer-manager : http://192.168.1.203/balancer-manager.

Ensuite on teste le répartiteur en conditions réelles en appelant l’URL balancée http://192.168.1.203/c1 et on vérifie que l’hôte change bien un appel sur deux.

C’est à vous ! Créez deux nouvelles machines virtuelles (apache-w3 et apache-w4); définissez une seconde grappe de serveurs (cluster2) joignable sur l’URL /c2 sur le répartiteur, et admirez sa capacité de multi répartition !

Pour aller un peu plus loin

Les grappes que nous avons configuré ci-dessus utilisent les paramètres par défaut. La répartition de charge se fera équitablement sur chaque serveur membre de la grappe par nombre de requête. Apache ne cherchera pas particulièrement à associer chaque client à un serveur donné.

Apache supporte trois modes de répartition de charge :

  • Par comptage de requêtes (ou Request Counting). Il s’agit du mode par défaut. Il tend à faire en sorte que chaque serveur membre de la grappe traite le même nombre de requêtes client, et correspond à la directive lbmethod=byrequests.
  • Par comptage du trafic (ou Weighted Traffic Counting). Il tend à faire en sorte que chaque serveur membre de la grappe traite la même quantité de données, et correspond à la directive lbmethod=bytraffic.
  • Par taux d’occupation (ou Pending Request Counting). Il tend à envoyer les requêtes entrantes aux serveurs membres de la grappe les moins occupés, et correspond à la directive lbmethod=bybusyness. Cette fonctionnalité requiert apache 2.2.10 au minimum.

Le choix du mode de répartition de charge se configure au niveau de la directive ProxyPass. Exemple :

La pondération des serveurs membres s’effectue par la directive loadfactor au niveau de la définition du cluster. Exemple :

L’unité du loadfactor est en nombre de requêtes ou en octets, selon le mode de répartition.

La pondération permet d’affiner la répartition entre des machines de puissance différente, ou plus sollicitées que d’autres.

Apache supporte le maintient de session, ce qui permet de toujours rediriger les requêtes d’un utilisateur donné vers le même membre de la grappe. L’identification de l’utilisateur se fait par l’URL ou par cookies. Ce qui permet une gestion par le répartiteur ou par l’application. Le maintient de session n’est pas actif par défaut, et chaque requête utilisateur sera redirigée vers l’un ou l’autre des membres indifféremment.

L’activation du maintient de session se configure au niveau de la directive ProxyPass. Exemple :

Utilisation du SSL

En considérant que vous avez déjà généré ou acheté vos certificats (cela ne fait pas l’objet de cet article), on peut utiliser du SSL en amont ou en aval du répartiteur de charge. Toutes les combinaisons sont possibles :

  • Aucune utilisation du SSL
  • Utilisation du SSL en aval (avec les directives notées 1 ci-dessous)
  • Utilisation du SSL en amont (avec les directives notées 2 ci-dessous)
  • Utilisation du SSL de bout en bout (avec les directives notées 1 et 2 ci-dessous)

Vous devrez activer le module SSL (a2enmod ssl) puis recharger Apache (service apache2 reload).

Explications :

  1. Permet au répartiteur de charge d’accéder à des serveurs membres en SSL (Notez le changement de protocole – HTTPS)
  2. Permet d’accéder au répartiteur de charge en SSL

Pour plus d’informations

Retours vers Haute disponibilité.

Facebooktwitterredditpinterestlinkedinmail

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *