Nie marnuj zasobów serwera: blokuj niechciane boty za pomocą Nginx

Boty wyszukiwarek (crawlers) to specjalne programy, które skanują strony internetowe w Internecie. Wyszukiwarki potrzebują ich, aby znajdować, indeksować i wyświetlać strony w wynikach wyszukiwania. Ale nie wszystkie boty są przydatne!
Czasami Twoją witrynę mogą odwiedzać niechciane boty, które:
- Zbierają dane bez Twojej zgody.
- Zużywają zasoby serwera, spowalniając go.
- Służą do wyszukiwania luk w zabezpieczeniach.
Jeśli chcesz chronić swoją witrynę przed takimi botami, czas skonfigurować Nginx! W tym artykule pokażemy, jak łatwo i szybko je zablokować, używając specjalnego pliku konfiguracyjnego.
Dlaczego konfiguracja Nginx zamiast pliku robots.txt?
Plik robots.txt to narzędzie do zarządzania zachowaniem botów wyszukiwarek. Informuje je, które części witryny nie powinny być indeksowane. Bardzo łatwo jest użyć tego pliku: wystarczy utworzyć go w głównym katalogu witryny, na przykład:
User-agent: BadBot
Disallow: /
Istnieje jednak problem: instrukcje w pliku robots.txt są raczej zaleceniem niż obowiązującą zasadą. Sumienne boty przestrzegają instrukcji z tego pliku, ale większość botów po prostu je ignoruje.
Konfiguracja Nginx pozwala natomiast fizycznie zablokować dostęp niechcianym botom, gwarantując 100% skuteczności.
Jak Nginx blokuje niechciane boty: używanie odpowiedzi 444
W przeciwieństwie do robots.txt, który jedynie udziela botom zaleceń, Nginx fizycznie blokuje ich dostęp. Jednym ze sposobów osiągnięcia tego celu jest użycie specjalnej odpowiedzi serwera z kodem 444.
W Nginx kod odpowiedzi 444 jest wewnętrzną metodą zakończenia połączenia z klientem bez wysyłania żadnej odpowiedzi. Jest to wydajne podejście do ignorowania niechcianych żądań i minimalizowania obciążenia serwera.
Konfigurowanie blokowania
Krok 1: Jak zidentyfikować niechciane boty?
Niechciane boty można zidentyfikować po ich User-Agent, który jest parametrem wysyłanym przez wszystkich klientów podczas odwiedzania Twojej witryny. Na przykład niektóre User-Agent mogą wyglądać tak:
AhrefsBot
SemrushBot
MJ12bot
Podejrzane wartości User-Agent można znaleźć w logach dostępu Nginx (jeśli Twoja witryna używa PHP-FPM):
sudo grep -i bot /var/log/nginx/access.log
Lub w logach dostępu Apache (jeśli Twoja witryna używa modułu Apache lub FastCGI jako procedury obsługi PHP):
- Dla Ubuntu/Debian:
sudo grep -i bot /var/log/apache2/access.log
- Dla CentOS/AlmaLinux/RockyLinux:
sudo grep -i bot /var/log/httpd/access.log
Jeśli używasz panelu sterowania, takiego jak FASTPANEL, każda witryna będzie miała swój własny, oddzielny plik logów. Możesz analizować je pojedynczo lub wszystkie naraz, używając polecenia takiego jak:
- Jeśli Twoja witryna używa modułu Apache lub FastCGI jako procedury obsługi PHP:
sudo cat /var/www/*/data/logs/*-backend.access.log | grep -i bot | tail -500
- Jeśli Twoja witryna używa PHP-FPM:
sudo cat /var/www/*/data/logs/*-frontend.access.log | grep -i bot | tail -500
To polecenie wyświetli ostatnie 500 żądań wysłanych do wszystkich Twoich witryn, gdzie parametr User-Agent zawiera słowo „bot”. Przykład jednej linii (jednego żądania do Twojej witryny) może wyglądać tak:
IP - [03/Nov/2022:10:25:52 +0300] "GET link HTTP/1.0" 301 811 "-" "Mozilla/5.0 (compatible; DotBot/1.2; +https://opensiteexplorer.org/dotbot; [email protected])"
lub
IP - [24/Oct/2022:17:32:37 +0300] "GET link HTTP/1.0" 404 469 "-" "Mozilla/5.0 (compatible; BLEXBot/1.0; +http://webmeup-crawler.com/)"
User-Agent bota znajduje się między segmentami “compatible;” a “/version.number“ na końcu linii żądania w nawiasach. Zatem w powyższych przykładach User-agents to: BLEXBot i DotBot.
Przeanalizuj zebrane informacje i zanotuj ciągi User-Agent najaktywniejszych botów na potrzeby następnego kroku konfiguracji blokowania.
Krok 2: Utwórz plik do blokowania botów
- Połącz się ze swoim serwerem przez SSH.
- Przed wprowadzeniem zmian upewnij się, że Twoja bieżąca konfiguracja Nginx nie zawiera błędów:
nginx -t
Jeśli wszystko jest w porządku, zobaczysz:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
Jeśli wystąpiły błędy, przejrzyj je i popraw w pliku wskazanym przez komunikaty o błędach.
- Utwórz osobny plik z listą botów do zablokowania:
sudo nano /etc/nginx/conf.d/block_bots.conf
Dodaj następujący kod do pliku:
map $http_user_agent $block_bot {
default 0;
~*AhrefsBot 1;
~*SemrushBot 1;
~*MJ12bot 1;
}
server {
if ($block_bot) {
return 444;
}
}
Tutaj tworzymy mapę, która określa, które boty powinny zostać zablokowane.
Postępując zgodnie z tym wzorem, wymień ciągi User-Agent botów, które chcesz zablokować. Każdego bota należy umieścić w nowej linii i zakończyć średnikiem ; jako separatorem.
Po zakończeniu tworzenia listy naciśnij klawisze „Ctrl + O”, aby zapisać plik, a następnie „Ctrl + X”, aby wyjść z edytora nano.
Krok 3: Zastosuj zmiany
Po dokonaniu zmian zawsze przetestuj poprawność konfiguracji Nginx, aby upewnić się, że nie ma błędów składniowych:
sudo nginx -t
Jeśli wszystko jest w porządku, zobaczysz:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
Jeśli wystąpiły błędy, przejrzyj wyniki, aby zidentyfikować je i poprawić w określonym pliku.
Następnie przeładuj konfigurację Nginx, aby zastosować zmiany:
sudo systemctl reload nginx
W przyszłości, jeśli chcesz dodać więcej botów do pliku block_bots.conf, musisz powtórzyć ten krok za każdym razem.
Wnioski
Teraz wiesz, jak łatwo blokować niechciane boty wyszukiwarek na swoim serwerze za pomocą Nginx! Obserwuj swoje logi i w razie potrzeby dodawaj nowe linie do pliku konfiguracyjnego block_bots.conf.
Upewnij się, że blokujesz tylko złośliwe boty, aby nie utrudniać indeksowania witryny przez pożyteczne wyszukiwarki, takie jak Google czy Bing.