Как заставить 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')
Другие вопросы по тегам