<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">Привет!<div class=""><br class=""></div><div class="">Если так письмо на русском не примете, я его, конечно, переведу на английский, но хотелось бы чуть-чуть времени сэкономить :)</div><div class=""><br class=""></div><div class="">Итак, имеем сервер, на котором</div><div class=""><br class=""></div><div class=""><div style="margin: 0px; font-size: 11px; font-family: Menlo;" class=""><span class="Apple-tab-span" style="white-space:pre"> </span>limit_req_zone $whitelisted_remote_addr zone=IPRATELIMIT_EXT_GET:20m rate=30r/s;</div></div><div style="margin: 0px; font-size: 11px; font-family: Menlo;" class=""><br class=""></div><div style="margin: 0px; font-size: 11px; font-family: Menlo;" class="">Всё как положено, есть белый список IP-адресов, остальные считаем плохими.</div><div style="margin: 0px; font-size: 11px; font-family: Menlo;" class="">Там где идёт проброс запроса до fastcgi-сервера, есть </div><div style="margin: 0px; font-size: 11px; font-family: Menlo;" class=""><br class=""></div><div style="margin: 0px; font-size: 11px; font-family: Menlo;" class=""><div style="margin: 0px;" class=""><span class="Apple-tab-span" style="white-space:pre"> </span>limit_req zone=IPRATELIMIT_EXT_GET burst=15; </div><div style="margin: 0px;" class=""><br class=""></div><div style="margin: 0px;" class="">Стандартный сценарий обращения нового посетителя к сайту:</div><div style="margin: 0px;" class=""><br class=""></div><div style="margin: 0px;" class="">1) GET /?fr=откуда_пришёл&foo=bar</div><div style="margin: 0px;" class=""><br class=""></div><div style="margin: 0px;" class="">Ему в ответ выставляют cookie fr с этим значением и отдают redirect на /?foo=bar</div><div style="margin: 0px;" class="">Редирект работает очень быстро и почти не грузит сервер.</div><div style="margin: 0px;" class=""><br class=""></div><div style="margin: 0px;" class="">2) GET /foo=bar</div><div style="margin: 0px;" class=""><br class=""></div><div style="margin: 0px;" class="">в этот момент браузер получает замедление из-за limit_req, слишком быстро спрашивает. Эти замедления никому не нужны, ни от чего не защищают.</div><div style="margin: 0px;" class=""><br class=""></div><div style="margin: 0px;" class="">Можно поставить nodelay, но тогда слишком активные боты не будут получать задержек и ситуация будет доходить до выдачи им ошибки 503.</div><div style="margin: 0px;" class=""><br class=""></div><div style="margin: 0px;" class="">Таким образом, мне нужно, чтобы при незначительном превышении частоты обращений nodelay не было, а при многократном превышении он, наоборот, был и помогал не доводить поисковых ботов до 503 ошибки.</div><div style="margin: 0px;" class=""><br class=""></div><div style="margin: 0px;" class="">Я сделал патч, который немного расширяет смысл параметра nodelay. Если нет nodelay или в конфиге просто указан nodelay без параметра, то всё работает по старому. Если же указать nodelay=N, то при excess меньшем, чем 1000*N, задержек нет, а как только excess перевалит это значение, задержки включаются. В моём случае достаточно использовать:</div><div style="margin: 0px;" class=""><br class=""></div><div style="margin: 0px;" class=""><div style="margin: 0px;" class=""><span class="Apple-tab-span" style="white-space: pre;"> </span>limit_req zone=IPRATELIMIT_EXT_GET burst=15 nodelay=1;</div><div style="margin: 0px;" class=""><br class=""></div><div style="margin: 0px;" class="">У меня не заржавеет каждый раз накладывать этот патч внутри, модуль меняется редко, но кажется, что такое может быть полезно не только мне.</div><div style="margin: 0px;" class=""><br class=""></div><div style="margin: 0px;" class="">С уважением,</div><div style="margin: 0px;" class=""><span class="Apple-tab-span" style="white-space:pre"> </span>Владислав Шабанов, <a href="http://GrinDin.ru" class="">GrinDin.ru</a></div><div style="margin: 0px;" class=""><br class=""></div><div style="margin: 0px;" class=""><br class=""></div><div style="margin: 0px;" class=""><br class=""></div><div style="margin: 0px;" class=""><br class=""></div><div style="margin: 0px;" class=""></div></div></div></body></html>