Поиск по сайту:

Как оценить лимит экспресс-приложений


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

Ограничение скорости — это стратегия, которую можно использовать для управления трафиком в сети. Он ограничивает количество запросов, которые пользователь может сделать в течение определенного периода времени.

Существуют различные алгоритмы ограничения скорости, каждый из которых имеет свои недостатки. Один простой и популярный метод — отслеживать IP-адреса запросов и проверять, сколько времени проходит между запросами. Затем система может отклонить запрос, если ее IP-адрес превышает количество запросов, разрешенное лимитом.

Этот подход к ограничению скорости легко реализовать в приложении NodeJS-Express, выполнив всего несколько шагов.

Шаг 1. Настройка среды разработки

Сначала вам нужно создать и инициализировать приложение Express.

Начните с создания каталога проекта, выполнив:

mkdir express-app

Затем войдите в этот каталог, выполнив:

cd express-app

Затем инициализируйте npm, менеджер пакетов узла, и создайте файл package.json в своем приложении, выполнив:

npm init -y

Флаг -y создаст файл package.json со всеми настройками по умолчанию.

Далее вам нужно будет установить некоторые зависимости. Для этого урока необходимы следующие зависимости:

  • ExpressJS: ExpressJS — это платформа NodeJS, предоставляющая надежный набор функций для веб-приложений и мобильных приложений. Это упрощает процесс создания серверных приложений с помощью NodeJS.
  • Экспресс-ограничение скорости: Экспресс-ограничение скорости — это промежуточное программное обеспечение, ограничивающее скорость для ExpressJS. Он ограничивает повторные запросы к общедоступным API и/или конечным точкам, такие как сброс пароля, вход пользователей и т. д.

Установите необходимые зависимости, выполнив:

npm install express express-rate-limit

Шаг 2. Создание экспресс-приложения

Вам нужно будет создать базовый сервер Express, который прослушивает запросы, поступающие к вашему приложению.

Сначала создайте файл index.js в корневом каталоге вашего проекта. Это будет входной файл для вашего приложения.

Затем добавьте следующий код в файл index.js:

// index.js
const express = require("express");
const app = express();
const port = process.env.PORT || 3000
 
app.listen(port, () => {
  console.log(`App running on port ${port}`);
});

Этот код импортирует express и создает приложение Express, вызывая функцию express() и сохраняя возвращаемое значение в переменной app. Затем он прослушивает трафик на порту 3000, вызывая метод listen объекта app.

Шаг 3. Создание обработчиков маршрутов

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

Сначала создайте папку маршруты в корневом каталоге вашего проекта, выполнив:

mkdir routes

Создайте файл routes.js внутри папки маршрутов и добавьте следующий код:

const express = require("express");
const router = express.Router();
 
router.get("/", (req, res) => {
  res.send({ message: "Hello, this is a GET request" });
});
 
router.post("/add-demo", (req, res) => {
  res.status(201).send({ message: "Resource created successfully" });
});
 
router.put("/update-demo", (req, res) => {
  res.status(201).send({ message: "Resource updated sucessfully" });
});
 
module.exports = router;

Этот код импортирует express, вызывает метод Router в express и сохраняет значение в переменной router. Метод Router позволяет создавать модульные монтируемые обработчики маршрутов. Вы можете создать обработчики маршрутов для запроса GET к «/», запроса POST к «/add-demo. >» и запрос PUT к «/update-demo». Наконец, экспортируйте переменную router.

Затем импортируйте переменную router в файл index.js:

// index.js
const routes = require("./routes/routes");

Затем используйте его в качестве промежуточного программного обеспечения в файле index.js:

// index.js
app.use(routes);

Обязательно поместите приведенный выше блок кода перед вызовом app.listen.

Шаг 4. Реализация ограничения скорости

Сначала создайте папку «middleware» в корневом каталоге вашего проекта, выполнив:

mkdir middleware

Затем создайте файл с именем «rate-limiter.js» внутри каталога промежуточного программного обеспечения. Добавьте в этот файл следующий код:

// rate-limiter.js
const rateLimiter = require("express-rate-limit");
 
const limiter = rateLimiter({
    max: 5,
    windowMS: 10000, // 10 seconds
    message: "You can't make any more requests at the moment. Try again later",
});
 
module.exports = limiter

Функция rateLimiter принимает объект конфигурации с условиями ограничения количества запросов.

Свойства в объекте конфигурации выше:

  • max: это свойство всегда должно быть числом или функцией, возвращающей число. Он представляет собой максимальное количество запросов, которые пользователь может сделать в течение определенного периода времени. Если это свойство не задано в объекте конфигурации, по умолчанию оно равно 5.
  • windowsMS: это свойство всегда должно быть числом. Он представляет собой временной интервал, в течение которого разрешено несколько запросов в миллисекундах. Если это свойство не задано в объекте конфигурации, оно по умолчанию равно 60 000 миллисекунд (одна минута).
  • message: это свойство может быть строкой, объектом JSON или любым другим значением, поддерживаемым методом response.send Express. Если это свойство не установлено в объекте конфигурации, по умолчанию оно имеет значение «Слишком много запросов. Пожалуйста, повторите попытку позже."

Затем функция проверит наличие повторных запросов к вашему приложению. Если пользователь превысит лимит (max, 5) в течение периода времени (windowMS, 10 с), он заблокирует запрос. Он также выдаст ошибку «Слишком много запросов» с кодом состояния 429.

Наконец, импортируйте функцию ограничителя в файл index.js и примените ее в качестве глобального промежуточного программного обеспечения в своем приложении. Сделайте это, разместив app.use(limiter) над промежуточным программным обеспечением маршрутов. Это применяет решение по ограничению скорости ко всем маршрутам вашего приложения.

app.use(limiter);

Ограничение скорости на определенных маршрутах

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

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

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

Затем создайте новую конфигурацию ограничения скорости в файле rate-limiter.js и экспортируйте ее.

const signInLimiter = rateLimiter({
    max: 3,
    windowMS: 10000, //10 seconds
    message: "Too many sign-in attempts. Try again later."
})
 
module.exports = {
    limiter,
    signInLimiter
}

Объект конфигурации signInLimiter имеет другое количество max запросов и сообщение об ошибке, отличное от общего ограничителя скорости.

Наконец, обновите файл router.js, включив в него приведенный ниже блок кода:

// router.js
const express = require("express");
const router = express.Router();
const {limiter, signInLimiter} = require("../middleware/rate-limiter")
 
router.get("/sign-in", signInLimiter, (req, res, next) => {
  res.send({ message: "Hello, this is a GET request" });
});
 
router.use(limiter)
 
router.post("/post", (req, res) => {
  res.status(201).send({ message: "Resource created successfully" });
});
 
router.put("/put", (req, res) => {
  res.status(201).send({ message: "Resource updated sucessfully" });
});
 
module.exports = router;

В приведенном выше блоке кода вы импортировали limiter и signInLimiter. Затем вы применили signInLimiter в качестве определенного ограничителя скорости к «/ вход».

Наконец, поместив router.use(limiter) над остальными маршрутами, вы применили ограничитель в качестве ограничителя скорости для остальных маршрутов.

Важность ограничения скорости

Ограничение скорости снижает нагрузку на ваш веб-сервер, позволяя избежать одновременной обработки слишком большого количества запросов. Это снижает активность ботов, защищает вас от атак типа «отказ в обслуживании» (DoS) и предотвращает атаки грубой силы.

Статьи по данной тематике: