Nginx limit_rate i limit_rate_after

Svi želimo imati responsivan server, kako bi posjetitelji mogli uživati u nesmetanom pretraživanju web siteova koji su na njemu hostani. Međutim, mnogi su čimbenici unutar sustava koji ga mogu usporiti i tako znatno ostaviti klijentima znatno lošiji dojam. Jedno od uskih grla sigurno je i propusnost mreže. Nginx server ima nekoliko odličnih direktiva koje nam mogu pomoći da kontroliramo bandwidth, a ovdje ću opisati čemu služi limit_rate_after varijabla i kako se koristi.

Pretpostavimo da s neke fizički relativno bliske lokacije s velikom propusnošću mreže, klijent zatraži velik file od našeg web servera. Web server će ga po defaultu isporučiti maksimalnom brzinom, i ukoliko je naš link na mrežu slabiji od klijentovog, vrlo lako će doći do zagušenja našeg izlaznog linka, pri čemu će ostatak web sitea biti u ozbiljnom usporenju u odnosu na normalan rad. Ostali klijenti neće znati koji je uzrok usporenja, ali će ga itekako osjećati. U realnom slučaju pak, događa se da velik broj klijenata zatraži istovremeni download, pri čemu se njihovi bandwidth-ovi zbrajaju, i rezultat je ponovo isti – zagušenje izlaznog linka web servera. Ovome se može doskočiti pomoću jednostavnih direktiva limit_rate i limit_rate_after.

Postavimo li u sekciju server { … } liniju

limit_rate 100k;

nginx će ograničiti brzinu downloada po jednoj konekciji na stotinu kilobajta u sekundi. Valja napomenuti da ukoliko klijent pokrene više konekcija, ukupna brzina za tog klijenta bit će broj konekcija pomnožen sa 100kB (u gornjem primjeru). Broj konekcija po jednom IP-u je također moguće limitirati jednostavnom direktivom limit_conn.

Međutim, ovakav način limitiranja brzine možda nije najbolji, jer su ovime ograničene sve konekcije, i za velike i za male fileove (poput slika i interaktivnih sadržaja što će također kod posjetitelja prouzročiti osjećaj sporog sitea). Zato je limitiranje bolje provesti samo za veće downloade, na slijedećem principu:

limit_rate_after 1m;
limit_rate 50k;

ovakva će konfiguracija limitirati samo one downloade koji su veći od jednog megabajta (“1m” = 1MB, “1k” = 1KB), i limit će uskočiti tek kada prvi megabajt bude prenešen maksimalnom brzinom. Znači, korisnik će primati prvi megabajt datoteke bez limita, a nakon toga do kraja datoteke s brzinom naznačenom pod limit_rate. Na ovaj način, uvodi se malo više kontrole nad bandwidth-om servera u slučaju da veći broj korisnika zatraži simultani download velikom brzinom.