Как затормозить плохих ботов?

12
D
На сайте с 28.06.2008
Offline
1114
2006

Изучаю логи Нгихс и родилась идея.

Все сайты перевел на https и все нормальные юзеры ходят по http2 логах это значится так

176.59.46.178 - - [11/Dec/2016:09:14:15 +0300] "GET /images/cars/3477cc05979a04cce68.jpg HTTP/2.0" 200 2556 "https://site.ru/cars/323-audi" "Mozilla/5.0 (Linux; Android 4.4.2; GT-N7100 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.83 Mobile Safari/537.36"

Все боты ломятся по HTTP/1.1

И вот тут идея

если в рефере юзерагент хорошего бота

YandexMobileBot
Googlebot
YandexDirect
YandexBot
YandexMetrika
YandexImages
Mediapartners-Google
Mail\.RU
YandexAccessibilityBot

и запрос по HTTP/1.1

то для них limit_req_zone $binary_remote_addr zone=one:10m rate=2r/s;

если кто-то другой по HTTP/1.1, то limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;

Можно ли это реализвать и верна ли логика?

[umka]
На сайте с 25.05.2008
Offline
456
#1
Dram:
Можно ли это реализвать и верна ли логика?

Этим вы также затормозите нормальных пользователей, которые ходят по HTTP/1.*

Также вы узнаете, что есть много "плохих" ботов, притворяющихся "хорошими", меняя свой юзерагент.

Dram:
Изучаю логи Нгихс и родилась идея.

А что такое "Нгихс" ?

Лог в помощь!
A9
На сайте с 04.01.2012
Offline
317
#2
'[umka:
;14822129']

А что такое "Нгихс" ?

Судя по всему Nginx.

---------- Добавлено 12.12.2016 в 03:28 ----------

ПО поводу вопроса ТС

По идее достаточно будет

http {


map $http_user_agent $limit_bots {
default '';
~*(google|bing|yandex|msnbot) $binary_remote_addr;
}

limit_req_zone $limit_bots zone=bots:10m rate=1r/m;

server {
location / {
limit_req zone=bots burst=5 nodelay;
}
}
}

Вообще вот есть еще статейка небольшая, про похожую на Вашу задачу:

http://mailman.nginx.org/pipermail/nginx-ru/2013-January/049677.html

https://hstq.net - аренда серверов от 9.99$! Нет KYC! Много стран размещения на выбор! Акция - удвоим оплаченный период! Заказывайте!
D
На сайте с 28.06.2008
Offline
1114
#3

Повторюсь - ключевое тут разграничение протоколов HTTP/1.1 и HTTP/2.0

Умеет ли Nginx их фильтровать?

AGHost
На сайте с 16.11.2011
Offline
115
#4

Комбинируйте:

if ($server_protocol ~* "HTTP/1.1") {

...

}

Хотя, на мой взгляд, слишком параноидально к этому относитесь. Всех ботов не забанить, а вот реальные посетители могут пострадать.

8 лет на рынке услуг хостинга - https://agho.st (https://agho.st)
D
На сайте с 28.06.2008
Offline
1114
#5

AGHost спасибо, уже ближе, а теперь как в одном if совместить протокол и юзер агент?

AGHost
На сайте с 16.11.2011
Offline
115
#6

Dram, use google, Luke (c) http://www.lexa.ru/nginx-ru/msg10285.html

D
На сайте с 28.06.2008
Offline
1114
#7

Что-то не понял по ссылке хаотичную беседу - не возможно совмещение?

AGHost
На сайте с 16.11.2011
Offline
115
#8

if (<condition>){

set $a "COND1";

}

if (<condition>){

set $a "$aCOND2";

}

if ($a ~ COND1COND2){

return 500;

}

D
На сайте с 28.06.2008
Offline
1114
#9

Попробую резюмировать:

http {

if ($server_protocol ~* "HTTP/1.1"){

set $a "COND1";

}

if ($http_user_agent ~ YandexMobileBot|Googlebot|YandexDirect|YandexBot|YandexMetrika|YandexImages|Mediapartners-Google|Mail\.RU|YandexAccessibilityBot){

set $a "$aCOND2";

}

if ($a ~ COND1COND2){

limit_req_zone $binary_remote_addr zone=two:10m rate=2r/s;

}

Вот сюда просится else для ботов идущих по HTTP/1.1 но не имеющих в юезере хорошего бота. Но else нгихс не понимает.
Как сюда добавить
limit_req_zone $binary_remote_addr zone=two:10m rate=10r/s; для всех остальных по HTTP/1.1?

server {

location / {

limit_req zone=two burst=3 nodelay;

}

}

}

Plazik
На сайте с 29.07.2008
Offline
168
#10
Dram:
Повторюсь - ключевое тут разграничение протоколов HTTP/1.1 и HTTP/2.0
Умеет ли Nginx их фильтровать?

https://nginx.org/ru/docs/http/ngx_http_v2_module.html#var_http2

В самом низу переменная $http2.

И не используйте if в конфигах, вместо этого используйте map.

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий