2013-08-06 2 views
0

Во избежание несанкционированного хранения данных я хотел бы ограничить количество HTTP-запросов, которые мой сервер будет принимать за определенный период времени, например, до одного раза в десять секунд. Фактически, я хотел бы сделать действие моего контроллера, чтобы ответить сообщением об ошибке, если слишком много HTTP-запросов за период. Как я могу это сделать? Должно ли быть обработано в промежуточном программном обеспечении?Как я могу ограничить количество HTTP-запросов в течение определенного периода времени?


UPDATE

Я ищу способ, чтобы сделать действие контроллера для выполнения запроса входящего HTTP. Затем в коде действия контроллера я хотел бы проверить, был ли доступ к последнему ресурсу (через HTTP-запрос) последним 10 секунд, и я хотел бы сделать это , сравнивая время, когда последний HTTP-запрос имеет был выполнен с «журнальным временем», который хранится в базе данных для этого ресурсного объекта.

«Лог-время» - это атрибут, связанный с указанным объектом ресурса (объект Ruby on Rails ActiveModel), и предназначен для хранения последнего времени, с которым этот объект обращается (через HTTP-запрос). Итак, если для этого ресурса было выполнено слишком много HTTP-запросов за период, я хотел бы сгенерировать ошибку.

ответ

2

Это может быть лучше обработано Nginx или Apache. Не каждый HTTP-запрос проходит через ваше приложение Rails. Например, запросы на статические активы часто обрабатываются напрямую Nginx/Apache. Более того, по мере того, как вы масштабируете свое приложение, вы, возможно, в конечном итоге должны иметь несколько Rails-процессов за одним и тем же сервером nginx.

Для nginx HttpLimitReqModule может быть тем, что вам нужно. Когда предел превышен, сервер ответит 503 Service Temporarily Unavailable. Для этого кода состояния может быть создан custom error page.

Для апача mod_ratelimit и mod_evasive.

(Это может быть очевидно, но дополнительное преимущество ограничений скорости обработки в nginx/apache заключается в том, что запросы за пределы не входят даже в ваши процессы Rails. Nginx/Apache немедленно отключит их, CPU.)

+0

В любом случае, я ищу способ сделать действие контроллера для запуска входящего HTTP-запроса. Затем в коде действия контроллера я хотел бы проверить, был ли последний доступ к ресурсу объекта * (HTTP-запрос) выполнен за последние 10 секунд, и я хотел бы сделать это, сравнивая время, когда последний HTTP-запрос было выполнено с «протоколом времени», которое оно хранится в базе данных для этого * ресурсного объекта *. Если это так, поднимите ошибку. – Backo

+0

@Backo Почему вы настаиваете на этом? – sawa

+0

Поскольку я хотел бы использовать атрибут «log-time», связанный с ранее упомянутым * ресурсным объектом * (объект Ruby on Rails «ActiveModel»), этот атрибут предназначен для хранения последнего времени доступа к этому объекту (через HTTP-запрос). Итак, если для этого объекта было выполнено слишком много HTTP-запросов за период, то я хотел бы сгенерировать ошибку. – Backo

Смежные вопросы