Ограничения скорости в промежуточном ПО Express? - PullRequest
0 голосов
/ 05 марта 2019

В приложении Express.js мы хотели бы ограничить количество пользователей, которые слишком часто заходят на определенный маршрут, но только если они вызывают определенное исключение.Есть ли естественный способ сделать это в Express?

Вот более или менее то, что мы имеем сейчас, без ограничения скорости.

app.get(
    "/api/method", 
    authenticationMiddleware, 
    handler
);

Промежуточное программное обеспечение ограничителя скорости обычно выглядит следующим образом.Он подсчитывает обращения и ошибки, если пользователь обращался к нему слишком много раз, прежде чем мы даже дойдем до обработчика.

app.get(
    "/api/method", 
    authenticationMiddleware, 
    rateLimiterMiddleware,   # <--- count, and tell them to go away if over limit
    handler
);

Тем не менее, мы в порядке, если они обращаются к нему столько раз, сколько хотят -мы просто хотим запретить их, если они недавно вызвали много исключений.

В Express обработчики ошибок должны находиться в конце цепочки обработчиков.

Так что, кажется, мы должны поставить «охранник» впереди и «счетчик» обработки ошибок в конце.

app.get(
    "/api/method", 
    authenticationMiddleware, 
    errorIfTooManyExceptionsByUser,   # <--- tell them to go away if over the limit
    handler, 
    countExceptionsForUser            # <--- count
);

Это кажется не элегантным, а также немногохитро, поскольку две части промежуточного программного обеспечения, ограничивающего скорость, должны много знать друг о друге.Есть ли лучший способ?

Возможно, мы могли бы стать умнее и модифицировать обработчик (и), чтобы выполнять охрану и подсчет до и после их запуска?

app.get(
   "/api/method", 
   authenticationMiddleware,
   rateLimitErrors(handler)   # <-- ???
)

Я что-то упустилили есть лучший способ сделать это?

1 Ответ

0 голосов
/ 05 марта 2019

Вы можете посмотреть, как express-redis-cache обрабатывает свое промежуточное ПО (https://github.com/rv-kip/express-redis-cache/blob/df4ed8e057a5b7d41d894e6e468f975aa62206f6/lib/ExpressRedisCache/route.js#L184).. Они оборачивают метод экспрессии send() своей собственной логикой. Может быть, с этим вы можете иметь только одно промежуточное ПО, но я думаю,это не лучшее решение.

Ограничение скорости экспресса

Существует промежуточное программное обеспечение, которое обрабатывает ограничение скорости в экспрессе https://www.npmjs.com/package/express-rate-limit.

Обработка Nginx

Экспрессэто облегченный фреймворк, в официальном документе они советуют установить Nginx перед вашим экспресс-сервером для обработки серверных вещей.

(https://expressjs.com/en/advanced/best-practice-performance.html)

Используйтеобратный прокси

Обратный прокси находится перед веб-приложением и выполняет вспомогательные операции над запросами, кроме перенаправления запросов в приложение. Он может обрабатывать страницы ошибок, сжатие, кэширование, обслуживание файлов и балансировку нагрузки.среди прочего.

Передача заданий, не требующих знания состояния приложения, обратному прокси-серверу освобождает Express для выполнения специализированных приложений.SKS.По этой причине рекомендуется запускать Express за обратным прокси-сервером, таким как Nginx или HAProxy, в рабочем состоянии.

А в nginx у вас есть система ограничения скорости: https://www.nginx.com/blog/rate-limiting-nginx/. Я не знаюЯ не знаю, можете ли вы настроить это для вашего конкретного случая использования, но я думаю, что это лучший способ справиться с ограничением скорости.

...