suite relecture
This commit is contained in:
parent
8fc5a0868a
commit
94c67d55e5
384
HowtoNginx.md
384
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
|
||||
|
||||
<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/>
|
||||
|
||||
|
|
Loading…
Reference in a new issue