Как заставить Rack::Attack работать за балансировщиком нагрузки?
Я использовал пример кода газа для 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.
1 ответ
Я смог заставить его работать, добавив метод в 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')