Попытка заставить работать в nginx следующее поведение
Предел скорости по умолчанию 1r / s для каждого IP-адреса при использовании браузера. Ограничение скорости 10r / s для пауков bing и google. Отклоняйте плохих ботов.
К сожалению, Google не публикует IP-адреса для робота Googlebot, поэтому я ограничен пользователем.
Пока это близко:
http {
# Rate limits
map $http_user_agent $uatype {
default 'user';
~*(google|bing|msnbot) 'okbot';
~*(slurp|nastybot) 'badbot';
}
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
limit_req_zone $binary_remote_addr zone=two:10m rate=10r/s;
...
server {
...
location / {
if ($uatype == 'badbot) {
return 403;
}
limit_req zone=one burst=5 nodelay;
if ($uatype != 'user') {
limit_req zone=two burst=10 nodelay;
}
...
}
...
}
}
НО - «если» это не разрешено.
$ nginx -t
nginx: [Emerg] директива limit_req не разрешена здесь, в /etc/nginx/nginx.conf nginx: файл конфигурации /etc/nginx/nginx.conf тест не пройден
На форумах nginx так много непроверенных предложений, что большинство из них даже не проходят configtest.
Один, который выглядит многообещающим, - это Ограничение скорости Nginx по рефереру? - Обратной стороной этой версии является то, что вся конфигурация повторяется для каждого лимита (у меня много правил перезаписи).
У кого-нибудь есть что-нибудь хорошее?
Сегодня я смог реализовать ограничение скорости для пользовательских агентов; попробуй это:
map $http_user_agent $bad_bot {
default 0;
(foo|bar) 1;
}
map $http_user_agent $nice_bot {
default "";
(baz|qux) 1;
}
limit_req_zone $nice_bot zone=one:10m rate=1r/s;
limit_req_status 429;
server {
...
location / {
limit_req zone=one nodelay;
if ($badbot) {
return 403;
}
...
}
}
К сожалению, вы не можете динамизировать таким образом, модуль запроса лимита не поддерживает это.
Найденная вами ссылка, вероятно, единственный способ добиться этого. Использовать include
директива, чтобы «избежать» повторения вашей конфигурации.
Но что, если сторонний краулер внезапно выдаст себя за добрый бот пользовательский агент?