2015-11-04 2 views
2

Я использовал пример кода дроссельной заслонки для Rack :: Attack.Как сделать стойку :: Работа с атакой за балансиром нагрузки?

throttle('req/ip', limit: 100, period: 5.minutes) do |req| 
    req.ip unless req.path.starts_with?('/assets') 
end 

Это работал большим на нашем промежуточном сервере, но сразу же побежал в предел на производство, поскольку req.ip возвращает IP-адрес нашей балансировки нагрузки и не remote_ip клиента.

Обратите внимание, что remote_ip - это метод в ActionDispatch :: Request, но не Rack :: Attack :: Request.

Мы используем Rails 3.2.2 на Ruby 2.2.

ответ

3

Я был в состоянии получить работу, добавив метод Rack :: Attack :: Request

class Rack::Attack 
    class Request < ::Rack::Request 
    def remote_ip 
     @remote_ip ||= (env['action_dispatch.remote_ip'] || ip).to_s 
    end 
    end 
end 

затем с помощью

req.remote_ip unless req.path.starts_with?('/assets') 
+0

Почему не просто белый список путь/активы? – fatfrog

+0

Это решает проблему для конкретного случая/активов, но не решает более общую проблему каждого запроса, имеющего один и тот же IP-адрес клиента. –