<div dir="ltr">Thank you Oleksandr!! <br><div class="gmail_extra"><br><div class="gmail_quote">On Sat, Nov 22, 2014 at 7:33 AM, Oleksandr V. Typlyns'kyi <span dir="ltr"><<a href="mailto:wangsamp@gmail.com" target="_blank">wangsamp@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><span class="">Yesterday Nov 21, 2014 at 20:07 neubyr wrote:<br>
<br>
> I am trying to figure out if there is any way to rate limit all traffic<br>
> except Googlebot, msnbot, yandex and baidu bots. Here is what I have<br>
> started with:<br>
><br>
>   # Whitelisted IPs<br>
>   geo $rate_limit_ip {<br>
>       default $binary_remote_addr;<br>
>       127.0.0.1 "";<br>
>       <a href="http://10.0.0.0/8" target="_blank">10.0.0.0/8</a> "";<br>
>   }<br>
><br>
>   # Rate limit<br>
>   limit_req_zone $rate_limit_ip zone=publix:10m rate=10r/s;<br>
<br>
</span> It will not work as you expect.<br>
 Geo does not support variables in values.<br>
 You need something like this:<br>
 geo $whitelist {<br>
     default 0;<br>
     127.0.0.1 1;<br>
     ...<br>
 }<br>
 map $whitelist $rate_limit_ip {<br>
     default $binary_remote_addr;<br>
     1       "";<br>
<span class=""> }<br>
<br></span></blockquote><div><br></div><div>I am not sure how, but it's working only with geo defining IP addresses. I can see HTTP 503 on client side and also 'limiting requests, excess: 10.033 by zone' in error logs. Nginx version: nginx/1.6.0</div>















<div><br></div><div><div>    geo $rate_limit_ip {</div><div>        default $binary_remote_addr;</div><div>        127.0.0.1 1;</div><div>        <a href="http://10.0.0.0/8">10.0.0.0/8</a> 1;</div></div><div>    }</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><span class="">
> I can add googlebot, msnbot, yandex and baidu IP ranges manually to the<br>
> whitelist, but that will make lookup table big. I am not sure whether<br>
> this approach will work for high traffic like - 1200 requests/second<br>
> distributed across 20 nginx hosts. Any ideas on such setup will be<br>
> really helpful.<br>
<br>
</span>  Nginx parses and loads this data into radix tree in memory on startup.<br>
<span class=""><br>
> Also, can such host lookups be done in real-time for every request? I am<br>
> guessing that may not be efficient for each request, but I was wondering if<br>
> there are any solutions.<br>
<br>
</span>  All variables are evaluated when they are used in request.<br>
<span class=""><font color="#888888"><br></font></span></blockquote><div><br></div><div>I was wondering if remote ip's hostname lookup can be done before rate-limiting it. For example, I don't want to block IPs coming from <a href="http://baidu.com">baidu.com</a>. Can I do such IP-hostname lookup before rate-limiting? Will it efficient or what are other options?</div><div><br></div><div>Thanks again for detailed reply. </div><div><br></div><div>- N </div></div></div></div>