2

在我的 ruby​​ on rails 应用程序中,我面临着某些性能问题。在某些形式中,一次有超过 2500 个请求来自同一个 IP 地址。所以我使用https://github.com/kickstarter/rack-attack添加速率限制器并跟踪来自 ip 地址的所有请求并通过将其存储在动态表中来跟踪它们。但是对于一定的时间间隔,如何在 5 秒内跟踪它们(即)有多少请求来自同一个 IP 地址。

4

2 回答 2

0

但是对于一定的时间间隔,如何在 5 秒内跟踪它们(即)有多少请求来自同一个 IP 地址。

要在每个 IP 的基础上将数量限制为每 5 秒 10 个请求,您可以使用:

# config/initializers/rack_attack.rb

Rack::Attack.throttle('ip limit', limit: 10, period: 5) do |request|
  request.ip
end

如果单个 IP 在 5 秒内发出超过 10 个请求,则会收到“429 Too Many Requests”响应。

请注意,机架攻击使用“固定窗口”方法,在给定的持续时间内允许最多两倍的请求。例如,使用上述设置,您可以在一个窗口结束时发出 10 个请求,在下一个窗口开始时发出另一个 10 个请求,所有这些都在 5 秒内(甚至更短)。

于 2020-05-13T10:14:12.490 回答
0

Rack::Attack.track只有在发出一定数量的请求时,您才可以使用并配置它来记录 IP 地址。

# Supports optional limit and period, triggers the notification only when the 10 requests are made under 5 seconds from same Ip(configurable).

Rack::Attack.track("Log request", limit: 10, period: 5.seconds) do |req|
  req.ip
end

# Track it using ActiveSupport::Notification
ActiveSupport::Notifications.subscribe("track.rack_attack") do |name, start, finish, request_id, payload|
  req = payload[:request]
  Rails.logger.info "special_agent: #{req.path}"
end
于 2021-09-26T13:32:23.593 回答