Blocs de localisation Nginx expliqués : Acheminer le trafic web
Nginx est reconnu pour sa rapidité et sa flexibilité en tant que serveur web, proxy inverse et équilibreur de charge. Le mécanisme essentiel qui permet ce contrôle précis de la gestion des requêtes est le bloc de localisation. Maîtriser les blocs de localisation est crucial pour tout administrateur souhaitant optimiser les performances, gérer divers points d'accès d'application et sécuriser des ressources spécifiques.
Ce guide fournit une analyse complète des blocs de localisation Nginx, expliquant les différents modificateurs de correspondance, l'ordre de traitement critique et des exemples pratiques pour acheminer efficacement le trafic web.
Rôle et anatomie d'un bloc de localisation
Un bloc location définit comment Nginx doit répondre aux requêtes basées sur l'URI de la requête (Uniform Resource Identifier). Ces blocs sont toujours imbriqués dans un bloc server.
Lorsqu'un client effectue une requête (par exemple, GET /images/logo.png), Nginx vérifie l'URI de la requête par rapport à tous les blocs de localisation définis dans le bloc server d'écoute pour déterminer la gestion appropriée, telle que servir un fichier, rediriger le client ou proxifier la requête vers un serveur d'applications.
Syntaxe de base
La syntaxe nécessite un modificateur (ou son absence) suivi d'un modèle (URI) :
location [modificateur] [modèle] {
# Directives de configuration (ex: root, index, proxy_pass)
}
Comprendre les types de correspondance de localisation (les modificateurs)
Nginx offre cinq façons principales de définir une correspondance de modèle. Le choix du modificateur impacte considérablement les performances et la précision du routage.
1. Correspondance de préfixe (aucun modificateur)
C'est le type de correspondance par défaut. Nginx recherche la chaîne de début la plus longue qui correspond à l'URI de la requête.
| Modificateur | Exemple | Comportement | Meilleur cas d'utilisation |
|---|---|---|---|
| (aucun) | location /blog/ |
Correspond aux URI commençant par /blog/ (ex: /blog/post/1). |
Usage général, définissant de grandes sections d'un site. |
Exemple :
location /docs/ {
root /var/www/html/public;
# Si l'URI est /docs/manual.pdf, Nginx recherche /var/www/html/public/docs/manual.pdf
}
2. Correspondance exacte (=)
Ce modificateur force une correspondance exacte entre l'URI et le modèle. Si une correspondance est trouvée, Nginx arrête immédiatement de rechercher d'autres localisations. C'est le type de correspondance le plus rapide.
| Modificateur | Exemple | Comportement | Meilleur cas d'utilisation |
|---|---|---|---|
= |
location = /favicon.ico |
Ne correspond qu'exactement à l'URI /favicon.ico. |
Gestion de fichiers spécifiques, fréquemment demandés ou de pages par défaut. |
3. Préfixe le plus long, sans expression régulière (^~)
Il s'agit d'une correspondance de préfixe spécialisée. Si Nginx trouve la correspondance de préfixe la plus longue en utilisant ^~, il arrête immédiatement de vérifier les blocs de localisation d'expressions régulières (regex), les annulant effectivement.
| Modificateur | Exemple | Comportement | Meilleur cas d'utilisation |
|---|---|---|---|
^~ |
location ^~ /assets/ |
Correspond aux URI commençant par /assets/ et empêche la vérification des correspondances d'expressions régulières plus lentes. |
Servir rapidement des actifs statiques et garantir que les répertoires d'actifs sont traités de manière prévisible. |
4. Expression régulière sensible à la casse (~)
Ceci utilise des expressions régulières compatibles Perl (PCRE) pour la correspondance. C'est puissant mais plus lent que les correspondances de préfixe. Le premier bloc d'expression régulière correspondant l'emporte.
| Modificateur | Exemple | Comportement | Meilleur cas d'utilisation |
|---|---|---|---|
~ |
location ~ \.php$ |
Correspond à tout URI se terminant par .php. |
Traitement de types de fichiers spécifiques (ex: transmission de scripts PHP à PHP-FPM). |
5. Expression régulière insensible à la casse (~*)
Identique à ~, mais la correspondance ignore la casse de l'URI.
| Modificateur | Exemple | Comportement | Meilleur cas d'utilisation |
|---|---|---|---|
~* |
location ~* \.(jpg|gif|png)$ |
Correspond aux extensions de fichiers image quelle que soit la casse (ex: .JPG ou .png). |
Gestion de fichiers où la cohérence de la casse pourrait poser problème. |
L'ordre critique de traitement des localisations
Comprendre l'ordre dans lequel Nginx traite les blocs de localisation est essentiel pour éviter un comportement inattendu. Nginx ne lit pas simplement les fichiers de configuration de haut en bas. Il utilise une hiérarchie stricte :
- Correspondance exacte (
=): Nginx vérifie d'abord tous les blocs de correspondance exacte. Si une correspondance est trouvée, le traitement s'arrête immédiatement et la requête est gérée par ce bloc. - Remplacement de la correspondance de préfixe la plus longue (
^~): Nginx recherche ensuite tous les blocs de localisation définis avec^~. Si la correspondance la plus longue est trouvée, le traitement s'arrête immédiatement. - Expressions régulières (
~et~*): Si la requête n'a pas été gérée par=ou^~, Nginx vérifie toutes les localisations d'expressions régulières (~et~*) dans l'ordre où elles apparaissent dans le fichier de configuration. La première qui correspond est utilisée, et le traitement s'arrête. - Correspondance de préfixe standard la plus longue (aucun modificateur): Si aucune correspondance d'expression régulière n'a été trouvée, Nginx utilise finalement la localisation de préfixe standard la plus longue (celles sans modificateur).
- Passe-partout (
location /): Si aucun autre bloc n'a correspondu, la localisation racine (/) est utilisée comme gestionnaire de secours.
Conseil : Si vous avez une correspondance
^~plus longue qu'une correspondance de préfixe standard, le^~l'emportera toujours et empêchera la vérification des blocs d'expressions régulières, même si un bloc d'expressions régulières correspondrait à l'URI.
Scénarios de configuration pratiques
1. Prioriser les actifs statiques pour la performance
Pour s'assurer que Nginx sert les fichiers statiques directement et rapidement, évitant les vérifications d'expressions régulières plus lentes et le traitement inutile par le serveur d'applications, utilisez le modificateur ^~.
server {
listen 80;
server_name myapp.com;
# 1. Correspondance exacte pour la page principale (priorité la plus élevée)
location = / {
proxy_pass http://backend_app_server;
}
# 2. Gestion rapide des actifs statiques, en contournant les vérifications d'expressions régulières
location ^~ /static/ {
root /var/www/site;
expires 30d;
break;
}
# 3. Expression régulière pour les fichiers multimédias courants
location ~* \.(gif|ico|css|js)$ {
root /var/www/site;
expires 7d;
}
# 4. Solution de repli pour toutes les autres requêtes dynamiques
location / {
proxy_pass http://backend_app_server;
}
}
2. Routage et proxification du trafic API
Lorsque Nginx est utilisé comme proxy inverse, les blocs de localisation sont cruciaux pour diriger le trafic vers le serveur d'applications en amont correct.
location /api/v1/ {
# S'assurer que Nginx respecte les paramètres de connexion du client
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
# Acheminer tout le trafic commençant par /api/v1/ vers le service backend
proxy_pass http://api_backend_service/v1/;
# Si vous devez supprimer /api/v1/ de l'URI avant de le transmettre en amont,
# vous utiliseriez une correspondance d'expression régulière et une réécriture :
# location ~ ^/api/v1/(.*)$ {
# proxy_pass http://api_backend_service/$1;
# }
}
3. Protection des répertoires sensibles
Les blocs de localisation peuvent être utilisés pour refuser l'accès externe aux répertoires internes sensibles, tels que les fichiers de configuration ou les répertoires cachés comme .git.
# Refuser l'accès aux fichiers commençant par un point (fichiers cachés)
location ~ /\.(ht|svn|git) {
deny all;
return 404; # Retourner 404 au lieu de 403 pour éviter de révéler leur existence
}
# Refuser l'accès à des répertoires de configuration spécifiques
location /app/config/ {
deny all;
}
Avertissement de sécurité : Utilisation de
aliasvs.rootLors de la configuration des chemins de fichiers au sein d'un bloc de localisation, soyez attentif à la différence entre
rootetalias.
root: Ajoute l'URI de requête complète au chemin défini. (ex:location /images/+root /data/mène à/data/images/filename.jpg)alias: Remplace la partie correspondante de l'URI par le chemin défini. Ceci est souvent nécessaire lorsque le bloc de localisation utilise une expression régulière ou doit supprimer une partie du chemin avant de servir le fichier. (ex:location /static/+alias /opt/app/files/mène à/opt/app/files/filename.jpg)
4. Gestion des barres obliques finales et des redirections
Il est souvent souhaitable d'appliquer une structure d'URL cohérente, par exemple en s'assurant que les répertoires se terminent toujours par une barre oblique finale (/).
# Forcer une barre oblique finale pour les chemins de répertoire si elle manque
location ~* /[a-z0-9\-_]+$ {
# Si l'URI correspond à un fichier, Nginx essaiera de le servir. Sinon, le traitera comme un répertoire.
# Vérifier si l'URI demandé correspond à un répertoire sur le disque :
if (-d $request_filename) {
return 301 $uri/;
}
}
Conclusion
Les blocs de localisation Nginx sont la colonne vertébrale de la configuration des serveurs, offrant un contrôle granulaire sur chaque requête entrante. En comprenant les cinq modificateurs de correspondance (=, ^~, ~, ~*, et préfixe) et l'ordre strict de traitement, les administrateurs peuvent créer des configurations de routage hautement optimisées, efficaces et fiables. Testez toujours les changements minutieusement, surtout lors du mélange de correspondances de préfixe et d'expressions régulières, pour s'assurer que le trafic circule exactement comme prévu.