limit_req zone + if в nginx

1 234 5
D
На сайте с 28.06.2008
Offline
1108
#21

Кстати код что я писал выше нерабочий.

у меня есть еще одна директива

limit_req_zone $binary_remote_addr zone=one:10m rate=2r/s;
limit_req zone=one burst=3 nodelay;

Вот она и отшибала иногда ботов

а вот этот код

map $server_protocol $limit {
"HTTP/1.0" $binary_remote_addr;
default "";
}
limit_req_zone $limit zone=bot:10m rate=1r/m;

Позволяет делать запросы чаще 1 раза в минуту с 1 айпи

D
На сайте с 28.06.2008
Offline
1108
#22

попробовал так

map $server_protocol $limit {
default 0;
"HTTP/1.0" 1;
}
limit_req_zone $limit zone=bot:10m rate=1r/m;

и получил сам 503 ошибку

в логах с моего айпи первый запрос

7*.1*2.7*.2** - - [25/Dec/2016:22:19:19 +0300] "GET / HTTP/1.1" 301

второй

7*.1*2.7*.2** - - [25/Dec/2016:22:19:19 +0300] "GET / HTTP/2.0" 503

Нифига не понимаю короч

D
На сайте с 28.06.2008
Offline
1108
#23

Вот так не работает:

map $server_protocol $limit {
default 0;
"HTTP/1.0" $binary_remote_addr;
"HTTP/1.1" "";
"HTTP/2.0" "";
}
limit_req_zone $limit zone=bot:10m rate=1r/m;

ВОт так получаю сам 503

map $server_protocol $limit {
default 0;
"HTTP/1.0" $binary_remote_addr;
"HTTP/1.1" "2";
"HTTP/2.0" "3";
}
limit_req_zone $limit zone=bot:10m rate=1r/m;
D
На сайте с 28.06.2008
Offline
1108
#24

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

На данный момент так:

map $http_user_agent $limit_bots {
default '';
~*(Googlebot|YandexBot) $binary_remote_addr;
}
limit_req_zone $limit_bots zone=goodbots:10m rate=5r/s;

map $server_protocol $limit {
"HTTP/1.0" $binary_remote_addr;
default "";
}
limit_req_zone $limit zone=bot:10m rate=1r/m;

теперь встал другой вопрос, как добавить еще один limit_req_zone так сказать для "всех остальных", кто не попал в первые 2 условия?

Если просто добавить ниже limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;

то верхние правила перестанут работать, почем у так не понимаю.

в конфиге хоста пока так

limit_req zone=goodbots burst=5 nodelay;
# limit_req zone=one burst=5 nodelay;
limit_req zone=bot;
Andreyka
На сайте с 19.02.2005
Offline
822
#25
Не стоит плодить сущности без необходимости
D
На сайте с 28.06.2008
Offline
1108
#26

Едрить мадрить - limit_req zone=one burst=5 nodelay; нужно в http поднять?

Но этож тогда лимиты пойдут и на статику тоже. Других вариантов нет?

---------- Добавлено 26.12.2016 в 17:09 ----------

Все равно не понимаю, как лимит

limit_req zone=one

в секции сервер

может воздействовать на

limit_req_zone $limit_bots zone=goodbots
limit_req_zone $limit zone=bot

в секции http

зоны то разные!!!

---------- Добавлено 26.12.2016 в 17:20 ----------

Цитирую по ссылке выше

Если вам нужно одновременно несколько
limit_req (поддерживается начиная с версии nginx 1.1.14),
их следует указывать на одном уровне.

Так у меня так и указано - три в http

limit_req_zone $limit_bots zone=goodbots
limit_req_zone $limit zone=bot
limit_req_zone $binary_remote_addr zone=one

и три в сервер


limit_req zone=goodbots burst=5 nodelay;
limit_req zone=one burst=5 nodelay;
limit_req zone=bot;
D
На сайте с 28.06.2008
Offline
1108
#27

В общем остановился пока на этом

в секцию http

geo $whitelist {
default 0;
# боты google
64.68.80.0/21 1;
64.233.160.0/19 1;
66.102.0.0/20 1;
72.14.192.0/18 1;
209.85.128.0/17 1;
216.239.32.0/19 1;
66.249.0.0/16 1;
# боты yandex
77.88.0.0/18 1;
87.250.224.0/19 1;
93.158.0.0/16 1;
95.108.128.0/17 1;
213.180.192.0/19 1;
141.8.0.0/16 1;
130.193.0.0/16 1;
5.255.253.0/24 1;
178.154.149.0/24 1;

}
map $whitelist $limit {
0 $binary_remote_addr;
1 "";
}
limit_req_zone $limit zone=vse:10m rate=1r/s;

map $server_protocol $limit2 {
"HTTP/1.0" $binary_remote_addr;
default "";
}
limit_req_zone $limit2 zone=bot:10m rate=1r/m;

в секцию сервер нужного хоста

limit_req zone=vse burst=3 nodelay;
limit_req zone=bot;

Код работает, проверил. Он:

1. Не лимитирует основных поисковых ботов (можно дбавлять по желанию)

2. Всем остальным дает делать не более 1 запроса в секунду (с кратковременными всплесками до 3 запросов).

3. Тормозит разных зверей шляющихся по HTTP/1.0 до 1 запроса в минуту

Так же в сервер добавил наиболее бешеных ботов, шляющихся именно по моим сайтам

if ($http_user_agent ~ "ia_archiver|wget|Curl|libwww|BLEXBot|SBooksNet|MJ12bot|Java|NTENTbot|GetIntent|SemrushBot|HybridBot|AhrefsBot|SeznamBot|DeuSu|GrapeshotCrawler|SentiBot") {
return 444;
}
VM
На сайте с 31.03.2009
Offline
81
#28

Кстати про ботов. гугл и яндекс у меня шляются по http 1.1

Но карту сайтов и robots.txt забирают по http 1.0

Может не правильно что настроено, но пожалуй эксперимент повторять не буду.

Качественные и недорогие (от 169р за 1 Gb Ram) KVM VPS ssd (http://ruweb.net/?from=23123) в России которые... работают.
D
На сайте с 28.06.2008
Offline
1108
#29

Я просматриваю логи каждый час - из ботов по http 1.0 ходит только бот майл ру и то 1 его вид, который долбит robots.txt, но он заходит не часто, поэтому не тормозится. Ближайшие пару дней все 503 ошибки буду просматривать и анализировать вручную, мож че подкручу.

J
На сайте с 24.01.2017
Offline
0
#30

сделал как у вас, но почему то адреса которые я прописал таки попадают под лимит

1 234 5

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