suite relecture

This commit is contained in:
Gregory Colpart 2018-02-28 09:13:12 +01:00
parent 8fc5a0868a
commit 94c67d55e5

View file

@ -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
<http://nginx.org/en/docs/http/ngx_http_rewrite_module.html#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
<http://wiki.nginx.org/HttpAuthBasicModule>
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 <IP>;
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
<http://nginx.org/en/docs/http/ngx_http_rewrite_module.html#rewrite>
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
<http://wiki.nginx.org/HttpAuthBasicModule>
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
<https://nginxconfig.io/>
## FAQ
### Comment prononcer Nginx ?
TODO
### .htaccess ?
TODO
### Erreurs diverses
<https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/>