Tux aux hermines
Accueil du site > Les Documentations > Deux serveurs web chez soi ? Reverse proxy !

Deux serveurs web chez soi ? Reverse proxy !

mercredi 2 février 2005, par Gwenael « Hooligan0 » Saint-Genest

Deux serveurs web à la maison mais une seule ip visible d’internet. Comment accéder à chacun des serveurs sans utiliser une redirection depuis un port non-standard ? C’est possible, avec un proxy.

Le problème

Il est de plus en plus facile aujourd’hui d’avoir chez soit une connexion internet rapide et permanente. De nombreux bidouilleurs, admins réseau en herbe ou confirmés ont donc pu installer un serveur web (au hasard apache) et commencer a héberger leurs pages et projets persos. Quelques temps ont passés, le réseau familial a grandi, aujourd’hui apache est installé sur une machine serveur dédiée pour la version "de production" et un autre apache sur la machine perso sert aux tests. Ce serait super pratique de pouvoir accéder séparément a ces deux serveurs à partir d’internet ... mais il n’y a qu’une seule IP publique :(

Routage ou Proxy ?

Dès qu’un besoin de partage de ressources, contrôle d’accès et/ou filtrage se fait sentir, une solution simple et efficace est de placer une machine entre les différents intervenants, celle-ci pouvant voir et agir sur les flux de données. On peut considérer que, très grossièrement, plus les actions réalisées sont simples et automatiques plus on agit sur les couches basses du système ; et plus les traitements sont compliqués et demandent des paramétrages plus on monte vers les couches applicatives.

Un proxy est, d’une façon générale un logiciel se faisant passer pour un service aux yeux des utilisateurs et qui, selon son bon vouloir et de la configuration imposée par l’administrateur réalise une requête vers le service réel et renvoi le résultat à l’utilisateur. Il ne s’agit ni d’un pont ni d’un routeur au sens réseau des termes car un proxy agit au niveau applicatif. Par la réciproque du principe énoncé plus haut on en déduira qu’un proxy permet un réglage très fin des conditions de passage des requêtes non plus seulement en fonction de la source ou de la destination réseau, mais également en fonction du contenu de la demande !

Intérêt d’un Reverse Proxy

Lorsque l’on parle de proxy http, ce qui vient à l’idée en premier est le contrôle des utilisateurs depuis l’intérieur d’un réseau voulant en sortir. Mais un proxy peut également être utilisé pour contrôler les requêtes arrivant de l’extérieur et à destination d’un serveur du réseau interne, on parle alors de reverse proxy.

Toute requête faite depuis l’extérieur va être analysée par le Reverse Proxy. Ce dernier étant en mesure d’extraire des informations applicatives, il peut déterminer le nom du serveur appelé (www.foo.bar par exemple) ce qui est très utile lorsque plusieurs domaines sont gérés sur le même serveur ; le type de navigateur à la source ; le répertoire et le nom de la page sur le site ... etc. Une fois les données qu’il estime pertinentes extraites, il fait une requête sur un serveur http à l’intérieur du réseau et renvoi la réponse au demandeur externe.

La solution a notre problème initial devient évidente : si le proxy fait la requête au serveur web après en avoir extrait tous les éléments, il peut attaquer plusieurs serveurs suivant le contenu de cette requête. eureka !

Apache, la solution low-cost

Le nombre de cas d’utilisation étant très important, la solution présentée dans cette partie considère deux noms de domaine qui arrivent sur la meme ip et qui doivent être séparés vers deux serveurs. Le traitement en fonction des noms de pages est un cas d’exercice intéressant dont la découverte est laissée aux lecteurs :)

Apache dispose sous forme de module de toutes les fonctions nécessaires pour faire office de proxy (reverse ou non). Avant toute autre chose, il faut donc indiquer dans le fichier de configuration le chargement de ce module (par example : LoadModule proxy_module modules/libproxy.so - Apache 1.3.x - ou modules/mod_proxy.so - Apache 2.x). Seules les fonctions de reverses vont être utilisées, il n’est donc pas nécessaire (ni souhaitable) de laisser le proxy de sortie actif, la directive ProxyRequests Off permet cette inhibition.

La machine va recevoir des requêtes à destination de plusieurs domaines, il faut donc recouvrir aux hôtes virtuels (vhosts) pour séparer leurs traitements. Un premier vhost reprend les options de configuration du site principal. Une fois cette conversion réalisée, ce site peut être testé, il doit continuer à fonctionner exactement comme avant. Afin de traiter les requettes à destination du nouveau domaine, un second vhost est créé, mais cette fois sans directive "DocumentRoot". Dans ce vhost, le reverse proxy est utilisé au moyen des deux directives "ProxyPass" et "ProxyPassReverse" prenant chacune en paramètre le répertoire de base (en général "/") et l’URL pour réaliser la requête coté serveur. Elles vont se charger d’aller chercher les informations depuis le second serveur (celui qui est normalement invisible depuis l’extérieur). Oui, vous avez bien lu, c’est tout, c’est simplissime non ? Si comme moi vous aimez pouvoir commencer en analysant un exemple, je vous en donne un au paragraphe suivant :)

Configuration apache par l’exemple

Voici les données significatives d’un apache configuré pour gérer un domaine "bob.info" :

(...)
ServerRoot /etc/apache
ServerName www.bob.info
DocumentRoot /var/www/localhost/htdocs
(...)

Une fois modifié puis ajouté le second domaine "alice.info", le nouveau format de la configuration est de la forme :

(...)
LoadModule proxy_module       modules/libproxy.so # Pour Apache 1.3.x
ou 
LoadModule proxy_module       modules/mod_proxy.so # pour Apache 2.x
ProxyRequests Off

NameVirtualHost * # # Premier vhost (site d’origine) # <VirtualHost *> ServerName www.bob.info DocumentRoot /var/www/localhost/htdocs </VirtualHost> # # Second vhost utiliseant le reverse proxy # 192.168.0.1 est l’exemple d’IP du second serveur http # <VirtualHost *> ServerName www.alice.info ProxyPass / http://192.168.0.1/ ProxyPassReverse / http://192.168.0.1/ </VirtualHost>

P.-S.

Ce document est placé en licence libre de type ’FDL’. Vous pouvez le diffuser, l’amender et le compléter librement. Faites-y simplement figurer le nom du rédacteur d’origine.

Gwenael Saint-Genest (Hooligan0) Decembre 2004.

12 Messages de forum

  • > Deux serveurs web chez soi ? Reverse proxy ! 24 février 2005 14:39, par Xfennec

    Merci pour cet article fort utile ! :)

    Quelques compléments :

    J’ai du utiliser les fichiers suivants pour charger le support du Proxying :
    modules/mod_proxy.so, modules/mod_proxy_connect.so, modules/mod_proxy_http.so (probablement spécifique à Apache 2).

    Pour rediriger non pas l’ensemble d’un vhost, mais seulement un sous-répertoire (Virtual Directory ? :), il est possible de faire un truc du genre :


    <VirtualHost *:80>
    ServerName www.toto.org
    DocumentRoot /home/apache2/htdocs
    <Location /isedep/>
    ProxyPass http://192.168.0.3/
    ProxyPassReverse http://192.168.0.3/
    </Location>
    </VirtualHost>

    Il est aussi possible d’utiliser les directives Auth* dans cette location (mais attention, le site "distant" ne doit pas demander sa propre authentification).

    • > Deux serveurs web chez soi ? Reverse proxy ! 30 novembre 2005 19:25, par loic

      bjour,

      bravo et merci pr cet article.
      J’ai cependant une petite question.

      Etant donné que je cherche à accéder à mon webmin (entre autres) depuis un lieu externe de chez moi, protégé par un firewall me refusant en sortie tout port autre que 80 et 443 en http, j’aimerais accéder à mon webmin via mon apache.

      Mon problème est que je n’ai qu’un seul nom de domaine...
      en gros j’aimerais que quand je demande : http://mondomaine.com/webmin, apache me redirige de façon invisible bien sur vers https://localhost:10000

      le mod reverse proxy est-il capable de faire cela ??

      d’avance, merci beaucoup !!

      Voir en ligne : reverse proxy -> webmin ?

  • Très clair, très simple et efficace ! 2 min après la lecture de l’article, ca marche !

  • > Deux serveurs web chez soi ? Reverse proxy ! 6 octobre 2005 11:29, par deny

    salut
    je suis en train de suivre ce tutorial
    et je remarque une erreur qui chez moi ,m’a fait perdre un bout de temps :

    ajouter :
    LoadModule proxy_module modules/libproxy.so

    Pour ma mandrake LE2005 dont apache est compilé
    en mode dso ,c’est la ligne
    LoadModule proxy_module modules/mod_proxy.so
    qu’il convient d’ajouter

    mod_proxy peut etre récupéré via urpmi
    pour ceux qui ,ayant compilé apache ,ne l’ont pas forcément installer via urpmi ......

    Sinon ,merci pour ce site ,de trés bonne présentation !

    deny
    http://www.linux-pour-lesnuls.com

  • Matcher une URL parametrée avec le proxy 19 mai 2006 14:47, par Vieux

    Excusez moi mon probleme est autre
    j’ai la meme config c’est a dire deux vhosts et un d’entre eux utilisant le proxy, ma question est de savoir si on peut matcher les urls de type mapage.php ?search=xxx&param=2
    Merci, apres tout la config présentée est simple et ça marche

  • comment faits tu si tu as 2 sites virtuel à proxifier. Moi j’essais et les deux sont rediriger vers le même ?

    reverse-proxy_apache_mod_proxy
    |
    |
    SME_SERVEUR
    | |
    | |
    www.site1 www.site2

  • > Deux serveurs web chez soi ? Reverse proxy ! 16 août 2006 01:54, par Manu

    Bonjour,
    c’est avec une grosse dose de dépression que je viens de trouver votre site et ses explications.
    Merci les deux serveurs fonctionnent "presque" à merveille, j’ai juste un petit soucis sur phpmyadmin qui ne veut pas voir le deuxième serveur si vous pouvez m’aider je vous en remercie car j’ai essayé les changements de ports, etc, ... mais rien.

    • > Deux serveurs web chez soi ? Reverse proxy ! 12 octobre 2006 10:37, par JiPé

      Bonjour,

      Super cette doc : précise, rapide, le bonheur ;-)
      le pied quoi !

      merci
      JiPé

      • > Deux serveurs web chez soi ? Reverse proxy ! 22 janvier 2008 21:51, par Romain

        J’ai besoin d’héberger chez moi plusieurs vhosts tournant sur des machines différentes (aux IP différentes donc).

        J’ai mi le tuto en place : impec !!

        Merci pour le partage de ces infos !

        • > Deux serveurs web chez soi ? Reverse proxy ! 27 septembre 2008 14:27, par tirtaps

          j’ai suivi le tuto,
          j’ai du rajouter
          LoadModule proxy_connect_module /usr/lib/apache2/modules/mod_proxy_connect.so
          LoadModule proxy_http_module /usr/lib/apache2/modules/mod_proxy_http.so

          et

          ProxyPreservehost on

          et ça marche nickel

SPIP | squelette | | Plan du site | Suivre la vie du site RSS 2.0