Auto-hébergement, DIY, Réseau, Yunohost

Utiliser Yunohost ou nginx comme proxy

Lorsque vous hébergez plusieurs services chez vous, vous pourriez avoir besoin d’utiliser plusieurs machines, pour plusieurs raisons :

  • Hébergement de plusieurs noms de domaine,
  • Un service nécessitant une machine dédiée (plus puissante, configuration particulière, …),
  • Votre Raspberry Pi est en manque de RAM et vous voulez agrandir votre parc de machines.

Sauf que… Seule une machine dans votre réseau local peut recevoir le trafic des ports http et https : celle que vous avez configurée comme destinataire des ports 80 et 443 sur votre box. Il faut donc un moyen de dispatcher les requêtes réseau en fonction du service ou du nom de domaine.

Et ça, nginx sait le faire ! Avec une limitation qui en déroutera certains : le chiffrement SSL doit être fait au moment de la répartition.

Prenons l’exemple de visio.mondomaine.fr qui redirigera vers un logiciel de visioconférence.

Le serveur primaire est celui qui recevra le trafic de la box, et le serveur secondaire est celui sur lequel le service tournera.

Configuration de Yunohost

Ajout d’un domaine

Si vous voulez rediriger tout un domaine, il faut le rajouter dans Yunohost primaire. Il faudra bien entendu avoir acheté ce nom de domaine auprès d’un registrar, tel OVH ou Gandi, comme votre premier nom de domaine, ou y avoir configuré un sous-domaine.

Dans le panneau d’administration de Yunohost, rajoutez ce domaine. Activez éventuellement Let’s Encrypt pour le chiffrement https ; ceci ne compliquera en rien la suite de la procédure.

Ajout d’une application

Pour faciliter les choses, il faut créer une « application » Yunohost. Celle-ci permettra d’éviter que les visiteurs tombent sur l’écran de connexion de Yunohost primaire.

Installez donc une « Multi Custom Webapp »:

  • Donnez-lui un nom lisible (« Proxy pour visio »)
  • Choisissez le nom de domaine concerné
  • Choisissez un chemin pour votre Webapp :
    • Si vous redirigez tout le nom de domaine, entrez /
    • Si vous redirigez un sous-dossier, entrez-le (ex : /visio)
  • Cochez la case « Est-ce un site public ? » sinon seuls les utilisateurs de Yunohost pourront y accéder.

Modification des fichiers de configuration

Désormais, votre domaine visio.mondomaine.fr devrait fonctionner, mais il ne redirige pas encore vers la machine que vous voulez.
Votre domaine est décrit par plusieurs fichiers de configuration nginx:

  • /etc/nginx/conf.d/visio.mondomaine.fr.conf
  • /etc/nginx/conf.d/visio.mondomaine.fr.d/webapp_visio.mondomaine.fr_.conf

NB : Les noms peuvent varier mais conserveront ce schéma :

  • <domaine>.conf
  • <domaine>.d/webapp_<domaine>_.conf

Fichier <domaine>.conf

Une seule ligne doit être rajoutée à <domaine>.conf, au début du fichier, avant le bloc server :

upstream mon_second_serveur { server 192.168.0.8:80; }

  • Vous pouvez nommer votre upstream comme vous voulez
  • Remplacez 192.168.0.8 par l’adresse IP locale de votre serveur secondaire

Fichier <domaine>.d/webapp_<domaine>_.conf

Le contenu entier du fichier peut être remplacé par :

location / { proxy_pass http://mon_second_serveur; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $remote_addr; }

  • Si vous ne redirigez qu’un dossier, indiquez-la dans la location à la place de /
  • Remplacez <mon_second_serveur> par le nom de votre upstream
  • Sans les proxy_set_header, le serveur secondaire verrait, dans les requêtes, non pas le nom de domaine mais son adresse IP configurée comme upstream !

Redémarrez nginx, avec :
sudo systemctl restart nginx

Et voilà ! votre nom de domaine secondaire est correctement redirigé vers votre machine secondaire. Il suffit désormais de configurer celle-ci.
Une erreur 500 indique que le serveur secondaire ne répond pas au serveur nginx primaire.

Comme vous pouvez vous en douter, si on redirige vers le port 80 du serveur secondaire, c’est que le trafic en local sera non chiffré. Si vous voulez le chiffrer, je vous conseille cet article : HTTPS behind your reverse proxy.

Laisser un commentaire

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