Reverse proxy avec Nginx

Bonjour tout le monde !

Je viens d’installer Yunohost sur une petite machine chez moi. Je trouve que c’est un excellent projet ! Ça faisait un moment que je cherchais des solutions simples à mettre en place et facile à administrer pour de l’auto-hébergement, je crois que j’ai trouvé ce qu’il me faut !

J’ai quand même un petit souci. Comme la plupart des personnes, je n’ai qu’une seule IP publique chez moi. Mon problème est que j’ai plusieurs machines sur mon réseau local qui doivent servir du contenu à l’extérieur, sur le même port. Concrètement, il y a ma machine sur laquelle tourne Yunohost, et il y a un NAS. Les deux doivent être accessibles depuis l’extérieur sur le port 443 (voire 80, mais si je peux tout faire en HTTPS, c’est mieux).

Pour résoudre ce problème, j’ai voulu configurer le Nginx de ma machine Yunohost en reverse proxy, pour faire en sorte que quand on appelle mondomaine.tld, on tombe sur Yunohost, et quand on appelle nas.mondomaine.tld, la reqûete arrive sur la machine Yunohost qui fait reverse proxy vers mon NAS.

Pour cela, j’ai essayé de suivre ce tuto : http://doc.ubuntu-fr.org/tutoriel/reverse_proxy_nginx

J’ai donc rajouté le fichier /etc/nginx/conf.d/proxy.conf, dont voici le contenu :

root@debian:~# more /etc/nginx/conf.d/proxy.conf 
proxy_redirect          off;
proxy_set_header        Host            $host;
proxy_set_header        X-Real-IP       $remote_addr;
proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_hide_header       X-Powered-By;
proxy_intercept_errors on;
proxy_buffering on;


proxy_cache_key "$scheme://$host$request_uri";
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=cache:10m inactive=7d max_size=700m;

J’ai aussi créé un nouveau virtual host nas. Je n’ai pas fait la conf HTTPS pour le moment.

root@debian:~# more /etc/nginx/sites-available/nas 
server {

    listen 80;
    server_name nas.mondomaine.tld;

    # Log d'acces
    #access_log off;
    access_log /var/log/nginx/default.access.log;

if ($request_method !~ ^(GET|HEAD|POST)$ ) {
return 444;
}


location / {
    proxy_pass http://192.168.1.151/;
}



error_page 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 500 501 502 503 504 505 506 507 /error.html;

location = /error.html {
    root /var/www/nginx-default;
}
}

J’ai bien créé un lien symbolique dans /etc/nginx/sites-enabled et relancé le service nginx.

Je pensais que ça suffirait. Sauf qu’en appelant nas.mondomaine.tld, je tombe sur la page d’admin de Yunohost. Sur le serveur, je ne vois même pas le fichier /var/log/nginx/default.access.log qui devrait contenir les logs d’accès pour ce virtual host.

Quelqu’un aurait une idée de comment je pourrais faire fonctionner cela ?

Je commence à penser à une solution de contournement, à savoir incorporer les pages servies par mon NAS dans des iframe dans des pages servies par la machine Yunohost. Mais ça me parait pas très propre.

Merci d’avance pour votre aide !

Ce que tu souhaites faire est tout à fait possible avec YunoHost.

Il y a peut être un peu plus simple, mais je te propose qqch qui ne devrait pas te prendre trop de temps à mettre en place, et qui sera mieux intégré à YunoHost :

  1. tu crées un nouveau domaine « nas.domain.tld » via l’interface d’admin de yunohost
  2. tu te crées une application yunohost spécifique pour ton cas d’utilisation

Pour [2] tu peux t’inspirer de https://github.com/lunarok/openwrt_ynh qui est une appli “vide” qui s’occupe juste de faire un reverse proxy vers une certaine IP accessible par le serveur yunohost.

En gros, tu remplaces openwrt par nas dans le code de l’appli. Tu peux éliminer le parametre IP si tu veux le fixer en dur (dans le manifest.json et les scripts).

Quand tu installes ton app, tu choisis comme domaine nas.domain.tld, et comme path d’install “/”.

Tu installeras ainsi une nouvelle app yunohost, accessible dans la page du SSO. Si tu te limites au code existant de l’appli que je t’ai pointée, ton NAS ne sera accessible qu’une fois loggué dans le sso Yunohost.
Il est possible d’éviter ça et de le rendre accessible à tout le monde sans besoin d’étre loggué (cf skipped_uris comme ici). A voir selon ton besoin.

Merci, ça semble assez simple en effet.

Je teste ça dès que je peux.

Alors, j’ai essayé ce que tu m’as dit. J’ai bien réussi à créer une nouvelle appli “NAS” mais quand j’y accède, je tombe sur la page par défaut de nginx (qui n’est pas service par mon NAS, il n’y a pas nginx dessus).

Je continue à chercher mais si certains ont une idée, je suis preneur.

Merci.

Tu as bien fait le ménage de tes essais précédents ?

Effectivement, ça devait être des restes de conf.

J’ai monté une nouvelle VM avec une install propre de Yunohost, ça fonctionne. Du moins en HTTP.

Je galère encore un peu en HTTPS, sachant que je veux garder la connexion chiffrée de bout en bout (donc je garde mes certificats actuels sur le NAS).

Bref, c’est bon côté Yunohost, je vais fouiller du côté de nginx pour la partie HTTPS.

Merci en tout cas !