Skocz do zawartości
elroy

Nginx limitowanie zapytań

Polecane posty

Witajcie!

Zabezpieczyłem vps przeciwko floodowaniu dyrektywą limit_req_zone która sądząc po logach działa.

 

Aktualnie wygląda to tak:

limit_req_zone $binary_remote_addr zone=strefa:20m rate=20r/s;

oraz w danym vhoście

 

  location ~ \.php$ {
limit_req   zone=strefa;

Pytania następujące:

Na vpsie działa forum oparte na IP.Board. Przy wartości około 15r/s użytkownikom przy standardowej pracy pojawiał się niekiedy błąd 503. Podniosłem więc do 20 i jest ok. Zastanawia mnie jednak, że jest to dość duża wartość. Ile macie ustawione?

 

Druga sprawa. Występują jeszcze tam takie parametry jak burst oraz delay których nie bardzo rozumiem. Do czego służą? Prosiłbym o podpowiedzi jak do najlepiej doszlifować.

 

Dzięki !

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Spójrz na to z innej strony, limitujesz zapytania do "plików php" zamiast zapytania do "vhosta", przez co z natury IPBoard każe userowi wczytywać kilka phpków pokolei (index, showtopic, user etc), a jeśli jest ich więcej niż 15 to hituje to Twój limit.

 

Jeśli zmienisz to na zapytania do vhost'a zamiast na zapytania do php'ka to nawet limit 4-5 będzie odpowiedni. Do tego bardziej Ci się przyda prawdopodobnie.

 

Burst to taka kolejeczka requestów, jest to liczba maksymalnej wartości requestów, które nginx będzie w stanie "zapamiętać" i będzie nakładał restrykcję requestów, przykładowo jak masz burst 100, limit 25, a strona ma też 25 to jeśli w tym samym czasie odpalisz pokolei 4 karty to będą się ładować w tempie każda następna 1s po poprzedniej. Opcja nodelay mówi, żeby tego delaya nie wprowadzać, czyli jest to wtedy po prostu taki większy limit.

  • Upvote 1

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

No tak, masz rację.

 

Czyli składnia powinna wyglądać tak? Przenieść po prostu z sekcji location, do server ?

server {
limit_req zone=strefa;
....

Resztę rozumiem, dzięki za wyklarowanie.

 

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Czekaj :) Nie mogę zaskoczyć :) Mam tak:


 

nginx.conf 
http {
limit_req_zone $binary_remote_addr zone=strefa:20m rate=10r/s;

w konfiguracji danego vhosta

 

server {
limit_req zone=strefa;

 

Tylko, że taka konfiguracja requestów już przy lekko nerwowym klikaniu po stronie powoduje cięcie zapytań.

Dobrze kombinuję?

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Jak najbardziej. Jeśli rzeczywiście powoduje cięcie to możesz zwiększyć ilość requestów, to jest w dużym stopniu uzależnione od samego IPBoard i tego w jaki sposób handluje requesty. Ja osobiście bym zamienił limit_req zone=strefa; na limit_req zone=strefa burst=3 nodelay; Jeśli nadal będzie "cięło" albo rzucało 503 to możesz zwiększyć rate. Ogółem nie ma konfiguracji perfekcyjnej dla każdego, trzeba poeksperymentować ;).

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Gość patrys

@Archi: coś Ci się nie pomyliło ?

Req na PHP to zapytanie aplikacji i omija pliki statyczne.

Req na vhost to wszystko...

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Zgadza się. Zakładam, że user chce limitować wszystko, a nie tylko pliki php (wysycanie łącza, a nie tylko zasobów), więc od razu zaproponowałem takie rozwiązanie.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Ok, dzięki za pomoc - zaczynam to kontrolować :)

Pytanie pomocnicze - są jakieś narzędzia (np dodatek do przeglądarki) dzięki którym mogę określić ile normalne wejście na stronę generuje requestów. Łacznie z plikami statycznymi.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Ok, dzięki za pomoc - zaczynam to kontrolować :)

Pytanie pomocnicze - są jakieś narzędzia (np dodatek do przeglądarki) dzięki którym mogę określić ile normalne wejście na stronę generuje requestów. Łacznie z plikami statycznymi.

 

Firebug - zakładka Sieć ;)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Chrome -> Ctrl+Shift+J -> Network

 

Nie wiem czy mam rację, ale jak masz w location ...php to wtedy 1 odświeżenie strony to 1 req, więc przy wartości 15r/s nie powinno być błędów. Przecież include'y w plikach to dalej w ramach 1 req, więc ewentualnie dodatkowe ajax'y, czyli shoutbox, komunikator. Jak ktoś nie klika częściej niż 1 raz na sekundę to 15r/s powinno starczać w zupełności.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Po jednym dniu testów wychodzi mi na to, że najprościej to ogarnąć (przy metodzie prób i błędów) w limitowaniu jednak w sekcji PHP. (założeniem było ograniczyć load) Przy 15r/s osoby które wpadały na forum i kolejne nowe wątki otwierały w kolejnych oknach dostawały sporadycznie 503. 20r/s dla intensywnych użytkowników wystarcza, ale już wciśniecie F5 po kilku sekundach kończy się zakończeniem sesji. Czyli ok :) Jedynie co zauważyłem, że mechanizm nie działa super sprawnie przy wyższym obciążeniu, ale to już jakby inny temat. Dziękuję wszystkim za pomoc !

Edytowano przez elroy (zobacz historię edycji)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Ja na forum na jakimś leciutkim skrypcie (nie pamiętam, ale naprawdę tylko kilka zapytań do bazy/req) ustawiłem 5req/s dla lokacji php'a i śmigało. Nawet jak ktoś otwierał pojedynczo w kartach to dawało radę.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Właśnie męczę się z podobnym problemem w związku z tym odkopuję temat.

Szukam sposobu na limitowanie requestów do PHP'a lub całego vhosta.

 

Próbuję zdefiniować następującą regułkę w głównej sekcji http:

limit_req_zone $binary_remote_addr zone=antiflood:10m rate=15r/s;

 

Następnie w server danego vhosta dodaję:

limit_req zone=antiflood;

Zawszę otrzymuję komunikat:

nginx: [emerg] unknown limit_req_zone "antiflood" in ...

Wszystko działa w otoczce Direct Admina.

Regułę tworzę w pliku głównym, sekcja http, a później includuję ją do sekcji server konkretnego vhosta. Zakładam, że definiuję regułę w złym miejscu?

 

Generalnie w ten sposób mówi o tym dokumentacja, ale zapewne źle ją zrozumiałem.

 

Przy okazji: co oznacza parametr burst? W dokumentacji nie udało mi się znaleźć dosłownego wytłumaczenia.

Czy chodzi o to, że reguła zaczyna działać jeśli klient przekroczy wartość burst, coś jak burst przy podziale łącza np. niceshaperem?

 

Pozdrawiam

 

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Jednak się udało.

 

Zrobiłem jeszcze raz na spokojnie i działa.

Nginx działa jako reverse proxy dla apache. Głównie zależy mi na zlimitowaniu wywołań do PHP'a. Serwer w sumie się nudzi jeśli chodzi o serwowanie statyków. Bardziej zabijają go zasobożerne skrypty PHP'a. Czasami wpada jakiś bot i zapycha pulę ilości procesów przeznaczonych dla usera i dana strona leży.

Czy jest jakiś sposób za zlimitowanie wywołań plików php?

Próbowałem z Location ~ \.php$, ale niestety nie działa.

 

Pozdrawiam

 

-------------------

Edycja:

Jak używam Location ~ \.php$ to nie działa limitowanie, ale za to pliki php nie są parsowane (jak podaję pełną ścieżkę to można pobrać ich źródła). Może to przez to, że nginx działa jako reverse proxy albo inne problemy konfiguracyjne.

Edytowano przez JohnyByk (zobacz historię edycji)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Gość Łukasz Tkacz

Podaj jak masz to zapisane. Używam limitowania właśnie na location, tylko do php i śmiga.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Bądź aktywny! Zaloguj się lub utwórz konto

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto

Zarejestruj nowe konto, to proste!

Zarejestruj nowe konto

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się


×