Re: map и limit req

Ruslan Ermilov ru at nginx.com
Wed Mar 20 19:08:20 UTC 2013


On Wed, Mar 20, 2013 at 02:46:20PM -0400, sergey_s wrote:
> Здравствуйте
> Друзья, растолкуйте пожалуйста такой кусок конфига, найден тут, в рассылке
> 
> map $http_user_agent $bot_ua {
> ~bot bot;
> }
> 
> limit_req_zone $bot_ua zone=bot:10m rate=1r/s;
> limit_req zone=bot burst=120;
> 
> я понимаю как работает map, но хоть убей не понимаю как она связана тут с
> limit_req_zone  ( дока тоже мне как-то свет не проливает на это )
> что в  $http_user_agent на начальном этапе понятно, в $bot_ua - пустая
> строка
> далее, при нахождении в $http_user_agent подстроки bot, $bot_ua,
> присваивается значение  bot
> правильно ?
> а далее, меня сбивает с толку 
> 
> limit_req_zone $bot_ua... ..

Переменная $bot_ua, значение которой (bot или пустая строка) зависит
от запроса, и является ключом в зоне "bot".  Пустые значения (см. доку)
в зоне не учитываются, другими словами, ограничиваться будут только
боты.

> предположим нужная подстрока найдена, тогда переменная $bot_ua = bot
> в итоге получается:
> 
> limit_req_zone bot zone=bot:10m rate=1r/s;
> limit_req zone=bot burst=120;
> 
> правильно ?
> тогда как это вообще работает ? 
> 
> расскажите если не трудно

Смысл в том, что там по синтаксису переменная, а они в nginx зависят
от запроса.

> и вопрос связанный со всем этим
> нужно резать канал конкретным юзерагентам из определенного списка, ( либо
> через инклуд списка, либо просто перечисленыым в директиве map )

Не услышал тут вопроса.  Пример с User-Agent есть в документации к
модулю map: http://nginx.org/ru/docs/http/ngx_http_map_module.html
В зависимости от того, что нужно конкретно, значениям User-Agent из
нужного списка в map могут соответствовать либо одно и то же непустое
значение (например, "1", как выше для ботов), либо разные (если их
ограничивать нужно по отдельности).  Переменная задаёт ключ, по которому
ведётся учёт и производится ограничение.  Запросы с одинаковым значением
ключа учитываются вместе.  Я советую ещё раз вдумчиво прочитать
документацию на map и limit_{req,conn} на http://nginx.org.



Подробная информация о списке рассылки nginx-ru