Différences
Ci-dessous, les différences entre deux révisions de la page.
| Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
| fr:nginx [2025/02/11 09:02] – [Rediriger les sous-domaines non existant vers une adresse précise] zatalyz | fr:nginx [2025/07/15 05:46] (Version actuelle) – [Sur le backend (Apache)] zatalyz | ||
|---|---|---|---|
| Ligne 61: | Ligne 61: | ||
| └── win-utf</ | └── win-utf</ | ||
| - | Le fichier principal de configuration est '' | + | * Le fichier principal de configuration est '' |
| + | * Tout comme pour [[fr: | ||
| Ligne 92: | Ligne 93: | ||
| sudo service nginx restart | sudo service nginx restart | ||
| - | ===== Rediriger les sous-domaines non existant vers une adresse précise | + | ==== Rediriger les sous-domaines non existant vers une adresse précise ==== |
| Créez un fichier de configuration redirigeant tout ce qui ne matche pas : | Créez un fichier de configuration redirigeant tout ce qui ne matche pas : | ||
| < | < | ||
| Ligne 109: | Ligne 110: | ||
| Le snippets snakeoil ici est pour le https, c'est un certificat autosigné, c'est mieux que " | Le snippets snakeoil ici est pour le https, c'est un certificat autosigné, c'est mieux que " | ||
| - | ===== Proxy Nginx ne gérant pas le ssl ===== | + | ===== SSL Passthrough sur proxy Nginx ===== |
| - | <WRAP center round todo 60%> | + | |
| - | Cette partie est vraiment en brouillon mais si je ne note pas mes tests à mesure, je ne vais pas m'y retrouver. | + | |
| - | --- // | + | |
| - | </ | + | |
| Un proxy est un outil qui peut faire beaucoup de choses, ou très peu. Dans notre cas, l' | Un proxy est un outil qui peut faire beaucoup de choses, ou très peu. Dans notre cas, l' | ||
| Ligne 119: | Ligne 116: | ||
| Il est assez simple de gérer les certificats ssl au niveau du proxy, mais cela a pour conséquence que le trafic entre le proxy et les containers passe "en clair" | Il est assez simple de gérer les certificats ssl au niveau du proxy, mais cela a pour conséquence que le trafic entre le proxy et les containers passe "en clair" | ||
| - | Notre configuration | + | <WRAP center round tip 100%> |
| + | On ne peux pas avoir à la fois des services sans ssl passthrough et d' | ||
| - | sudo mkdir -p / | + | <WRAP center round important 60%> |
| - | sudo mkdir -p /etc/nginx/stream-avalaible | + | Ce type de configuration est riche en prise de tête. Ce n'est pas la peine d' |
| + | </WRAP> | ||
| - | Il faut aussi modifier le fichier " | + | </ |
| - | < | + | Pour notre exemple : |
| - | include / | + | * Le proxy Nginx reçoit tout le trafic (HTTP/HTTPS) pour monsite.org et autresite.net. Son ip locale est 192.168.1.100. |
| - | </ | + | |
| + | * monsite.org a comme IP interne : 192.168.1.207 et autresite.net a 192.168.1.208. Et les deux sont avec Apache, sinon ce n'est pas drôle. | ||
| - | Exemple dans le fichier : | + | Ici "le proxy" fait référence à la VM qui centralise les flux avant de les redispatcher et "le backend" |
| - | <code bash /etc/ | + | |
| - | user www-data; | + | |
| - | worker_processes auto; | + | |
| - | pid / | + | |
| - | error_log / | + | |
| - | include / | + | |
| - | include / | + | |
| - | events { | ||
| - | worker_connections 768; | ||
| - | # multi_accept on; | ||
| - | } | ||
| - | http { | + | ==== Sur le proxy ==== |
| - | [...] | + | On modifie ''/ |
| - | </ | + | < |
| + | Et on crée deux dossiers dont celui qui est lu : | ||
| - | Il n'y a pas forcément besoin de faire un fichier de configuration par domaine, puisqu' | + | < |
| + | sudo mkdir -p / | ||
| - | <WRAP center round help 60%> | + | <WRAP center round tip 60%> |
| - | Pourquoi ? Parce que. On pourrait rediriger tout 443 vers le stream, | + | On suit avec "stream-*" une logique similaire aux dossiers " |
| </ | </ | ||
| - | Primo on fait un fichier | + | Voici à quoi ressemble |
| - | <code bash / | + | |
| - | server { | + | |
| - | listen 80; | + | |
| - | # Listez de tous tes domaines | + | |
| - | server_name domain1.org domain2.org; | + | |
| - | # Rediriger toutes les requêtes HTTP vers HTTPS | + | <code bash /etc/nginx/ |
| - | return 301 https://$host$request_uri; | + | stream { |
| - | } | + | map $ssl_preread_server_name |
| + | monsite.org 192.168.1.207: | ||
| + | autresite.net | ||
| + | # Optionnel : où on redirige si le nom de domaine n' | ||
| + | default | ||
| + | } | ||
| - | # Configuration | + | # HTTPS - SSL Passthrough |
| - | server { | + | server { |
| - | listen 443; | + | listen |
| - | | + | # Lit les nom de domaine sans déchiffrer le reste |
| + | ssl_preread on; | ||
| + | # Route vers la VM correspondante | ||
| + | proxy_pass $backend; | ||
| + | # Transmet l'IP réelle des visiteuses | ||
| + | proxy_protocol on; | ||
| + | } | ||
| + | }</ | ||
| - | location / { | + | * '' |
| - | # Configurer | + | |
| - | | + | |
| - | # Transmettre l'IP des visiteuses | + | |
| - | | + | |
| - | proxy_set_header Host $host; | + | |
| - | proxy_set_header X-Real-IP $remote_addr; | + | |
| - | proxy_set_header X-Forwarded-Proto $scheme; | + | |
| - | proxy_buffering off; | + | |
| - | proxy_request_buffering off; | + | |
| - | } | + | |
| - | } | + | |
| - | </code> | + | Nous devons aussi déclarer le flux sur le port 80 ; mais là ça ne peut pas être du " |
| + | <code bash / | ||
| + | server { | ||
| + | listen 80; | ||
| + | server_name monsite.org; | ||
| - | Et à présent le stream | + | location / { |
| - | <code bash /etc/nginx/ | + | proxy_pass http://192.168.1.207:80; |
| - | stream { | + | |
| - | map $ssl_preread_server_name $backend { | + | |
| - | # Cette partie liste les domaines et " | + | |
| - | domain1.org 10.0.0.30:443; | + | |
| - | | + | |
| - | # Default est utile : si pas de domaines, ça renvoie là. | + | |
| - | | + | |
| } | } | ||
| server { | server { | ||
| - | listen | + | listen |
| - | proxy_pass $backend; | + | server_name autresite.net.fr; |
| - | | + | |
| + | | ||
| + | | ||
| + | proxy_set_header Host $host; | ||
| + | | ||
| + | } | ||
| } | } | ||
| - | } | ||
| </ | </ | ||
| + | Ici c'est vraiment très basique, mais il serait possible de rediriger dès maintenant vers une connexion sécurisée (443) sauf ce qui est nécessaire à l' | ||
| + | |||
| + | <code bash / | ||
| + | listen 80; | ||
| + | server_name monsite.org; | ||
| + | |||
| + | # Rediriger tout vers HTTPS (sauf / | ||
| + | location / | ||
| + | proxy_pass http:// | ||
| + | proxy_set_header Host $host; | ||
| + | } | ||
| + | |||
| + | location / { | ||
| + | return 301 https:// | ||
| + | } | ||
| + | }</ | ||
| + | |||
| + | Mais je préfère faire simple et gérer les ennuis côté apache, parce que les possibilités de bizarreries restent élevées avec ce genre de configuration. | ||
| On valide tout ça : | On valide tout ça : | ||
| - | < | + | < |
| - | sudo ln -s / | + | sudo ln -s / |
| sudo nginx -t | sudo nginx -t | ||
| sudo systemctl restart nginx | sudo systemctl restart nginx | ||
| </ | </ | ||
| - | <WRAP center round todo 60%> | + | ==== Sur le backend (Apache) ==== |
| - | Cela demandera aussi ce genre de config côté apache/backend | + | Je pars du principe que le backend |
| - | a2enmod | + | On commence par ''/ |
| + | <code bash / | ||
| + | # Déclare le proxy afin de recevoir les vraies ip des clients. | ||
| + | # Remplacer l'ip par celle du proxy ! | ||
| + | RemoteIPInternalProxy 192.168.1.206 | ||
| + | RemoteIPTrustedProxy 192.168.1.206 | ||
| + | RemoteIPHeader X-Forwarded-For | ||
| + | </ | ||
| - | <code>< | + | Puis |
| - | | + | < |
| - | | + | sudo a2enmod remoteip ssl |
| - | RemoteIPInternalProxy 10.0.0.10 | + | </ |
| - | | + | Et on configure ensuite notre site, quasiment comme s'il était sur un dédié : |
| - | </ | + | <code bash / |
| - | </WRAP> | + | < |
| + | ServerName monsite.org | ||
| + | DocumentRoot / | ||
| + | |||
| + | # Redirection vers 443 sauf pour la demande de certificat | ||
| + | RewriteEngine On | ||
| + | RewriteCond %{REQUEST_URI} !.well-known/ | ||
| + | RewriteRule ^(.*)$ https:// | ||
| + | </ | ||
| + | |||
| + | < | ||
| + | ServerName monsite.org | ||
| + | # Important avec le ssl passthrough !!! | ||
| + | RemoteIPProxyProtocol On | ||
| + | |||
| + | DocumentRoot / | ||
| + | < | ||
| + | Options FollowSymLinks MultiViews | ||
| + | AllowOverride All | ||
| + | Require all granted | ||
| + | </ | ||
| + | |||
| + | SSLEngine On | ||
| + | SSLCertificateFile / | ||
| + | SSLCertificateKeyFile / | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | Sur le VirtualHost le point vraiment essentiel est de mettre le paramètre '' | ||
| + | |||
| + | On valide tout ça | ||
| + | |||
| + | < | ||
| + | sudo a2ensite org.monsite | ||
| + | sudo apachectl -t | ||
| + | sudo service apache2 restart | ||
| + | </code> | ||
| - | ===== Exemple | + | ===== Exemples |
| - | ==== Notre proxy ===== | + | ==== Proxy sans ssl passthrough |
| Exemple simple: | Exemple simple: | ||
| <code bash> | <code bash> | ||
| Ligne 262: | Ligne 316: | ||
| server { | server { | ||
| listen | listen | ||
| - | server_name " | + | server_name " |
| | | ||
| - | return | + | return |
| } | } | ||
| server { | server { | ||
| listen | listen | ||
| - | server_name " | + | server_name " |
| - | ssl_certificate / | + | ssl_certificate / |
| - | ssl_certificate_key / | + | ssl_certificate_key / |
| location / { | location / { | ||
| Ligne 289: | Ligne 343: | ||
| *[[fr: | *[[fr: | ||
| - | ==== Demander un certificat let' | + | ===== Demander un certificat let' |
| Voir [[fr: | Voir [[fr: | ||





