
Dans ce tutoriel, je vais vous expliquer comment gérer les bots et limiter leur impact sur vos sites Internet avec Nginx, notamment quand vous l’utilisez comme reverse proxy.
Aujourd’hui, il est de plus en plus de Bot aussi appelé Crawler présent sur Internet, qui passe sur les sites Internet :
- Indexation (Google, Bing)
- IA (OpenIA, Claude …)
- Collecte de données
- …
Généralement les robots d’indexation sont optimise leur passage sur votre site Internet et ne consomme par trop de ressource, par contre d’autres Bots sont très peu optimisé comme Amazon et leur Bot IA qui peuvent consommer beaucoup de ressource et voir dans certain cas consommer beaucoup de ressource et rendre votre site indisponible.
Il faut aussi prendre en compte pour certain hébergement l’utilisation de ressource comme la bande passante qui est consommé et engendrer un surcout.
Sur la plupart des rebots sont censés lire le fichier robots.txt qui se trouve à la racine de votre site où vous allez pouvoir donner des instructions pour limiter leur impact, dans les faits, on se rend compte que certain crawler ne reste pas les directives, on se retrouve donc à devoir utiliser les configurations des serveurs Web (Nginx) pour les bloquer.
Dans ce tutoriel, on va voir deux approches, la limitation des requêtes et le blocage.
Sommaire
Limiter le nombre de requêtes avec Nginx
La première limitation que l’on peut mettre en place est la limitation du nombre de requêtes par seconde ou minutes que le robot va pouvoir effectuer.
Pour cela on va utiliser les paramètres suivant :
- limit_req_zone : déclaration des bots et de la limite
- limit_req : déclaration de la zone
- limit_req_status : code de retour
Documentation officiel :
https://nginx.org/en/docs/http/ngx_http_limit_req_module.html
Dans le fichier de configuration de votre virtualhost, on va commencer par déclarer les bots avec leur agent et la limitation, qui est à mettre avant le bloc server{ ... }.
map $http_user_agent $bad_crawlers_rdritcom {
~*.*(bytespider|amazonbot|claudebot|DotBot|petalbot).* $http_user_agent;
default "";
}
limit_req_zone $bad_crawlers_rdritcom zone=badcrawlerrdritcom:10m rate=1r/m;Ici tous les robots contenant bytespider, amazonbot … seront limités à 1 requête par minute.
Maintenant dans le bloc server{ … }, on va appliquer la limitation
limit_req zone=badcrawlerrdritcom;
limit_req_status 429;On indique la zone déclarée précédemment et le code de retour.
Tester la configuration de nginx :
sudo nginx -tSi vous n’avez pas d’erreur, recharger la configuration :
sudo systemctl reload nginxAvec cette configuration, vous allez pouvoir limiter le nombre de requête et réduire l’impact des robots.
Bloquer les robots avec Nginx
Une autre approche un peu plus agressive est de bloquer simplement les requêtes avec code de retour 403.
Voici un exemple de configuration qui doit être mise dans le bloc server{ ... }.
if ($http_user_agent ~* (bytespider)) {
return 403;
}
if ($http_user_agent ~* (claudebot)) {
return 403;
}
if ($http_user_agent ~* (amazonbot)) {
return 403;
}Cette configuration va bloquer les robots bytespider, claudebot et amazonbot en leur retournant un code d’erreur 403.
Vérifier la configuration de Nginx :
sudo nginx -tRecharger la configuration :
sudo systemctl reload nginxVous savez comment bloquer les Bots depuis Nginx.
Fichier robots.txt depuis la configuration
Dernière solution, qui est possible est de générer le fichier robots.txt directement depuis la configuration du virtualhost si vous n’avez pas la possibilité de créer un fichier robots.txt sur le serveur Web. Ceci peut être le cas avec certaine application métier ou portail propriétaire.
Voici le code à mettre dans la bloc server{ ... } du virtualhost.
location /robots.txt {
add_header Content-Type text/plain;
return 200 "User-agent: AhrefsBot\nCrawl-delay: 10\nUser-agent: Amazonbot\nCrawl-delay: 10";
}Dans cette directive, on déclare des informations pour les robots AhrefsBot et Amazonbot
Vérifier la configuration de Nginx :
sudo nginx -tRecharger la configuration :
sudo systemctl reload nginxBloquer les User Agent depuis la liste de mitchellkrogza
Pour continuer dans la protection contre les robots (Bot), on va utiliser la liste mise à disposition par mitchellkrogza qui est l’auteur de nginx-ultimate-bas-bot-blocker.
Pour ce faire, on va utiliser cette liste : raw.githubusercontent.com/mitchellkrogza/nginx-ultimate-bad-bot-blocker/master/_generator_lists/bad-user-agents.list
Pour cela j’ai fait un script qui permet de télécharger la liste et créer un fichier de configuration pour Nginx.
Voici le script :
Copier le script sur le serveur Nginx et exécuter le, cela va créer un fichier de configuration que va être charger par Nginx.
Ensuite, dans les virtualhosts où vous souhaitez bloquer les Bots ajouter ceci dans le block server{ ... }.
if ($bad_ua) {
return 444;
}Tester la configuration de Nginx :
sudo nginx -tRecharger pour la prise en compte :
sudo systemctl reload nginxSi vous souhaitez pouvoir analyser facilement les blocages des bots, il est possible d’avoir un fichier de log séparé.
Dans le fichier nginx.conf dans la section http{ ... } ajouter :
log_format bad_ua '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_user_agent" "$host"';Pour finir, dans le fichier du virtualhost, ajouter :
access_log /var/log/nginx/bad_ua.log bad_ua if=$bad_ua;Vous savez comment gérer les robots (Bots) directement depuis la configuration de Nginx et limiter leur impact sur votre serveurs Web.
