From 94c67d55e5e2f0e421f7f7689a7fe6bb44b6e0e2 Mon Sep 17 00:00:00 2001 From: Gregory Colpart Date: Wed, 28 Feb 2018 09:13:12 +0100 Subject: [PATCH] suite relecture --- HowtoNginx.md | 384 ++++++++++++++++++++++++++------------------------ 1 file changed, 197 insertions(+), 187 deletions(-) diff --git a/HowtoNginx.md b/HowtoNginx.md index c51145b4..594260f2 100644 --- a/HowtoNginx.md +++ b/HowtoNginx.md @@ -176,6 +176,191 @@ Pour les directives _location_, Nginx va d'abord examiner celles avec des expres qui seront choisies avant les plus courtes. Dans l'exemple ci-dessous, Nginx vérifiera d'abord si la ressource demandée se termine par .css puis si elle commence par /images/ puis au final la directive _location/_. +### alias + +Les alias permettent de faire servir du contenu qui ne serait pas stocké dans un répertoire servi par nginx (/var/www/nginx par exemple). + +~~~ +location /crossdomain.xml { + alias /foo/bar/fichier.xml; +} +~~~ + +Quelle différence entre la directive `alias` et `root` ? + +`alias` redirige la requête initiale sans le chemin complet tandis que la directive root passe en paramètre le chemin complet. + +Exemple : + +~~~ +location /hello/ { + alias /spool/images/; +} +~~~ + +Avec `alias`, pour une requête sur `/hello/word.png` Nginx renverra le contenu de `/spool/hello/word.png` tandis qu'avec la directive `root`, elle renverra le contenu de `/spool/images/hello/word.png`. + +### proxy_pass + +Nginx peut aussi agir comme Reverse Proxy. On utilisera alors la directive **proxy_pass** pour définir le serveur vers lequel la requête est envoyée. On peut aussi définir des headers qui seront ajoutés à la requête quand elle est transmise (Notamment, l'IP du visiteur, car le serveur dernière le proxy ne peut voir l'IP de celui-ci) + +~~~ +location / { + proxy_pass http://localhost:8080; + 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; +} +~~~ + +### rewrite + + + +On peut faire des ré-écritures basiques (moins puissant que les [Rewrite Rules d'Apache](HowtoApache#rewrite-rules)), par exemple : + +~~~ +rewrite ^regex$ /vers-cette/uri.exemple.php {last,break,permanent,redirect} +~~~ + +### real_ip_header + +Si les requêtes viennent d'un proxy HTTP (Varnish par exemple), il faut substituer l'adresse IP d'origine par celle contenue dans le header `X-Forwarded-for`. +Cela se fait ainsi en s'assurant d'avoir le paquet `nginx-extras` installé : + +~~~ +set_real_ip_from 192.0.2.10; # IP du proxy HTTP +real_ip_recursive on; +real_ip_header X-Forwarded-For; +~~~ + +Cela permet ensuite d'appliquer ensuite des restrictions d'adresses IP par exemple. + +### Authentification HTTP + + + +Pour configurer une authentification HTTP, on ajoutera les lignes suivantes au sein d'une directive `location` : + +~~~ +auth_basic "Restricted"; +auth_basic_user_file /home/foo/.htpasswd; +~~~ + +Attention, si l'on ne souhaite protéger tout le site (location /), il faudra se méfier et bien ajuster la configuration pour s'assurer que tous les fichiers sont protégés (notamment les fichiers PHP par exemple). + +Le fichier `.htpasswd` étant généré avec l'utilitaire *htpasswd* (comme pour Apache). Bien vérifier les droits en lecture pour l'utilisateur qui fait tourner Nginx ("www-data" en général). + +### Redirection https + +~~~ +server { + listen 80; + server_name www.example.com example.com; + + return 301 https://www.example.com$request_uri; +} + +server { + listen 443 ssl; + server_name example.com; + + return 301 https://www.example.com$request_uri; + + […] +} + +server { + listen 443 ssl; + server_name www.example.com; + + […] +} +~~~ + +### Bloquer selon adresse IP + +Le but est de bloquer par adresse IP et de rediriger vers une page « Vous êtes bloqués ». + +~~~ +# Blacklisting +geo $blacklist { + default 0; + 192.0.2.42/32 1; +} + +server { +[…] + + # Blacklisting + if ($blacklist) { + rewrite ^ http://donthackmeplz.fr; + } + +~~~ + +### Cross-domain pour les fonts + +~~~ +location ~* \.(eot|ttf|woff)$ { + add_header Access-Control-Allow-Origin *; +} +~~~ + +### http_user_agent + +~~~ +if ($http_user_agent ~* (DotBot|Cliqzbot|AhrefsBot|SemrushBot)) { + return 404; +} +~~~ + +Si on doit bloquer un user-agent avec des espaces dans son nom, une solution est d’échapper les espaces avec des backslash comme ceci : + +~~~ +if ($http_user_agent ~* (DotBot|Cliqzbot|AhrefsBot|SemrushBot|Go\ 1\.1\ package\ http)) { + return 404; +} +~~~ + +### error_page + +On peut avoir une page personnalisée selon le code d'erreur HTTP renvoyé. +Contrairement à apache, on ne pourra indiquer une conf général à inclure qui s'appliquera pour tous les vhosts, mais il faudra ajouter l'include sur tous les fichiers de confs des vhosts. + +Fichier de conf général */etc/nginx/error.conf* + +~~~ +location /YYYYYY/ { + alias /var/www/; + index page.html; +} +error_page XXX /YYYYYY/; + +~~~ + +Remplacer XXX par le code erreur HTTP souhaité et YYYYY par le nom de _Location_ souhaité (URL) - vu que global à tous les vhosts, prendre une chaîne aléatoire. + +Et pour chaque conf des vhosts `/etc/nginx/sites-enabled/*.conf` : + +~~~ +include /etc/nginx/error.conf; +~~~ + +### more_set_headers + +Si l'on veut manipuler les headers HTTP, on s'assure d'avoir le paquet `nginx-extras` installé, puis on peut utiliser la directive `more_set_headers`. Exemples : + +~~~ +more_set_headers 'Server: ' +more_set_headers 'Server: My Server v42' +~~~ + +### CGI / FCGI / UWSGI / PHP-FPM + +TODO + ## Monitoring @@ -187,7 +372,7 @@ Ajouter dans la configuration Nginx : location /nginx_status_NNNN { stub_status on; allow 127.0.0.1; - allow ; + allow 192.0.2.42; deny all; } ~~~ @@ -207,81 +392,6 @@ On peut ainsi activer les plugins _nginx_request_ et _nginx_status_ : # ln -s /usr/share/munin/plugins/nginx_status nginx_status ~~~ -œ -## Rewrite Rule - - - -Voici un exemple de ré-écriture : - -~~~ -rewrite ^regex$ /vers-cette/uri.exemple.php {last,break,permanent,redirect} -~~~ - - -### Ajout d'un alias - -Les alias permettent de faire servir du contenu qui ne serait pas stocké dans un répertoire servi par nginx (/var/www/nginx par exemple). - -~~~ -location /crossdomain.xml { - alias /home/chemin/du/fichier.xml; -} -~~~ - -### Différence entre la directive alias et root - -L'alias redirige la requête initiale sans le chemin complet tandis que la directive root passe en paramètre le chemin complet. - -Exemple : - -~~~ -location /i/ { - alias /spool/w3/images/; -} -~~~ - -Une requête sur /i/image.png, nginx renverra le contenu de /spool/w3/images/image.png tandis qu'avec la directive root, elle renverra le contenu de /spool/w3/images/*i*/image.png - -### Reverse Proxy - -Nginx peut aussi agir comme reverse-proxy. On utilisera alors la directive **proxy_pass** pour définir le serveur vers lequel la requête est envoyée. On peut aussi définir des headers qui seront ajoutés à la requête quand elle est transmise (Notamment, l'IP du visiteur, car le serveur dernière le proxy ne peut voir l'IP de celui-ci) - -~~~ -location / { - proxy_pass http://localhost:8080; - 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; -} -~~~ - -### Restrictions d'accès derrière un proxy (Varnish par exemple) - -Les restrictions d'IPs ne peuvent pas se baser sur le contenu des headers, il faut passer par un module tiers (fourni avec la version nginx-extras) "Real IP". -Il permet de substituer l'adresse IPs d'origine par celle notre choix, et notamment celle contenu dans le header "X-Forwarded-for" : - -~~~ -set_real_ip_from 127.0.0.1; # À remplacer par l'IP du proxy -real_ip_recursive on; -real_ip_header X-Forwarded-For; -~~~ - -### Authentification HTTP - - - -Pour configurer une authentification HTTP, on ajoutera les lignes suivantes au sein d'une directive `location` : - -~~~ -auth_basic "Restricted"; -auth_basic_user_file /home/foo/.htpasswd; -~~~ - -Attention, si l'on ne souhaite protéger tout le site (location /), il faudra se méfier et bien ajuster la configuration pour s'assurer que tous les fichiers sont protégés (notamment les fichiers PHP par exemple). - -Le fichier `.htpasswd` étant généré avec l'utilitaire *htpasswd* (comme pour Apache). Bien vérifier les droits en lecture pour l'utilisateur qui fait tourner Nginx ("www-data" en général). ## Optimisation @@ -347,6 +457,8 @@ EOT ## SSL +voir HowtoSSL (TODO) + ~~~ listen 0.0.0.0:443 ssl; listen [::]:443 ssl; @@ -374,124 +486,22 @@ Il faut alors activer le protocole dans la directive `listen`. Sachant que les n listen 0.0.0.0:443 ssl http2; ~~~ -## Divers - -### Redirection https - -~~~ -server { - listen 80; - server_name www.example.com example.com; - - return 301 https://www.example.com$request_uri; -} - -server { - listen 443 ssl; - server_name example.com; - - return 301 https://www.example.com$request_uri; - - […] -} - -server { - listen 443 ssl; - server_name www.example.com; - - […] -} -~~~ - -### Bloquer selon adresse IP - -Le but est de bloquer par adresse IP et de rediriger vers une page « Vous êtes bloqués ». - -~~~ -# Blacklisting -geo $blacklist { - default 0; - 192.0.2.42/32 1; -} - -server { -[…] - - # Blacklisting - if ($blacklist) { - rewrite ^ http://donthackmeplz.fr; - } - -~~~ - -### Cross-domain pour les fonts - -~~~ -location ~* \.(eot|ttf|woff)$ { - add_header Access-Control-Allow-Origin *; -} -~~~ - -### Selon user-agent - -~~~ -if ($http_user_agent ~* (DotBot|Cliqzbot|AhrefsBot|SemrushBot)) { - return 404; -} -~~~ - -Si on doit bloquer un user-agent avec des espaces dans son nom, une solution est d’échapper les espaces avec des backslash comme ceci : - -~~~ -if ($http_user_agent ~* (DotBot|Cliqzbot|AhrefsBot|SemrushBot|Go\ 1\.1\ package\ http)) { - return 404; -} -~~~ - -### Page personnalisé selon code erreur HTTP - -Contrairement à apache, on ne pourra indiquer une conf général à inclure qui s'appliquera pour tous les vhosts, mais il faudra ajouter l'include sur tous les fichiers de confs des vhosts. - -Fichier de conf général */etc/nginx/error.conf* - -~~~ -location /YYYYYY/ { - alias /var/www/; - index page.html; -} -error_page XXX /YYYYYY/; - -~~~ - -Remplacer XXX par le code erreur HTTP souhaité et YYYYY par le nom de _Location_ souhaité (URL) - vu que global à tous les vhosts, prendre une chaîne aléatoire. - -Et pour chaque conf des vhosts `/etc/nginx/sites-enabled/*.conf` : - -~~~ -include /etc/nginx/error.conf; -~~~ - -### Supprimer l'en-tête Server - -~~~ -# apt install nginx-extras -~~~ - -On peut maintenant utiliser la directive `more_set_headers`. Exemples : - -~~~ -more_set_headers 'Server: ' -more_set_headers 'Server: My Server v42' -~~~ +## FAQ ### Configuration en ligne -## FAQ - ### Comment prononcer Nginx ? +TODO + +### .htaccess ? + +TODO + +### Erreurs diverses +