Comment utiliser le module de carte de Nginx sur CentOS 7

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 de Nginx vous permet de créer des variables dans le fichier de configuration de 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:

[[step-1 -—- creation-and-testing-an-example-webpage]] == É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" > /usr/share/nginx/html/index.html'

Une fois ce fichier test en place, nous allons ensuite vérifier qu'il est correctement diffusé aveccurl. Nous n'avons pas besoin de spécifierindex.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 disantHome comme ci-dessous:

Réponse Nginx

Home

Essayons maintenant d'accéder à un fichier qui n'existe pas dans/usr/share/nginx/html, commeold.html.

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

La réponse sera un message d'erreur système,404 Not Found, ce qui signifie que la page n'existe pas.

Réponse Nginx




    
        The page is not found
. . .

Nous utilisons simplement un site Web factice dans ce didacticiel, mais siold.html était une page sur un site Web réel qui existait auparavant et a été supprimée, renvoyer 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.

[[step-2 -—- configuration-les-redirections]] == Étape 2 - Configuration des redirections

Pour les petits sites Web avec seulement quelques pages, de simples instructions conditionnellesif peuvent être utilisées pour les redirections et autres choses 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 de carte est un module Nginx principal, 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 du bloc serveur par défaut Nginx dansvi (voici unshort introduction to vi) ou votre éditeur de texte préféré.

sudo vi /etc/nginx/nginx.conf

Trouvez le bloc de configurationserver, qui ressemble à ceci:

/etc/nginx/nginx.conf

. . .

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

. . .

Nous allons ajouter deux nouvelles sections: une avant le blocserver et une à l'intérieur.

La section avant le blocserver est un nouveau blocmap, qui définit le mappage entre les anciennes URL et la nouvelle à l'aide du module de carte. La section à l'intérieur du blocserver est la redirection elle-même.

Modifié /etc/nginx/nginx.conf

. . .

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

server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name  _;
    root         /usr/share/nginx/html;

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

La directivemap $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 blocmap signifie que si la valeur de$uri est/old.html,$new_uri sera changé en/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 conditionnelleif dans le blocserver, nous vérifions si la valeur de la variable$new_uri est définie. Si tel est le cas, cela signifie que la condition de la carte a été satisfaite et que nous devrions rediriger vers le nouveau site Web en utilisant la commanderewrite. Le mot-clépermanent garantissait que la redirection sera une redirection HTTP301 Moved Permanently, 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'erreur404 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.

[[step-3 -—- restricting-website-access-to-some-countries]] == Étape 3 - Restreindre l'accès au site 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 vi /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 vi /etc/nginx/nginx.conf

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

/etc/nginx/sites-available/default

. . .

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

server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name  _;
    root         /usr/share/nginx/html;

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

Nous allons ajouter deux nouvelles sections: une avant le blocserver et une à l'intérieur.

La section avant le blocserver est un nouveau blocmap, qui définit l'action par défaut (accès interdit) ainsi que la liste des codes de pays autorisés à accéder au site Web. La section à l'intérieur du blocserver refuse l'accès au site Web si le résultat demap l'indique.

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

. . .

# Allowed countries
#
map $geoip_country_code $allowed_country {
    default no;
    country_code_1 yes;
    country_code_2 yes;
}

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

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

    # Disallow access based on GeoIP
    if ($allowed_country = no) {
        return 444;
    }

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

Enregistrez et fermez le fichier pour quitter.

Ici, nous avons utilisécountry_code_1 etcountry_code_2 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 utiliserthe ISO’s full, searchable list of all country codes pour trouver. Par exemple, le code à deux caractères pour les États-Unis estUS.

Contrairement au premier exemple, dans ce blocmap, la variable$allowed_country sera toujours définie sur quelque chose. Par défaut, il est défini surno; si la variable$geoip_country_code correspond à l'un des codes de pays du bloc, elle est définie suryes. Si la variable$allowed_country estno, nous renvoyons un444 Connection Closed Without Response au lieu de servir le site Web réel.

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 visiterhttp://your_server_ip, vous verrez un message d'erreur commeThe page isn’t working ouThe page didn’t send any data. Si vous ajoutez votre pays à la liste blanche, vous verrezHome comme avant.

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 peuvent être trouvéesin Nginx’s official map module documentation.

Related