Files
2026-06-09 18:40:21 +02:00

188 lines
7.1 KiB
Markdown

---
title: nginx-proxy
created: 2026-06-06
updated: 2026-06-06
type: app
tags: [catalogue, reverse-proxy, docker, nginx, auto-hebergement, automation]
confidence: high
contested: false
sources: [https://selfh.st/apps/?tag=Reverse+Proxy, https://github.com/nginx-proxy/nginx-proxy]
---
# 🐳 nginx-proxy
> **Reverse proxy Nginx automatisé pour Docker** : démarre un conteneur Nginx qui détecte les autres conteneurs et génère la configuration automatiquement via la variable d'environnement `VIRTUAL_HOST`. L'ancêtre du reverse-proxy-as-a-container.
## 📋 Informations Générales
| Champ | Valeur |
| :--- | :--- |
| **Site web** | [github.com/nginx-proxy](https://github.com/nginx-proxy/nginx-proxy) |
| **GitHub** | [nginx-proxy/nginx-proxy](https://github.com/nginx-proxy/nginx-proxy) |
| **License** | MIT |
| **Langage** | Shell, Python (docker-gen) |
| **Étoiles GitHub** | 19.9k ⭐ |
| **Dernière MAJ** | 2026-05-27 |
| **Catégorie** | [[cat-reverse-proxy|Reverse Proxy]] |
## 📝 Description
**nginx-proxy** est le **pionnier du reverse proxy "Docker-native"** : un conteneur unique qui wrap **Nginx** + **docker-gen** (générateur de configs basé sur les métadonnées Docker). Quand un conteneur démarre avec `VIRTUAL_HOST=app.example.com`, nginx-proxy détecte l'événement, génère la conf Nginx, et reload — **zéro configuration manuelle**.
**Caractéristiques** :
-**Configuration par variables d'environnement** (`VIRTUAL_HOST`, `LETSENCRYPT_HOST`, `VIRTUAL_PORT`, etc.)
-**Auto-reload** : la conf se regénère à chaque démarrage/arrêt de conteneur
-**HTTPS automatique** via le compagnon [acme-companion](https://github.com/nginx-proxy/acme-companion) (Let's Encrypt)
-**WebSocket** supporté nativement
-**Multi-domaines** : un seul nginx-proxy peut gérer des centaines de sites
-**Single binary** côté final : juste Nginx sous le capot
-**Léger** : image basée sur `nginx:mainline` (~50 Mo)
-**MIT** : open source, maintenu par la communauté (et désormais par ZeroSSL)
**Positionnement** : c'est l'**ancêtre** des reverse proxies Docker. Avant lui, il fallait écrire des vhosts Nginx à la main. Avec lui, vous ne touchez plus jamais à un fichier de conf. **L'ancêtre conceptuel de Traefik** (qui a ensuite ajouté l'auto-discovery des labels, plus flexible).
**Limites** : c'est plus **rigide** que Traefik (variables d'env seulement, pas de labels) et **moins moderne** (pas d'API, pas de dashboard). Pour des stacks simples, il reste imbattable en simplicité. Pour des stacks complexes, Traefik a pris le dessus.
**Public cible** : utilisateurs qui veulent un reverse proxy **basique, solide, sans fioritures**, sur une stack Docker de taille petite à moyenne.
## 🚀 Installation
### Option 1 : Docker run (le plus simple)
```bash
docker run --detach \
--name nginx-proxy \
--publish 80:80 \
--publish 443:443 \
--volume /var/run/docker.sock:/tmp/docker.sock:ro \
nginxproxy/nginx-proxy:1.11
```
C'est tout. nginx-proxy tourne, écoute Docker.
### Option 2 : Docker Compose (recommandé)
```yaml
# docker-compose.yml
version: '3.8'
services:
nginx-proxy:
image: nginxproxy/nginx-proxy:1.11
container_name: nginx-proxy
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro
- html:/usr/share/nginx/html
- certs:/etc/nginx/certs
networks:
- proxy
networks:
proxy:
name: proxy
volumes:
html:
certs:
```
### Exemple : ajouter un service à proxyfier
```yaml
# docker-compose.yml (à part ou dans le même stack)
services:
whoami:
image: traefik/whoami
networks:
- proxy
environment:
- VIRTUAL_HOST=whoami.example.com
# Optionnel : HTTPS auto avec acme-companion
- LETSENCRYPT_HOST=whoami.example.com
- LETSENCRYPT_EMAIL=admin@example.com
networks:
proxy:
external: true # Réseau partagé avec nginx-proxy
```
**Logique** : dès que `whoami` démarre, nginx-proxy détecte le label, génère le vhost, et route `whoami.example.com` vers le conteneur.
### Variante avec HTTPS automatique (acme-companion)
```yaml
# Ajouter à côté de nginx-proxy
services:
acme-companion:
image: nginxproxy/acme-companion:2.4
container_name: nginx-proxy-acme
restart: unless-stopped
volumes_from:
- nginx-proxy
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- acme:/etc/acme.sh
environment:
- DEFAULT_EMAIL=admin@example.com
- NGINX_PROXY_CONTAINER=nginx-proxy
volumes:
acme:
```
## ⚙️ Configuration Initiale
1. **Créer un réseau Docker partagé** : `docker network create proxy`
2. **Lancer nginx-proxy** (ci-dessus)
3. **Pour chaque app à exposer** :
- Définir `VIRTUAL_HOST=monapp.example.com`
- Placer le conteneur sur le réseau `proxy`
- **Exposer le port** (`EXPOSE 8080` dans le Dockerfile ou `--expose`)
4. **Pointer le DNS** : A record `monapp.example.com` → IP du serveur
5. **(Optionnel HTTPS)** Lancer `acme-companion` pour les certificats
> ⚠️ **Piège courant** : les conteneurs proxyfiés doivent **partager un réseau Docker** avec nginx-proxy. Sur le réseau bridge par défaut, ça marche "par chance" mais en user-defined network, il faut faire `networks: [proxy: { external: true }]`.
## 🔄 Alternatives
### Open Source
- [[app-traefik]] — Plus moderne, auto-discovery par labels (pas env)
- [[app-caddy]] — HTTPS automatique natif sans compagnon
- [[app-nginx-proxy-manager]] — Nginx + GUI web, plus user-friendly
- [[app-haproxy]] — Load balancer pur, pas auto-discovery
- [jwilder/nginx-proxy](https://github.com/jwilder/nginx-proxy) — version originale (maintenant dépréciée, le projet est chez `nginx-proxy/nginx-proxy`)
### Propriétaires
- **AWS ALB** (Application Load Balancer)
- **Cloudflare Load Balancer**
- **F5 BIG-IP** (enterprise)
- **HAProxy Enterprise**
## 🔐 Sécurité
- **HTTPS** via Let's Encrypt (acme-companion) — **fortement recommandé**
- **Pas d'IP whitelisting natif** : à faire via une conf Nginx custom
- **Pas de rate limiting natif** : idem, conf custom
- **HSTS / headers sécurité** : à configurer dans la conf Nginx
- **Docker socket en lecture seule** : limit l'escalade de privilèges
- **Image régulièrement mise à jour** : suivre les releases
> 💡 **Astuce** : pour ajouter des middlewares (auth, rate-limit, headers), il faut créer un **fichier de conf custom** et le monter dans `/etc/nginx/conf.d/`. nginx-proxy n'a pas d'équivalent des middlewares Traefik.
## 📚 Ressources
- [Documentation officielle](https://github.com/nginx-proxy/nginx-proxy/tree/main/docs)
- [Docker Hub](https://hub.docker.com/r/nginxproxy/nginx-proxy)
- [acme-companion (HTTPS)](https://github.com/nginx-proxy/acme-companion)
- [Docker-gen](https://github.com/nginx-proxy/docker-gen)
## Pages Liées
- [[cat-reverse-proxy]] — Catégorie Reverse Proxy
- [[app-traefik]] — Successeur moderne
- [[app-nginx-proxy-manager]] — Variante avec GUI
- [[comparatif-reverse-proxy]] — Comparaison détaillée
- [[recettes-docker-compose]] — Templates d'intégration