Maîtriser la configuration Nginx : Directives essentielles expliquées
Nginx est un serveur web et un proxy inverse puissant et performant qui est devenu une pierre angulaire de l'infrastructure web moderne. Sa flexibilité et son efficacité sont en grande partie dues à sa nature hautement configurable. Cependant, naviguer dans la myriade de directives de configuration peut être intimidant pour les nouveaux venus. Ce guide vise à démystifier la configuration Nginx en expliquant certaines des directives les plus essentielles que vous rencontrerez, en fournissant des exemples pratiques et des meilleures pratiques pour vous aider à construire, optimiser et sécuriser efficacement vos applications web.
Comprendre ces directives de base est crucial pour quiconque gère Nginx. Que vous configuriez un simple site web statique, un proxy inverse complexe pour des microservices, ou que vous optimisiez les performances, une solide compréhension du langage de configuration de Nginx vous permettra d'exploiter tout son potentiel et de résoudre les problèmes plus efficacement.
Structure de la configuration Nginx
Les fichiers de configuration Nginx résident généralement dans /etc/nginx/ sur la plupart des distributions Linux. Le fichier de configuration principal est nginx.conf, qui inclut souvent d'autres fichiers de configuration provenant de répertoires tels que /etc/nginx/conf.d/ ou /etc/nginx/sites-available/ (avec des liens symboliques dans /etc/nginx/sites-enabled/).
La configuration est hiérarchique, organisée en blocs ou directives. Les blocs clés incluent :
events: Configure les événements réseau.http: Contient les directives relatives au protocole HTTP.server: Définit un serveur virtuel.location: Spécifie comment traiter les requêtes pour un URI particulier.
Les directives sont des paires clé-valeur qui contrôlent le comportement de Nginx. Elles peuvent être globales ou imbriquées dans des blocs.
Directives essentielles expliquées
Plongeons dans certaines des directives les plus fréquemment utilisées et importantes.
Le bloc http
Le bloc http englobe les configurations qui s'appliquent globalement au trafic HTTP. C'est là que vous définirez les paramètres courants pour votre serveur web.
-
include: Cette directive vous permet d'inclure d'autres fichiers de configuration, aidant à modulariser votre configuration. Elle est couramment utilisée pour séparer les configurations de différents sites web ou applications.
```nginx
http {
include mime.types;
default_type application/octet-stream;# Inclure les configurations de serveur du répertoire conf.d include /etc/nginx/conf.d/*.conf;}
``` -
log_format: Définit des formats de log personnalisés pour les logs d'accès et d'erreur de Nginx. Ceci est essentiel pour une journalisation et une analyse détaillées.
```nginx
http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';access_log /var/log/nginx/access.log main; error_log /var/log/nginx/error.log; # ... autres directives http}
``` -
sendfile: Optimise les transferts de fichiers en permettant au noyau d'envoyer des fichiers directement du disque vers le client, en contournant l'espace utilisateur. Réglez suronpour les performances.
nginx http { sendfile on; # ... } -
tcp_nopushettcp_nodelay: Ces directives peuvent optimiser davantage les performances des connexions TCP.tcp_nopush on;indique à Nginx d'essayer d'envoyer l'en-tête et le début de la réponse en un seul paquet.tcp_nodelay on;désactive l'algorithme de Nagle.
nginx http { tcp_nopush on; tcp_nodelay on; # ... }
Le bloc server
Chaque bloc server définit un serveur virtuel, permettant à Nginx de gérer les requêtes pour différents noms de domaine ou adresses IP sur le même serveur.
-
listen: Spécifie l'adresse IP et/ou le port sur lequel le serveur écoutera les connexions entrantes.
nginx server { listen 80; listen [::]:80; server_name example.com www.example.com; # ... } -
server_name: Définit les noms du serveur. Nginx l'utilise pour faire correspondre l'en-têteHostde la requête entrante.
nginx server { listen 80; server_name mydomain.org *.mydomain.org; # ... } -
root: Définit la racine du document pour les requêtes. C'est le répertoire de base à partir duquel Nginx servira les fichiers.
nginx server { listen 80; server_name localhost; root /var/www/html; index index.html index.htm; # ... } -
index: Spécifie le fichier par défaut à servir lorsqu'un répertoire est demandé (par exemple,/).
nginx server { # ... index index.html index.htm default.html; # ... } -
error_page: Définit des pages d'erreur personnalisées pour des codes de statut HTTP spécifiques.
nginx server { # ... error_page 404 /404.html; location = /404.html { root /usr/share/nginx/html; internal; } # ... }
Le bloc location
Le bloc location est utilisé pour faire correspondre les URIs de requête et déterminer comment Nginx doit les traiter. C'est ici que vous configurez le routage pour différentes parties de votre application.
-
Correspondance des URIs : Les locations peuvent correspondre à des chaînes exactes, des préfixes ou des expressions régulières.
```nginx
location /images/ {
# Directives pour les requêtes commençant par /images/
}location = /favicon.ico {
# Correspondance exacte pour /favicon.ico
}location ~ .php$ {
# Correspondance d'expression régulière pour les fichiers se terminant par .php
}
``` -
proxy_pass: Utilisé dans les configurations de proxy inverse pour transférer les requêtes vers un serveur en amont.
nginx location /api/ { proxy_pass http://backend-service: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; } -
alias: Similaire àroot, mais change le répertoire de base pour les requêtes au sein d'unelocationspécifique. Il est souvent utilisé pour servir des ressources statiques à partir d'un chemin différent.
nginx location /static/ { alias /var/www/app/assets/; }
Remarque :aliasremplace le préfixe de location correspondant par le chemin alias, tandis querootajoute l'URI au chemin racine. -
try_files: Vérifie l'existence de fichiers dans un ordre spécifié et sert le premier trouvé, ou renvoie un code/URI spécifié.
nginx location / { try_files $uri $uri/ /index.html; }
Ceci est courant pour les applications monopages (SPA), garantissant que si un fichier ou un répertoire demandé n'existe pas, Nginx sertindex.html.
Directives de sécurité et de performance
-
ssl_certificateetssl_certificate_key: Essentiels pour configurer HTTPS. Ces directives pointent vers vos fichiers de certificat SSL et de clé privée.
```nginx
server {
listen 443 ssl;
server_name secure.example.com;ssl_certificate /etc/letsencrypt/live/secure.example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/secure.example.com/privkey.pem; # ... autres paramètres SSL}
``` -
gzip: Active ou désactive la compression Gzip pour les réponses, réduisant considérablement la taille de transfert et améliorant les temps de chargement.
nginx http { gzip on; gzip_vary on; gzip_proxied any; gzip_comp_level 6; gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; # ... } -
expires: Contrôle les en-têtesExpiresetCache-Controlpour les ressources statiques, indiquant aux navigateurs et aux proxys combien de temps les mettre en cache.
nginx location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ { expires 30d; add_header Cache-Control "public"; }
Commandes Nginx courantes
Pour gérer Nginx et appliquer les modifications de configuration, vous utiliserez fréquemment ces commandes :
-
Tester la configuration : Vérifie les erreurs de syntaxe dans vos fichiers de configuration Nginx.
bash sudo nginx -t -
Recharger la configuration : Recharge gracieusement la configuration Nginx sans interrompre les connexions actives.
bash sudo systemctl reload nginx # ou sudo service nginx reload -
Redémarrer Nginx : Arrête puis démarre le service Nginx.
bash sudo systemctl restart nginx # ou sudo service nginx restart -
Vérifier le statut : Affiche le statut actuel du service Nginx.
bash sudo systemctl status nginx # ou sudo service nginx status
Conclusion
Maîtriser la configuration Nginx est un processus continu, mais la compréhension de ces directives essentielles fournit une base solide. En utilisant efficacement les blocs server pour l'hébergement virtuel, les blocs location pour le routage des requêtes, et en exploitant les directives pour la performance, la sécurité et la journalisation, vous pouvez construire des applications web très efficaces et robustes. N'oubliez pas de toujours tester vos modifications de configuration avec nginx -t avant de recharger ou redémarrer Nginx pour éviter les temps d'arrêt.