Ограничавање брзине је стратегија коју можете користити за контролу саобраћаја на мрежи. Ограничава број захтева које корисник може да упути у одређеном временском оквиру.
Постоје различити алгоритми за ограничавање брзине, од којих сваки има своје компромисе. Један једноставан и популаран метод је праћење ИП адреса захтева и провера колико времена протекне између захтева. Систем тада може одбити захтев ако његова ИП адреса премашује број захтева који дозвољава ограничење.
Овај приступ ограничавању брзине је лако изградити у НодеЈС-Екпресс апликацији, са само неколико корака.
Корак 1: Постављање развојног окружења
Прво, мораћете да креирате и иницијализујете Екпресс апликацију.
Почните тако што ћете креирати директоријум пројекта тако што ћете покренути:
мкдир екпресс-апп
Затим уђите у тај директоријум тако што ћете покренути:
цд екпресс-апп
Затим иницијализујте нпм, менаџер пакета чвора, и створити а пацкаге.јсон датотеку у вашој апликацији тако што ћете покренути:
нпм инит -и
Тхе -и застава ће креирати вашу пацкаге.јсон датотеку са свим подразумеваним подешавањима.
Затим ћете морати да инсталирате неке зависности. Зависности потребне за овај водич су:
- ЕкпрессЈС: ЕкпрессЈС је НодеЈС оквир који пружа робустан скуп функција за веб и мобилне апликације. Поједностављује процес прављења позадинских апликација са НодеЈС-ом.
- Експресно ограничење стопе: Екпресс рате лимит је средњи софтвер који ограничава брзину за ЕкпрессЈС. Ограничава поновљене захтеве на јавне АПИ-је и/или крајње тачке, као што су ресетовање лозинке, пријављивање корисника итд.
Инсталирајте потребне зависности тако што ћете покренути:
нпм инсталирај експресна експресна стопа-лимит
Корак 2: Креирање експресне апликације
Мораћете да креирате основни Екпресс сервер који слуша захтеве који се упућују вашој апликацији.
Прво, креирајте ан индек.јс датотеку у основном директоријуму вашег пројекта. Ово ће бити улазна датотека за вашу апликацију.
Затим додајте следећи код у свој индек.јс фајл:
// индек.јс
конст екпресс = захтевају("изразити");
конст апп = екпресс();
конст порт = процес.енв. ПОРТ || 3000
апп.листен (порт, () => {
конзола.Пријава(`Апликација ради на порту ${порт}`);
});
Овај код увози изразити и креира Екпресс апликацију позивајући екпресс() и чувајући њену повратну вредност у апликација променљива. Затим ослушкује саобраћај на порту 3000 позивањем на слушај метода на апликација објекат.
Корак 3: Креирање руковаоца рута
Затим направите неке руковаоце рутама на којима можете имплементирати решење за ограничавање брзине.
Прво направите фасциклу, руте у основном директоријуму вашег пројекта тако што ћете покренути:
мкдир руте
Направите датотеку, роутес.јс, унутар фасцикле руте и додајте следећи код:
конст екпресс = захтевају("изразити");
конст рутер = експрес. Роутер();роутер.гет("/", (рек, рес) => {
рес.сенд({ порука: "Здраво, ово је ГЕТ захтев" });
});роутер.пост("/add-demo", (рек, рес) => {
рес.статус (201).сенд({ мессаге: "Ресурс је успешно креиран" });
});роутер.пут("/update-demo", (рек, рес) => {
рес.статус (201).сенд({ мессаге: "Ресурс је успешно ажуриран" });
});
модул.извоза = рутер;
Овај код увози изразити, позива Рутер метод на изразитии чува вредност у променљивој, рутер. Тхе Рутер метода вам омогућава да креирате модуларне руковаоце рута које се могу монтирати. Можете креирати руковаоце рута за а ДОБИТИ захтев за "/”, а ПОШТА захтев за "/add-demo”, и а СТАВИТИ захтев за "/update-demo”. Коначно, извезите рутер променљива.
Затим увезите рутер променљива у вашем индек.јс фајл:
// индек.јс
конст руте = захтевају("./роутес/роутес");
Затим га користите као међуверски софтвер у вашој индек.јс датотеци:
// индек.јс
апликација.користити(руте);
Обавезно поставите блок кода изнад пре апп.листен позив.
Корак 4: Примена ограничења брзине
Прво направите „Миддлеваре” фолдер у основном директоријуму вашег пројекта тако што ћете покренути:
мкдир Миддлеваре
Затим креирајте датотеку под називом „рате-лимитер.јс” унутар директоријума средњег софтвера. Додајте следећи код овој датотеци:
// рате-лимитер.јс
конст ратеЛимитер = захтевају("екпресс-рате-лимит");конст лимитер = ратеЛимитер({
мак: 5,
виндовМС: 10000, // 10 секунди
порука: "Можете'не подносите више захтева у овом тренутку. Покушајте поново касније",
});
модул.извоза = лимитер
Тхе ратеЛимитер функција узима конфигурациони објекат са условима да ограничи број захтева.
Својства у конфигурационом објекту изнад су:
- мак: Ово својство увек мора бити а број или функција која враћа број. Представља максималан број захтева које корисник може да упути у одређеном временском оквиру. Ако ово својство није постављено у конфигурационом објекту, подразумевано је на 5.
- виндовсМС: Ово својство увек треба да буде број. Представља временски оквир у којем је дозвољено неколико захтева милисекунди. Ако ово својство није постављено у конфигурационом објекту, подразумевано је на 60000 милисекунди (један минут).
- порука: Ово својство може бити а низ, ЈСОН објекат или било коју другу вредност коју подржава Експресов одговор.пошаљи методом. Ако ово својство није постављено у конфигурационом објекту, подразумевано је на „Превише захтева. Покушајте поново касније."
Функција ће затим проверити да ли постоје поновљени захтеви за вашу апликацију. Ако корисник прекорачи ограничење (мак, 5) у временском оквиру (виндовМС, 10с), блокираће захтев. Такође ће избацити грешку „Превише захтева“ са статусним кодом 429.
Коначно, увезите функцију лимитера у свој индек.јс датотеку и примените је као глобални међуверски софтвер у вашој апликацији. Урадите то постављањем апп.усе (ограничавач) изнад средњег софтвера рута. Ово примењује решење за ограничавање брзине на све руте ваше апликације.
апликација.користити(лимитер);
Специфичне руте које ограничавају брзину
Такође можете применити ограничење брзине на одређене руте. Можете их засебно конфигурисати да одбију захтеве упућене у другом временском оквиру, да приказују другу поруку итд.
На пример, претпоставите да имплементирате руту за пријављивање корисника у своју апликацију. Можда ћете морати да додате конфигурацију која ограничава брзину за руту за пријаву која се разликује од конфигурације коју користе друге руте.
Прво, мораћете да уклоните лимитер као међуверски софтвер на нивоу апликације и примените га јер у ЕкпрессЈС-у нема уграђеног система филтера међувера. Дакле, чак и ако додате одређено решење за ограничавање брзине на руту, глобални међуверски софтвер ће и даље радити на тој рути.
Затим направите нову конфигурацију која ограничава брзину у вашем рате-лимитер.јс датотеку и извезите је.
конст сигнИнЛимитер = ратеЛимитер({
мак: 3,
виндовМС: 10000, //10 секунди
порука: "Превише покушаја пријављивања. Покушајте поново касније."
})
модул.извоза = {
лимитер,
сигнИнЛимитер
}
Тхе сигнИнЛимитер конфигурациони објекат има различит број мак захтева и другачију поруку о грешци од општег лимитатора брзине.
Коначно, ажурирајте свој роутер.јс датотеку са блоком кода испод:
// роутер.јс
конст екпресс = захтевају("изразити");
конст рутер = експрес. Роутер();
конст {лимитер, сигнИнЛимитер} = захтевају("../миддлеваре/рате-лимитер")роутер.гет("/sign-in", сигнИнЛимитер, (рек, рес, нект) => {
рес.сенд({ порука: "Здраво, ово је ГЕТ захтев" });
});рутер.користити(лимитер)
роутер.пост("/post", (рек, рес) => {
рес.статус (201).сенд({ мессаге: "Ресурс је успешно креиран" });
});роутер.пут("/put", (рек, рес) => {
рес.статус (201).сенд({ мессаге: "Ресурс је успешно ажуриран" });
});
модул.извоза = рутер;
У блок кода изнад, увезли сте лимитер и сигнИнЛимитер. Онда сте се пријавили сигнИнЛимитер као специфични лимитатор стопе за „/sign-in" рута.
Коначно, постављањем рутер.усе (ограничавач) изнад осталих рута, применили сте лимитер као лимитатор брзине за остале руте.
Важност ограничења стопе
Ограничавање брзине смањује оптерећење вашег веб сервера избегавајући да обрађује превише захтева одједном. Смањује активност робота, штити вас од напада ускраћивања услуге (ДоС) и спречава нападе грубом силом.