Ограничение скорости — это стратегия, которую вы можете использовать для управления трафиком в сети. Он ограничивает количество запросов, которые пользователь может сделать в течение определенного периода времени.
Существуют различные алгоритмы ограничения скорости, каждый со своими компромиссами. Один простой и популярный метод — отслеживать IP-адреса запросов и проверять, сколько времени проходит между запросами. Затем система может отклонить запрос, если ее IP-адрес превышает количество запросов, разрешенное лимитом.
Этот подход к ограничению скорости легко внедрить в приложение NodeJS-Express, выполнив всего несколько шагов.
Шаг 1: Настройка среды разработки
Во-первых, вам нужно создать и инициализировать приложение Express.
Начните с создания каталога проекта, выполнив:
mkdir экспресс-приложение
Затем войдите в этот каталог, запустив:
CD экспресс-приложение
Далее инициализируйте npm, менеджер пакетов узла, и создать пакет.json файл в вашем приложении, запустив:
инициализация npm -y
-у флаг создаст ваш пакет.json файл со всеми настройками по умолчанию.
Далее вам нужно будет установить некоторые зависимости. Зависимости, необходимые для этого руководства:
- ЭкспрессJS: ExpressJS — это фреймворк NodeJS. который обеспечивает надежный набор функций для веб-приложений и мобильных приложений. Это упрощает процесс создания серверных приложений с помощью NodeJS.
- Ограничение экспресс-ставки: Express rate limit — промежуточное ПО, ограничивающее скорость для ExpressJS. Он ограничивает повторные запросы к общедоступным API и/или конечным точкам, такие как сброс пароля, вход пользователей в систему и т. д.
Установите необходимые зависимости, запустив:
нпм установить экспресс экспресс-тариф-ограничение
Шаг 2: Создание экспресс-приложения
Вам нужно будет создать базовый сервер Express, который прослушивает запросы, поступающие к вашему приложению.
Сначала создайте index.js файл в корневом каталоге вашего проекта. Это будет входной файл для вашего приложения.
Затем добавьте следующий код в свой index.js файл:
// index.js
константа экспресс = требовать("выражать");
константа приложение = экспресс();
константа порт = процесс.env. ПОРТ || 3000
app.listen (порт, () => {
приставка.журнал(`Приложение работает на порту ${порт}`);
});
Этот код импортирует выражать и создает приложение Express, вызывая функцию express() и сохраняя возвращаемое значение в приложение переменная. Затем он прослушивает трафик на порту 3000 позвонив в Слушать метод на приложение объект.
Шаг 3: Создание обработчиков маршрутов
Затем создайте несколько обработчиков маршрутов, на которых вы сможете реализовать решение по ограничению скорости.
Сначала создайте папку route в корневом каталоге вашего проекта, запустив:
мкдир маршруты
Создайте файл, маршруты.jsвнутри папки маршрутов и добавьте следующий код:
константа экспресс = требовать("выражать");
константа роутер = экспресс. Маршрутизатор();роутер.получить("/", (треб., реш.) => {
res.send({сообщение: "Привет, это запрос GET" });
});роутер.пост("/add-demo", (треб., реш.) => {
res.status (201).send({сообщение: "Ресурс успешно создан" });
});роутер.пут("/update-demo", (треб., реш.) => {
res.status (201).send({сообщение: "Ресурс успешно обновлен" });
});
модуль.экспорт = маршрутизатор;
Этот код импортирует выражать, называет Маршрутизатор метод на выражать, и сохраняет значение в переменной, маршрутизатор. Маршрутизатор Метод позволяет создавать модульные, монтируемые обработчики маршрутов. Вы можете создавать обработчики маршрутов для ПОЛУЧИТЬ запрос на «/», а ПОЧТА запрос на «/add-demo", и ПОМЕЩАТЬ запрос на «/update-demo”. Наконец, экспортируйте маршрутизатор переменная.
Далее импортируйте маршрутизатор переменная в вашем index.js файл:
// index.js
константа маршруты = требовать(""./маршруты/маршруты");
Затем используйте его в качестве промежуточного программного обеспечения в вашем файле index.js:
// index.js
приложение.использовать(маршруты);
Обязательно поместите блок кода выше перед app.listen вызов.
Шаг 4: Реализация ограничения скорости
Сначала создайте «промежуточное ПО» в корневом каталоге вашего проекта, запустив:
ПО промежуточного слоя mkdir
Затем создайте файл с именем «скорость-limiter.js» внутри каталога промежуточного программного обеспечения. Добавьте в этот файл следующий код:
// скорость-ограничитель.js
константа ограничитель скорости = требовать("экспресс-лимит скорости");константа ограничитель = ограничитель скорости ({
макс: 5,
окноMS: 10000, // 10 секунд
сообщение: "Вы можете'в данный момент не делаю больше запросов. Попробуйте позже",
});
модуль.экспорт = ограничитель
скоростьLimiter функция принимает объект конфигурации с условиями ограничения количества запросов.
Свойства в объекте конфигурации выше:
- Максимум: это свойство всегда должно быть количество или функция, которая возвращает число. Он представляет максимальное количество запросов, которые пользователь может сделать в течение определенного периода времени. Если это свойство не задано в объекте конфигурации, оно по умолчанию равно 5.
- WindowsMS: Это свойство всегда должно быть числом. Он представляет собой временной интервал, в течение которого допускается несколько запросов в миллисекунды. Если это свойство не задано в объекте конфигурации, по умолчанию оно равно 60000 миллисекунд (одна минута).
- сообщение: это свойство может быть нить, объект JSON или любое другое значение, поддерживаемое Ответ экспресса. отправить метод. Если это свойство не задано в объекте конфигурации, по умолчанию оно равно «Слишком много запросов. Пожалуйста, попробуйте позже."
Затем функция проверит повторные запросы к вашему приложению. Если пользователь превышает лимит (Максимум, 5) в течение времени (окноMS, 10 с), он заблокирует запрос. Он также выдаст ошибку «Слишком много запросов» с кодом состояния 429.
Наконец, импортируйте функцию ограничителя в свой index.js файл и примените его в качестве глобального промежуточного программного обеспечения в своем приложении. Сделайте это, поместив app.use (ограничитель) над промежуточным программным обеспечением маршрутов. Это применяет решение по ограничению скорости ко всем маршрутам вашего приложения.
приложение.использовать(ограничитель);
Ограничение скорости определенных маршрутов
Вы также можете применить ограничение скорости для определенных маршрутов. Вы можете настроить их отдельно, чтобы отклонять запросы, сделанные в другой период времени, отображать другое сообщение и т. д.
Например, предположим, что вы реализуете маршрут входа пользователя в свое приложение. Возможно, вам потребуется добавить конфигурацию ограничения скорости для маршрута входа, которая отличается от конфигурации, используемой другими маршрутами.
Во-первых, вам придется удалить ограничитель в качестве промежуточного программного обеспечения уровня приложения и применять его, поскольку в ExpressJS нет встроенной системы фильтрации промежуточного программного обеспечения. Таким образом, даже если вы добавите к маршруту конкретное решение для ограничения скорости, глобальное промежуточное ПО все равно будет работать на этом маршруте.
Затем создайте новую конфигурацию ограничения скорости в вашем скорость-limiter.js файл и экспортировать его.
константа signInLimiter = скоростьLimiter({
макс: 3,
окноMS: 10000, //10 секунд
сообщение: "Слишком много попыток входа. Попробуйте позже."
})
модуль.экспорт = {
ограничитель,
signInLimiter
}
signInLimiter объект конфигурации имеет разное количество Максимум запросы и сообщение об ошибке, отличное от общего ограничителя скорости.
Наконец, обновите свой router.js файл с блоком кода ниже:
// маршрутизатор.js
константа экспресс = требовать("выражать");
константа роутер = экспресс. Маршрутизатор();
константа {ограничитель, signInLimiter} = требовать(""../промежуточное ПО/ограничитель скорости")роутер.получить("/sign-in", signInLimiter, (req, res, next) => {
res.send({сообщение: "Привет, это запрос GET" });
});маршрутизатор.использовать(ограничитель)
роутер.пост("/post", (треб., реш.) => {
res.status (201).send({сообщение: "Ресурс успешно создан" });
});роутер.пут("/put", (треб., реш.) => {
res.status (201).send({сообщение: "Ресурс успешно обновлен" });
});
модуль.экспорт = маршрутизатор;
В приведенном выше блоке кода вы импортировали ограничитель а также знак ограничения. Затем вы подали заявку signInLimiter как специфический ограничитель скорости «/sign-in" маршрут.
Наконец, поместив router.use (ограничитель) над остальными маршрутами вы применили ограничитель в качестве ограничителя скорости для остальных маршрутов.
Важность ограничения скорости
Ограничение скорости снижает нагрузку на ваш веб-сервер, позволяя избежать одновременной обработки слишком большого количества запросов. Он снижает активность ботов, защищает вас от атак типа «отказ в обслуживании» (DoS) и предотвращает атаки грубой силы.