Jak zwiększyć liczbę jednoczesnych połączeń w Apache

Dziś jeszcze raz z wami porozmawiam o jednej z najczęściej używanych usług internetowych na świecie: serwerze WWW Apache2.

Jest to temat, o którym mówiono wiele razy, ale teraz przechodzę do kolejnej funkcji, którą należy wziąć pod uwagę w tej usłudze: Limit jednoczesnych połączeń. Nie ma znaczenia, czy mamy bardzo podstawowy, czy statek kosmiczny z procesorem i7 i 32 GB pamięci RAM ...

Limit jednoczesnych połączeń zawsze będzie taki sam, chyba że podejmiemy odpowiednie kroki, co oznacza, że ​​jeśli chcemy mieć podłączonych wiele osób w tym samym czasie, będziemy potrzebować nie tylko dobrego sprzętu, ale także dobrej konfiguracji.

W tym przypadku nie trzeba niczego instalować, wszystko opiera się na prostych koncepcjach, które należy wziąć pod uwagę podczas konfiguracji apache; koncepcje, które muszą być bardzo jasne, zanim zechcesz wprowadzić jakiekolwiek zmiany.

apache2_logo

Pierwszą rzeczą do przemyślenia jest: jakie zdolności ma mój zespół? Ile jednoczesnych połączeń może obsługiwać mój sprzęt, jeśli wymuszę go tak bardzo, jak to możliwe? Wszystko to zależy od jednego czynnika; RAM (pamięć o dostępie swobodnym).

Im większa pamięć RAM, tym większa liczba połączeń, chociaż nie ma ustalonej wartości (czyli X klientów dla każdego X-RAMu), dlatego przede wszystkim ważne jest, aby wykonać kilka drobnych obliczeń na naszym serwerze WWW, z aby poznać nasze ograniczenia.

Pierwszą rzeczą, którą powinieneś wiedzieć, jest to, ile średnio pamięci RAM zużywa każde połączenie z Apache, ponieważ każde nawiązane połączenie zakłada określone zużycie pamięci RAM w systemie ... Oczywiście nie wszystkie połączenia zużywają tę samą pamięć RAM, z którą trzeba by było wykonać a media ... Wszystko to można uzyskać za pomocą następującego polecenia:

ps -ylC apache2 --sort: rss | awk '{SUMA + = 8 $; I + = 1} END {print SUM / I / 1024} '

Otrzymany wynik byłby przedstawiony w megabajtach i może się różnić w zależności od liczby aktywnych połączeń, typu przeglądanych stron itp. Dlatego zaleca się przeprowadzenie testu przy otwartych różnych zakładkach; każdy z nich pokazuje inną treść, jeśli to możliwe. Na przykład w moim przypadku wynik to 9.5458, czyli jeśli zaokrąglimy go do góry, to będzie 10 MB Średnio zużycie pamięci RAM na połączenie.

Ważne jest również, aby wiedzieć, ile pamięci RAM zużywa pozostałe procesy, które są aktywne w systemie, ponieważ usługa sieciowa nie jest jedyną, która działa w systemie operacyjnym i konieczne jest pozostawienie wolnej pamięci RAM na serwer, aby mógł wykonać pozostałe zadania. Można to uzyskać za pomocą polecenia pokazanego poniżej:

ps -N -ylC apache2 --sort: rss | awk '{SUMA + = $ 8} END {print SUM / 1024}'

Otrzymany wynik byłby również przedstawiony w megabajtach i pokazywałby nam dość dokładnie ilość pamięci RAM zużywanej przez pozostałe procesy; w moim przypadku 800 MB. Mając te informacje, moglibyśmy dokonać ogólnego obliczenia liczby jednoczesnych połączeń, które moglibyśmy mieć; Obliczam, że uzyskalibyśmy za pomocą bardzo prostej operacji.

(RAMTOTAL - RAM_RESTOPROCESOS) / RAM_POR_CONNEXIÓN

Mając ten wzór w ręku, wyobraźmy sobie, że mamy komputer z 4 GB RAM, czyli 4096 MB i że nasz komputer pokazał powyższe wyniki; obliczenie byłoby następujące:

(4096 - 800) / 10 = 329 jednoczesnych połączeń

Problem z tym obliczeniem polega na tym, że jeden jest zbyt ekstremalny, ponieważ zużywałby całą pamięć RAM (powodując, że serwer zużywałby swap), a także, w przypadku posiadania bazy danych, takiej jak MySQL lub jakakolwiek inna, połączenia z nią również zużywałyby Pamięć RAM, dzięki której uzyskaną liczbę można zakwalifikować jako liczbę utopijną. Dlatego, aby zwolnić pamięć na ewentualne dodatkowe procesy, a także wziąć pod uwagę możliwość wykonywania połączeń z bazą danych, ograniczylibyśmy liczbę połączeń do 250.

Teraz, gdy mamy naszą maksymalną liczbę jednoczesnych połączeń, musielibyśmy przygotować Apache, aby był w stanie odebrać ten numer, co odbywa się w pliku konfiguracyjnym tego wywołania apache2.conf, który jest hostowany w / etc / apache2.

Przedmiotowy plik ma strukturę opartą na moduły, każdy z odpowiednią nazwą, ale interesowałoby nas tylko jeden z nich, którego imię to  mpm_prefork_module. Omawiany moduł zawiera domyślnie następujące dane:

StartServers 5 MinSpareServers 5 MaxSpareServers 10 MaxClients 150 MaxRequestsPerChild 0

Moduł ten posiada szereg bardzo ważnych parametrów, choć jest jeden z nich, który by nas szczególnie interesował, tzw MaxClients. Ten parametr określa maksymalną liczbę jednoczesnych połączeń i powinien zostać zmieniony na 250.

Należy pamiętać o tym, że gdy we wspomnianym parametrze określona jest wartość inna niż domyślna, konieczne jest dodanie jeszcze jednej, tylko PRZED tą. Ten parametr nosi nazwę ServerLimit i ustawia limit połączeń, które serwer może "utrzymywać", nawet jeśli jest poza limitem.

Parametr ServerLimit zawsze musi być nieco wyższy niż MaxClients i tutaj, ze względu na niewielkie pole manewru, limit 270. To sprawiłoby, że moduł wyglądałby tak:

StartServers 5 MinSpareServers 5 MaxSpareServers 10 ServerLimit 270 MaxClients 250 MaxRequestsPerChild 0

Teraz wystarczyłoby tylko zrestartować usługę Apache za pomocą polecenia: 

/etc/init.d/apache2 restart

Dzięki temu mogliśmy już cieszyć się naszym zoptymalizowanym serwerem WWW.

Pozdrowienia.


Zostaw swój komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

*

*

  1. Odpowiedzialny za dane: Miguel Ángel Gatón
  2. Cel danych: kontrola spamu, zarządzanie komentarzami.
  3. Legitymacja: Twoja zgoda
  4. Przekazywanie danych: Dane nie będą przekazywane stronom trzecim, z wyjątkiem obowiązku prawnego.
  5. Przechowywanie danych: baza danych hostowana przez Occentus Networks (UE)
  6. Prawa: w dowolnym momencie możesz ograniczyć, odzyskać i usunąć swoje dane.

  1.   zetatin powiedział

    Dzięki za post!

    1.    drassill powiedział

      Cieszę się, że znalazłeś to przydatne.

      Pozdrowienia.

  2.   Michelangelo powiedział

    Istnieje sposób na połączenie Apache i dwóch serwerów w klaster, czy możesz wyjaśnić, jak to działa?

    1.    drassill powiedział

      Chociaż przeczytałem trochę teorii na ten temat, nigdy nie zastosowałem jej w praktyce. Mimo to, być może ten artykuł może udzielić ci wskazówek w tym zakresie, chociaż powtarzam, że nie miałem okazji wprowadzić go w życie:

      http://www.muspells.net/blog/2011/04/alta-disponibilidad-con-apache2-y-heartbeat-en-debian-squeeze/

    2.    Eduardo Dżalli powiedział

      Pytałeś przez długi czas, jeśli nie rozwiązałeś; Mam schemat równoważenia z osobą trzecią, która działa jak system plików, wskazujesz foldery, które są w var / www / html / (w moim przypadku) na system plików, więc udostępniają te same informacje i prawdopodobnie wymagają wirtualnego adresu IP, który odpowiada i przekierowuje na ips apache, w tym celu możesz zająć haproxy, a jeśli chcesz, aby był w wysokiej dostępności, możesz zintegrować keepalive w przypadku, gdy jeden upadnie, drugi nadal odpowiada lub jeśli już domenę dla aplikacji, możesz zrównoważyć funt robiąc backendy na obu serwerach, w szczególnych przypadkach, takich jak moodle lub niektóre aplikacje, które łączą się z bazą danych w mysql, musisz utworzyć użytkownika na serwer aplikacji, który wskazuje na tę samą bazę danych .

  3.   Szamaru powiedział

    Bardzo dziękuję za post, masz absolutną rację, ram jest podstawowym obliczeniem, chociaż wyobrażam sobie, że obliczamy również maksymalną liczbę procesów, które może obsłużyć nasz procesor (oczywiście najpierw wykonując obliczenia pamięci głównej) i jak dysk będzie dystrybuowany na twardo (przykład partycji / var = 1TR).

    1.    drassill powiedział

      Masz rację; wszystko jest ważne, jak między innymi kontrola temperatury. Oczywiście potężny procesor może wykonywać jednocześnie większą liczbę zadań z dużą wydajnością, ale celem tego postu było wyjaśnienie znaczenia pamięci RAM w odniesieniu do liczby jednoczesnych połączeń.

      Dobrym sposobem na kontrolowanie wszystkich tych czynników i sprawdzenie, czy nasz procesor nie jest nasycony lub czy mamy mało wolnej pamięci RAM, byłoby użycie skryptu bash. Może ten post, który napisałem kilka dni temu o tym będzie dla Ciebie interesujący, który zostawiam w poniższym linku; To jest monitoring globalny, ale może być dla kogoś interesujący:

      http://bytelearning.blogspot.com.es/2015/07/controlando-la-salud-del-equipo-con-bash.html

      pozdrowienia

  4.   Sergio S. powiedział

    Bardzo dobra ocena, bardzo dziękuję!

    1.    drassill powiedział

      Wielkie dzięki! Mam nadzieję, że udało Ci się to wykorzystać.

  5.   błazen powiedział

    Nie chcę być palantem ...
    … Ale zwiększając liczbę połączeń, nie narażasz się na atak DDoS?

    1.    drassill powiedział

      To nie jest ciche pytanie kretynów. Prawda jest taka, że ​​zwiększając liczbę jednoczesnych połączeń, częściowo wzmacniamy Apache przed atakami DDOS, ponieważ trzeba liczyć się z tym, że liczba maksymalnych jednoczesnych połączeń nawiązanych na serwerze to liczba łącznych maksymalnych połączeń, a nie tych pochodzących z jeden użytkownik. Tak więc, o ile na początku mogliśmy obsługiwać tylko 150 jednoczesnych połączeń (niezależnie od tego, czy są to połączenia z legalnego źródła, czy nie), teraz możemy liczyć na tyle, ile obsługuje nasz serwer, wymagając większej liczby połączeń jednocześnie, aby być bez usługa. Oczywiście zwiększenie maksymalnej liczby połączeń nie jest sposobem na ochronę przed tego typu atakiem, ale raczej należałoby zaimplementować zasady zapory. Jeśli na przykład usługa sieciowa, którą chcesz umieścić, ma być ujawniona w Internecie, środkiem bezpieczeństwa, który mógłby zostać wdrożony, byłoby dodanie tych linii do naszej zapory:

      iptables -A INPUT -p tcp –syn –dport 80 -m connlimit –connlimit-upto 10 -m stan –stan NOWY -j AKCEPTUJ

      iptables -A WEJŚCIE -p tcp –dport 80 -m stan - stan USTANOWIONY, ZWIĄZANY -j AKCEPTUJ

      iptables -A WEJŚCIE -p tcp –dport 80 -j DROP

      1.    pajac powiedział

        Jedną z cech ataków DDoS jest to, że osoba atakująca może wydawać się wysyłać pakiety z kilku różnych kierunków, co zapobiega przepływowi pakietów tylko z jednego kierunku.

    2.    drassill powiedział

      Masz rację w tym sensie, że zapora ogniowa, taka jak ta, którą skonfigurowałem, nie jest zbyt skuteczna w przypadku ataku DDoS, ponieważ pochodzi z różnych źródeł. Mimo to lepiej jest ograniczyć liczbę połączeń do 10 dla każdego z tych źródeł, zamiast nie mieć limitu, dzięki czemu każde źródło będzie w stanie ustanowić sto lub więcej połączeń.

      W każdym razie zestaw pytania jest taki, że im więcej jednoczesnych połączeń obsługuje serwer, tym trudniej będzie go znokautować atakiem DDOS, co utrudniłoby zburzenie strony przez atakującego .

      Pozdrowienia.

  6.   Eliotime3000 powiedział

    Dobry. Na razie kontynuuję NGINX na mojej stronie, aby nie torturować VPS, które mam.

  7.   Bruno cascio powiedział

    Niezły post @Drassill!

    Chciałem wnieść coś być może bardziej statystycznego niż konfiguracja.
    Chociaż najłatwiejszym i najszybszym sposobem obliczenia parametru konsumpcji jest średnia, być może moglibyśmy być bardziej rygorystyczni i użyć „mediany” zamiast „średniej”. Co by nas uratowało? Że liczby rosną w przypadku, gdy połączenie zajęło dużo pamięci. Załóżmy na przykład, że następujący klienci zużywają następujące wartości w żądanej jednostce pamięci (KB, MB, MiB itp.):

    10, 15, 150, 5, 7, 10, 11, 12

    Średnia dałaby około ~ 30

    A to dlatego, że mamy bardzo duży koniec (150), a obliczenia są szalone. Mediana polega na uporządkowaniu tych danych, podzieleniu liczby próbek przez 2 (nasze centrum), a następnie uzyskaniu liczby tej pozycji. Z tym mielibyśmy coś takiego

    5, 7, 10, 10, 11, 12, 15, 150

    Zatem nasza średnia wyniosłaby: 8/2 = 4 czyli ~ 10

    Tutaj widać, że bez względu na to, jak szalona może być skrajność, zawsze da nam to bardziej realistyczną wartość. Jeśli dodamy klienta, który konsumuje 200, nasza mediana wyniesie 11, podczas gdy średnia może sięgnąć …….

    To tylko wkład i jest bardzo dyskusyjny, bo przy połączeniach nie jest przykręcony.

    Przytulaj ludzi linuxera 🙂

  8.   Carlos powiedział

    Witam, miałem problem na moim serwerze dedykowanym, a jest to, że za każdym razem, gdy liczba około 250 osób zbliża się online, zgodnie z Google Analytics w czasie rzeczywistym, mój serwer się zawali i połączenie staje się powolne, dopóki nie zerwie połączenia na stronę i nigdy nie przesyła więcej niż ta liczba użytkowników online, ale kiedy widzę wydajność serwera dedykowanego, czyli 8 GB pamięci RAM, pokazuje 10% wykorzystania, procesor: 5% wykorzystania, a dysk twardy: 1.99% użytkowania.
    Możesz mi pomóc? Nie mogę znaleźć rozwiązania, czy wykonanie tych czynności jest rozwiązaniem?

    1.    drassill powiedział

      Dobry Carlos.

      Opisany problem występuje bardzo często, gdy serwer nie jest odpowiednio przygotowany. Twój serwer prawdopodobnie zaakceptuje znacznie mniejszą liczbę jednoczesnych połączeń i po osiągnięciu 250 połączeń ulegnie awarii. Postępując zgodnie z instrukcją, powinieneś być w stanie rozwiązać problem, chociaż jeśli masz bazę danych na tym serwerze, musisz również zoptymalizować tę bazę.

      Pozdrowienia.

      1.    Carlos powiedział

        Drassill, wykonałem konfigurację, o której wspomniałeś i była zadowalająca, wczoraj dotarłem do 280 użytkowników online i serwer się nie zawiesił, jestem bardzo zadowolony z tego wyniku, a także chcę zrobić inną rzecz, którą mi każesz zoptymalizować baza danych, ¿Jak to osiągnąć?

    2.    drassill powiedział

      Koncepcja bazy danych jest dość otwarta; używanie mysql to nie to samo, co postgres (na przykład). Oczywiście nie znam wszystkich baz danych; Próbowałem mysql i postgres, a wzrost liczby jednoczesnych połączeń w nich byłby oparty na parametrze max połączeń; Optymalizacja mysql byłaby wykonywana w /etc/my.conf, a parametr maksymalnych połączeń musiałby zostać zmieniony (między innymi). Zamiast tego dla postgresów mam artykuł na moim blogu, który wyjaśnia, jak go zoptymalizować, co może być dla Ciebie przydatne lub którego możesz użyć jako odniesienia dla swojej bazy danych:

      http://bytelearning.blogspot.com.es/2016/02/postgresql-una-alternativa-mysql-en.html

      Pozdrowienia.

  9.   Erickson vasquez powiedział

    Witam, kiedy wrzucę pierwsze polecenie, pokazuje mi wartość 0. Co to może być?

  10.   Daniel Ojeda powiedział

    Dziękuję za ten post.

  11.   Rolanda Aguilery Salazara powiedział

    Co za dobry podręcznik, ta informacja jest częścią tego, czego szukam... dzięki!

    Ale teraz, jeśli chcę, aby po przekroczeniu tych 250 gości odwiedzający 251 przechodził do strony oczekującej lub wirtualnej kolejki, czy mogę to zrobić z tej samej konfiguracji?

    Pozdrowienia i podziękowania!