Skip to main content

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

Объяснение в один абзац

В вашем приложении должно быть реализовано ограничение скорости, чтобы защитить приложение Node.js от чрезмерного количества одновременных запросов. Ограничение скорости - это задача, лучше всего выполняемая с помощью сервиса, предназначенного для этой задачи, такого как nginx, однако это также пакета rate-limiter-flexible или промежуточное программное обеспечение, такое как express-rate-limiter для приложений Express.js.

Пример кода: чистое приложение Node.js с rate-limiter-flexible

const http = require('http');
const redis = require('redis');
const { RateLimiterRedis } = require('rate-limiter-flexible');

const redisClient = redis.createClient({
enable_offline_queue: false,
});

// Maximum 20 requests per second
const rateLimiter = new RateLimiterRedis({
storeClient: redisClient,
points: 20,
duration: 1,
blockDuration: 2, // block for 2 seconds if consumed more than 20 points per second
});

http.createServer(async (req, res) => {
try {
const rateLimiterRes = await rateLimiter.consume(req.socket.remoteAddress);
// Some app logic here

res.writeHead(200);
res.end();
} catch {
res.writeHead(429);
res.end('Too Many Requests');
}
})
.listen(3000);

Вы можете найти больше примеров в документации.

Пример кода: промежуточное программное обеспечение для ограничения скорости для определенных маршрутов

Использование express-rate-limiter пакета npm

const RateLimit = require('express-rate-limit');
// important if behind a proxy to ensure client IP is passed to req.ip
app.enable('trust proxy');

const apiLimiter = new RateLimit({
windowMs: 15*60*1000, // 15 minutes
max: 100,
});

// only apply to requests that begin with /user/
app.use('/user/', apiLimiter);

Что говорят другие блоггеры

Из NGINX блога:

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