====== 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.