Ограничивайте одновременные запросы с использованием балансировщика или промежуточного программного обеспечения
В вашем приложении должно быть реализовано ограничение скорости, чтобы защитить приложение 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-адреса. В более общем смысле он используется для защиты вышестоящих серверов приложений от чрезмерного количества одновременных запросов пользователей.