====== nginx ======
[[http://nginx.org/|nginx]] est un serveur Web (au même titre que Apache, Lighttpd, etc.), et proxy inverse.
Pour les systèmes Debian (et Ubuntu-like), la configuration du serveur est découpée entre plusieurs fichiers, au lieu du traditionnel ''nginx.conf''.
Reportez-vous à la documentation de votre distribution, avant d'appliquer les modifications.
===== Configuration =====
Le fichier est décomposé en blocs, il s'agit de directives globales et particulières.
* ''events''
* ''http''
* ''server'', c'est un peu l'équivalent des hôtes virtuels sous Apache.
* ''location'', défini une règle particulière en fonction d'un paramètre (ce dernier peut être plus ou moins complexe, par exemple une expression régulière, un répertoire, des extensions, etc.)
===== Traiter les journaux (erreur, accès) =====
Pour activer les journaux (erreur et accès).
[...]
error_log /var/log/nginx/error.log;
#error_log /var/log/nginx/error.log notice;
#error_log /var/log/nginx/error.log info;
pid /var/run/nginx.pid;
[...]
http {
[...]
access_log /var/log/nginx/access.log;
[...]
}
===== Lister le contenu d'un répertoire (autoindex) =====
Cela s'active avec la directive ''autoindex'' (la valeur est un booléen, **on**/**off**). Elle se définit dans un bloc ''location {}''.
[...]
location / {
autoindex on;
index index.html index.htm;
}
[...]
Avec cette option on peut également rajouter ces deux directives :
* ''autoindex_exact_size'', change l'unité des fichiers / dossiers
* ''autoindex_localtime'', affiche la date locale des fichiers / dossiers
===== Ne pas afficher la version du serveur =====
La directive, qui prend en charge cette propriété s'appelle ''server_tokens'' (il s'agit d'un booléen). On peut la placer dans les blocs ''http {}'', ''server {}'', ou ''location {}''.
[...]
http {
server_tokens off;
[...]
}
===== Accéder au serveur =====
==== Via le nom de domaine ====
Il faut utiliser la directive **server_name** dans le contexte d'un bloc ''server''.
Il faut au préalable avoir défini un fichier de zone (faisant autorité) grâce à [[http://www.isc.org/downloads/bind/|BIND]], [[http://www.nlnetlabs.nl/projects/nsd/|NSD]], ou via le panel de votre bureau d'enregistrement de nom de domaine (//registar//).
On doit avoir quelque chose qui ressemble à ça (je ne mets pas le fichier au complet, juste les enregistrements **A** ((Pour les adresses IPv6 on emploie plutôt **AAAA**.)) et **CNAME**).
[...]
exemple.com. IN A ip public du serveur
www IN CNAME exemple.com.
Le principe c'est de faire correspondre un nom d'hôte à une adresse IP.
* **CNAME** est un alias, on peut accéder au serveur via %%https://exemple.com/%% ou %%https://www.exemple.com/%%
[...]
server {
server_name exemple.com www.exemple.com;
[...]
}
[...]
==== Via une adresse IP ====
Si on n'a pas de nom de domaine, on accède au serveur par l'intermédiaire de son adresse IP.
On utilise dans ce cas la directive **listen** (toujours dans un contexte de type ''server'').
[...]
server {
listen 10.0.2.1:80;
[...]
}
[...]
Dans ce cas précis j'indique l'adresse IP et le numéro de port.
===== Cas particulier des sous-domaines =====
Dans certains cas, on peut avoir besoin d'utiliser un sous domaine. Il faut définir une nouvelle entrée dans le fichier de zone.
[...]
exemple.com. IN A ip public du serveur
blog IN A exemple.com.
www IN CNAME exemple.com.
J'ai défini un sous-domaine blog. Pour y avoir accès à travers mon navigateur, on doit définir un nouveau bloc ''server'' généralement avec un nouvelle directive **root** ((L'équivalent de DocumentRoot sous Apache.)) (dans le contexte de ''http'').
[...]
server {
server_name exemple.com www.exemple.com;
[...]
}
server {
listen 80;
server_name blog.exemple.com;
[...]
}
[...]
===== Équivalent de la directive UserDir d'Apache =====
[[http://httpd.apache.org/docs/2.4/howto/public_html.html|UserDir]] dans Apache (2.4).
Cela permet à un utilisateur de rendre accessible des pages, généralement placées dans le dossier ''public_html/''.
Il faut utiliser une expression régulière, que l'on place dans un bloc ''location {}''.
[...]
server {
[...]
# users directory support
location ~ ^/~(.+?)(/.*)?$ {
alias /home/$1/public_html$2;
autoindex on;
}
}
[...]
===== favicon.ico =====
Pour éviter d'enregistrer l'erreur 404 dans le fichier ''access.log'' pour le favicon, on rajoute ces lignes quelque part dans le bloc ''server { }''.
[...]
server {
location = /favicon.ico { access_log off; log_not_found off; }
}
[...]
===== Bloquer l'accès aux fichiers cachés =====
Les fichiers cachés sont ceux commençant par ".".
On rajoute cette ligne quelque part dans le bloc ''server { }''.
[...]
server {
location ~ /\. { access_log off; log_not_found off; deny all; }
}
[...]
===== Support de PHP =====
nginx prend en charge le langage PHP, via le protocole [[http://fr.wikipedia.org/wiki/FastCGI|FastCGI]]. Généralement avec ce langage on installe le module FastCGI Process Manager (FPM).
On utilise un bloc ''location {}'' pour ça :
[...]
server {
[...]
# pass the PHP scripts to FastCGI server using socket Unix
#
location ~ \.php$ {
root /srv/www/htdocs/;
try_files $uri =404;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
[...]
}
[...]
Dans cet exemple, on utilise un //socket unix//, mais on pourrait également recourir à un //socket TCP/IP//. La valeur de la directive ''fastcgi_pass'' dans ce cas préciser sera un nom de domaine (ou une adresse IP) et un port (autre que celui utilisé dans le bloc ''server {}'').
==== Support de PHP pour la directive UserDir ====
Il faut respecter l'ordre des différents blocs ''location'', sinon on obtient des erreurs.
[...]
server {
[...]
location ~ ^/~(.+?)(/.*\.php)$ {
alias /home/$1/public_html$2;
autoindex on;
include fastcgi_params;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
location ~ \.php$ {
root /srv/www/htdocs/;
try_files $uri =404;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
# users directory support
#
location ~ ^/~(.+?)(/.*)?$ {
alias /home/$1/public_html$2;
autoindex on;
index index.html index.php;
}
[...]
}
[...]
===== Basic authentication =====
Le mot de passe sera transmis en **clair**.
//Basic authentication// ou authentification HTTP [[http://tools.ietf.org/html/rfc2617|RFC 2617]] permet de s'identifier auprès du serveur, pour accéder à une ressource restreinte. Le fonctionnement général est très bien décrit sur la page [[http://fr.wikipedia.org/wiki/Authentification_HTTP#Fonctionnement_g.C3.A9n.C3.A9ral|Wikipédia]].
Il faut créer un fichier qui va contenir les identifiant (//login// et //hash// du mot de passe).
==== Génération du hash du mot de passe ====
On va utiliser la boîte à outil OpenSSL (ou LibreSSL). L'algorithme sera [[http://fr.wikipedia.org/wiki/APR1|apr1]].
La commande est la suivante :
openssl passwd -apr1 -salt ...1... ...2...
Où
- correspond au //salage//
- correspond au mot de passe
Le « sel » est une chaîne de caractères aléatoires, afin de renforcer la sécurité.
openssl rand -base64 6
Une chaîne de 8 caractères est ainsi générée. On peut combiner les deux commandes (c'est mieux).
openssl passwd -apr1 -salt `openssl rand -base64 6` ...2...
On copie le résultat dans un fichier (par exemple ''passwd''). Il doit être sous cette forme :
# Comment
login1:password
login2:password2
[...]
loginN:passwordN
C'est un fichier sensible, il faut donc restreindre certains droits.
chmod o-r passwd
chmod u-w passwd
chown root:nginx passwd
**Explication :** Personne ne peut l'éditer, **root** et les membres du groupe **nginx** ont uniquement le droit de le lire.
==== Règle dans nginx.conf ====
À placer dans un bloc ''location {}''.
[...]
# HTTP Basic Authentication
#
location /secret/ {
auth_basic "Chouffe";
auth_basic_user_file /etc/nginx/passwd;
}
[...]
La directive **auth_basic_user_file** contient le chemin (complet) vers le fichier où sont stockés les identifiants.
**auth_basic** définit le domaine de protection.