Basculer le menu
Changer de menu des préférences
Basculer le menu personnel
Non connecté(e)
Votre adresse IP sera visible au public si vous faites des modifications.

Reverse Proxy NGINX

De EC_Wiki
Version datée du 23 décembre 2025 à 15:44 par Eugene (discussion | contributions)
(diff) ← Version précédente | Voir la version actuelle (diff) | Version suivante → (diff)

🧩 Reverse Proxy NGINX — Services en Subpath (Checklist complète) modifier

1. Règles générales (à toujours appliquer) modifier

  • Toujours utiliser un bloc de redirection pour forcer le / final :
nginx ^

 location = /app {
   return 301 /app/;
 }
  • Toujours utiliser un bloc ^~ /app/ pour éviter les conflits :
nginx:
location ^~ /app/ {
  • Toujours décider si le proxy_pass doit avoir un / final :

° Avec / final → remappe /app/... → /... ° Sans / final → garde le chemin complet /app/...

2. Règle du slash dans proxy_pass (le piège classique) modifier

✔️ Si le service tourne à la racine (/) modifier

Exemples : Portainer, HomePharma, phpMyAdmin, Prometheus, Streamlit

→ Mettre un slash final

nginx:
proxy_pass http://127.0.0.1:5000/;

✔️ Si le service tourne en subpath natif modifier

Exemples : Grafana (root_url = /grafana), Nextcloud (/nextcloud)

→ Pas de slash final

nginx: 
proxy_pass http://127.0.0.1:3000;

3. Modèle NGINX pour un service en subpath modifier

À copier/coller pour n’importe quel service :

location = /APP {
   return 301 /APP/;
}

location ^~ /APP/ {
   proxy_pass http://127.0.0.1:PORT/;
   proxy_http_version 1.1;

   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_set_header X-Forwarded-Proto $scheme;

   proxy_set_header Upgrade $http_upgrade;
   proxy_set_header Connection "upgrade";

   proxy_redirect off;
   proxy_cookie_path / "/APP/";

   proxy_read_timeout 900s;
   proxy_send_timeout 900s;
}

Remplacer APP et PORT.

4. Flask derrière NGINX en subpath modifier

Flask ne gère pas nativement les subpaths. Il faut lui dire explicitement qu’il tourne sous /homepharma. Dans app.py, juste après app = Flask(...) :

python:
app.config['APPLICATION_ROOT'] = '/homepharma'

Si l’app utilise des fichiers statiques : modifier

python:
app = Flask(__name__, static_url_path='/homepharma/static')

Vérification locale : modifier

bash:
curl -I http://127.0.0.1:5000

Vérification reverse proxy : modifier

bash:
curl -I https://IP/homepharma/ --insecure

5. Service systemd pour une app Python (modèle propre) modifier

ini:
[Unit]
Description=Nom de l'application Flask
After=network.target

[Service]
User=eugene
WorkingDirectory=/var/www/APP
ExecStart=/var/www/APP/venv/bin/python /var/www/APP/app.py
Restart=always
RestartSec=3
Environment="PATH=/var/www/APP/venv/bin"
Environment="FLASK_ENV=production"

[Install]
WantedBy=multi-user.target

6. Pièges à éviter absolument modifier

  • ❌ Ne jamais laisser traîner des .save, .bak, .old dans sites-enabled
  • ❌ Ne jamais oublier le / final dans proxy_pass pour les apps à la racine
  • ❌ Ne jamais utiliser location /app (match trop large)
  • ❌ Ne jamais oublier la redirection /app → /app/
  • ❌ Ne jamais oublier d’adapter Flask pour les subpaths