Comment utiliser le module de carte de Nginx sur Ubuntu 16.04

introduction

Lors de la configuration d’un serveur pour un site Web, vous devrez peut-être mettre en œuvre certaines actions conditionnelles courantes. Par exemple, certains fichiers devraient peut-être être mis en cache par le navigateur de l’utilisateur plus longtemps que d’autres, ou certaines parties du site Web ne devraient être autorisées que via une connexion sécurisée (comme tout ce qui nécessite un mot de passe d’utilisateur), tandis que d’autres parties du site Web ne le sont pas. t.

Un autre exemple simple et courant consiste à s’assurer que, lorsqu’une nouvelle page Web est publiée à la place d’une ancienne, toutes les anciennes adresses seront redirigées vers les emplacements corrects. Ceci est utile car cela signifie que les anciens liens et les favoris ne cesseront pas de fonctionner et que cela préservera également la mise en cache de Google.

Le module de carte Nginx vous permet de créer des variables dans le fichier de configuration Nginx dont les valeurs sont conditionnelles, c’est-à-dire qu’elles dépendent des valeurs des autres variables. Dans ce guide, nous verrons comment utiliser le module cartographique de Nginx pour implémenter deux exemples: comment configurer une liste de redirections d’anciennes URL de sites Web vers de nouvelles adresses et comment créer une liste blanche de pays pour contrôler le trafic de votre site Web.

Conditions préalables

Pour suivre ce tutoriel, vous aurez besoin de:

Étape 1 - Création et test d’un exemple de page Web

Tout d’abord, nous allons créer un fichier test représentant un site Web nouvellement publié. Nous utiliserons ce fichier pour tester votre configuration.

Créons une page simple, + index.html +, dans le répertoire par défaut du site Web Nginx. Ce fichier n’aura que du texte brut décrivant ce qui se trouve à l’intérieur: Accueil.

sudo sh -c 'echo "Home" > /var/www/html/index.html'

Avec ce fichier de test en place, nous vérifierons ensuite qu’il est servi correctement avec + curl +. Nous n’avons pas besoin de spécifier + index.html + pour cette commande car ce fichier est servi par défaut si aucun nom de fichier exact n’est fourni.

curl http://localhost/

En réponse, vous devriez voir un seul mot dire * Home * comme ci-dessous:

Réponse Nginx

Home

Maintenant, essayons d’accéder à un fichier qui n’existe pas dans + / var / www / html / +, comme + old.html +.

curl -L http://localhost/old.html

La réponse sera un message d’erreur système, * 404 Introuvable *, indiquant que la page n’existe pas.

Réponse Nginx

<html>
<head><title></title></head>
<body bgcolor="white">
<center><h1></h1></center>
<hr><center>nginx/1.10.0 (Ubuntu)</center>
</body>
</html>

Nous utilisons simplement un site Web fictif dans ce didacticiel, mais si + old.html + était une page d’un site Web réel qui existait et était supprimée, le renvoi d’un 404 signifierait que tous les liens vers cette page sont rompus. Cela n’est pas idéal, car ces liens peuvent avoir été indexés par Google, imprimés ou écrits, ou partagés par tout autre moyen.

Dans la prochaine étape, nous utiliserons le module Carte pour nous assurer que cette ancienne adresse fonctionnera à nouveau en redirigeant automatiquement les spectateurs vers les nouveaux remplacements.

Étape 2 - Configuration des redirections

Pour les petits sites Web ne comportant que quelques pages, de simples instructions conditionnelles + if + peuvent être utilisées pour les redirections et autres opérations similaires. Cependant, une telle configuration n’est pas facile à maintenir ou à étendre à long terme car la liste des conditions s’allonge.

Le module de carte est une solution plus élégante et concise. Il vous permet de comparer les valeurs des variables Nginx avec une liste de conditions, puis d’associer une nouvelle valeur à la variable en fonction de la correspondance. Dans cet exemple, nous allons comparer l’URL demandée à la liste des anciennes pages que nous voulons rediriger vers leurs nouvelles pages homologues. Pour chaque ancienne adresse, nous associerons la nouvelle.

Le module Carte est un module Nginx de base, ce qui signifie qu’il n’est pas nécessaire de l’installer séparément pour être utilisé. Pour créer la carte nécessaire et rediriger la configuration, ouvrez le fichier de configuration Nginx du bloc de serveur par défaut dans + nano + ou dans votre éditeur de texte favori.

sudo nano /etc/nginx/sites-available/default

Trouvez le bloc de configuration + serveur +, qui ressemble à ceci:

/ etc / nginx / sites-available / default

. . .
# Default server configuration
#

server {
   listen 80 default_server;
   listen [::]:80 default_server;

. . .

Nous ajouterons deux nouvelles sections: une avant le bloc + serveur + et une à l’intérieur.

La section précédant le bloc + server est un nouveau bloc` + map`, qui définit le mappage entre les anciennes URL et la nouvelle à l’aide du module de carte. La section à l’intérieur du bloc + serveur + est la redirection elle-même.

Modifié / etc / nginx / sites-available / default

. . .
# Default server configuration
#







server {
   listen 80 default_server;
   listen [::]:80 default_server;





. . .

La directive + map $ uri $ new_uri + prend le contenu de la variable système + $ uri +, qui contient l’adresse URL de la page demandée, puis la compare à la liste des conditions entre accolades. Chaque élément de la liste de conditions comporte deux sections: la valeur à comparer et la nouvelle valeur à affecter à la variable si elle correspond.

La ligne + / old.html / index.html + à l’intérieur du bloc + map + signifie que si la valeur de + $ uri + est égale à + ​​/ old.html +, '+ $ new_uri + sera remplacé par + / index.html + `. Si cela ne correspond pas, cela ne change pas. Ici, nous définissons une seule condition, mais vous pouvez définir autant de conditions que vous le souhaitez dans une carte.

Ensuite, en utilisant une instruction + if + conditionnelle à l’intérieur du bloc + serveur +, nous vérifions si la valeur de la variable + $ new_uri + est définie. Si c’est le cas, cela signifie que la condition de la carte était remplie et que nous devrions rediriger vers le nouveau site Web à l’aide de la commande + rewrite +. Le mot clé + permanent + garantit que la redirection sera une redirection HTTP * 301 déplacée * de manière permanente, ce qui signifie que l’ancienne adresse n’est plus valide et ne reviendra pas en ligne.

Enregistrez et fermez le fichier pour quitter.

Pour activer la nouvelle configuration, redémarrez Nginx.

sudo systemctl restart nginx

Pour tester la nouvelle configuration, exécutez la même requête que précédemment:

curl -L http://localhost/old.html

Cette fois, il n’y aura pas d’erreur * 404 Not Found * dans la sortie. Au lieu de cela, vous verrez la simple page d’accueil créée à l’étape 1.

Réponse Nginx

Home

Cela signifie que la carte a été configurée correctement et que vous pouvez l’utiliser pour rediriger les URL en ajoutant plus d’entrées à la carte.

La redirection d’URL est une application utile du module de carte. Nous en explorerons un autre, qui consiste à filtrer le trafic en fonction de la situation géographique des visiteurs.

Étape 3 - Restreindre l’accès aux sites Web à certains pays

Parfois, un serveur peut recevoir une quantité excessive de requêtes automatisées et malveillantes. Il peut s’agir d’une attaque DDoS, d’une tentative de force brutale des mots de passe pour les panneaux administratifs du site Web ou d’une tentative d’exploitation de vulnérabilités connues du logiciel pour attaquer le site Web et l’utiliser pour envoyer du spam ou modifier le contenu du site.

De telles attaques automatisées peuvent provenir de nombreux serveurs distribués dans de nombreux pays, ce qui rend le blocage difficile. Une solution pour atténuer les effets d’une telle attaque consiste à créer une liste blanche des pays pouvant accéder au site Web.

Ce n’est pas une solution parfaite, mais dans les cas où restreindre l’accès au site Web en fonction de la situation géographique du visiteur est un choix judicieux et ne limite pas l’audience du site Web, cette solution présente l’avantage d’être rapide et moins sujette aux erreurs.

Le filtrage au niveau du serveur est plus rapide que celui au niveau du site Web et couvre également toutes les demandes (y compris les fichiers statiques, comme les images). Ce type de filtrage empêche également les demandes d’atteindre le logiciel du site Web, ce qui rend les vulnérabilités plus difficiles à exploiter.

Pour utiliser le filtrage géographique, commençons par créer un nouveau fichier de configuration.

sudo nano /etc/nginx/conf.d/geoip.conf

Collez le contenu suivant dans le fichier. Cela indique à Nginx où trouver la base de données GeoIP contenant les correspondances entre les adresses IP des visiteurs et leurs pays respectifs. Ubuntu 16.04 est préinstallé dans cette base de données.

/etc/nginx/conf.d/geoip.conf

. . .
# GeoIP database path
#

geoip_country /usr/share/GeoIP/GeoIP.dat;

L’étape suivante consiste à créer la configuration de carte et de restriction nécessaire. Ouvrez la configuration Nginx du bloc de serveur par défaut.

sudo nano /etc/nginx/sites-available/default

Trouvez le bloc de configuration + serveur + qui, après les modifications des étapes 1 et 2, ressemble à ceci:

/ etc / nginx / sites-available / default

. . .
# Default server configuration
#

# Old website redirect map
#
map $uri $new_uri {
   /old.html /index.html;
}

server {
   listen 80 default_server;
   listen [::]:80 default_server;

   # Old website redirect
   if ($new_uri) {
       rewrite ^ $new_uri permanent;
   }
. . .

Nous ajouterons deux nouvelles sections: une avant le bloc + serveur + et une à l’intérieur.

La section précédant le bloc + server est un nouveau bloc` + map`, qui définit l’action par défaut (accès refusé) ainsi que la liste des codes de pays autorisés à accéder au site Web. La section à l’intérieur du bloc + serveur + refuse l’accès au site Web si le résultat + map + le dit.

Modifié / etc / nginx / sites-available / default

. . .
# Default server configuration
#









# Old website redirect map
#
map $uri $new_uri {
   /old.html /index.html;
}

server {
   listen 80 default_server;
   listen [::]:80 default_server;






   # Old website redirect
   if ($new_uri) {
       rewrite ^ $new_uri permanent;
   }
. . .

Enregistrez et fermez le fichier pour quitter.

Ici, nous avons utilisé ` et ` comme espaces réservés. Remplacez ces variables par le code de pays à deux caractères du ou des pays que vous souhaitez ajouter à la liste blanche. Vous pouvez utiliser la liste complète et consultable de l’ISO pour rechercher tous les codes de pays. Par exemple, le code à deux caractères pour les États-Unis est + US.

Contrairement au premier exemple, dans ce bloc + map +, la variable + $ allowed_country + sera toujours définie sur quelque chose. Par défaut, il est réglé sur + no +; Si la variable + $ geoip_country_code + correspond à l’un des codes de pays du bloc, elle est définie sur + + + +. Si la variable + $ allowed_country + est + no +, nous renvoyons une * 444 connexion fermée sans réponse * au lieu de servir le site Web actuel.

Pour activer la nouvelle configuration, redémarrez Nginx.

sudo systemctl restart nginx

Si vous n’avez pas ajouté votre pays à la liste blanche, lorsque vous essayez de visiter + http: // +, vous verrez un message d’erreur du type * La page ne fonctionne pas * ou * La page n’a pas été envoyée. toutes les données *. Si vous ajoutez votre pays à la liste blanche, vous verrez apparaître * Accueil * comme auparavant.

Conclusion

Bien que ce soit un exemple très simple d’utilisation du module de carte, il montre le mécanisme qui peut être utilisé de nombreuses autres manières. Le module de carte permet non seulement des comparaisons simples, mais prend également en charge les expressions régulières permettant des correspondances plus complexes. C’est un excellent moyen de nettoyer les fichiers de configuration si plusieurs conditions doivent être évaluées.

Un autre cas d’utilisation très populaire pour le module de carte est les redirections conditionnelles pour les parties sécurisées du site Web dans un environnement autrement non SSL. La configuration d’une connexion SSL forcée uniquement pour les formulaires nécessitant, par exemple, la saisie d’un mot de passe est un bon exemple d’utilisation du module de carte dans un scénario réel. J’encourage donc à expérimenter avec une telle configuration.

Des informations plus détaillées sont disponibles à l’adresse dans la documentation officielle du module Carte de Nginx.