Jak zvýšit počet souběžných připojení v Apache

Dnes vám přijdu promluvit ještě jednou o jedné z nejpoužívanějších webových služeb na světě: o webovém serveru Apache2.

Je to téma, o kterém se už mnohokrát hovořilo, ale teď vám řeknu něco o další funkci, kterou je třeba u této služby zohlednit: Limit současných připojení. Nezáleží na tom, jestli máme velmi základní nebo vesmírnou loď s procesorem i7 a 32 GB RAM ...

Limit simultánních připojení bude vždy stejný, pokud nepřijmeme příslušná opatření, což znamená, že pokud chceme mít připojeno více lidí současně, budeme vyžadovat nejen dobrý hardware, ale také dobrou konfiguraci.

V tomto případě není nutné nic instalovat, vše je založeno na jednoduchých koncepcích, které je třeba vzít v úvahu při konfiguraci apache; koncepty, které musí být velmi jasné, než budou chtít provádět jakékoli změny.

apache2_logo

První věc, na kterou je třeba myslet, je: Jakou kapacitu má můj tým? Kolik simultánních připojení může moje zařízení podporovat, pokud je vynucuji co nejvíce? To vše závisí na jediném faktoru; RAM (paměť s náhodným přístupem).

Čím větší je RAM, tím větší je počet připojení, i když neexistuje žádná pevná hodnota (tj. X klient pro každý X ram), proto je nejprve důležité provést několik malých výpočtů na našem webovém serveru, s abychom poznali naše limity.

První věc, kterou byste měli vědět, je, kolik RAM v průměru spotřebuje každé připojení k Apache, protože každé navázané připojení předpokládá určitou spotřebu RAM v systému ... Je zřejmé, že ne všechna připojení spotřebovávají stejného RAM, s nímž by člověk musel provést média ... To vše lze získat pomocí následujícího příkazu:

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

Získaný výsledek by byl zastoupen v megabajtech a může se lišit v závislosti na počtu aktivních připojení, typu přístupných stránek atd ... Proto je vhodné provést test s otevřenými různými záložkami; pokud je to možné, každý z nich má jiný obsah. Například v mém případě byl výsledek 9.5458, což by, kdybychom to zaokrouhlili nahoru, bylo 10 MB RAM spotřebovaná v průměru na jedno připojení.

Je také důležité vědět, kolik paměti RAM spotřebují ostatní procesy aktivní v systému, protože webová služba není jediná, která běží v operačním systému, a je nutné ponechat na serveru volnou paměť RAM aby mohl vykonat zbytek úkolů. Toho lze dosáhnout pomocí níže uvedeného příkazu:

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

Získaný výsledek by byl také zastoupen v megabajtech a docela přesně by nám ukázal množství paměti RAM spotřebované zbytkem procesů; v mém případě 800 MB. S touto informací bychom mohli provést obecný výpočet počtu současných připojení, která bychom mohli mít; Počítám, že bychom to získali velmi jednoduchou operací.

(RAMTOTAL - RAM_RESTOPROCESOS) / RAM_POR_CONNEXIÓN

S tímto vzorcem v ruce si představme, že máme počítač se 4 GB RAM, tedy 4096 MB a že náš počítač ukázal výše uvedené výsledky; výpočet by byl:

(4096 - 800) / 10 = 329 současných připojení

Problém tohoto výpočtu spočívá v tom, že jeden je příliš extrémní, protože by spotřeboval veškerou paměť RAM (což by server spotřebovalo swap) a také v případě, že by existovala databáze, jako je MySQL nebo jakákoli jiná, připojení k ní by také spotřebovalo RAM, takže získané číslo lze kvalifikovat jako utopické číslo. Proto, abychom uvolnili paměť pro případné další procesy a také zvážili možnost, že budou provedena připojení k databázi, snížili bychom počet připojení k 250.

Nyní, když máme maximální počet současných připojení, bychom museli připravit Apache na příjem tohoto čísla, což se provádí v konfiguračním souboru tohoto volání apache2.conf, který je hostován v / etc / apache2.

Dotčený soubor sleduje strukturu založenou na moduly, každý s odpovídajícím jménem, ​​ale nás by zajímal pouze jeden z nich, jehož jméno je  mpm_prefork_module. Dotyčný modul má ve výchozím nastavení následující data:

StartServers 5 MinSpareServers 5 MaxSpareServers 10 MaxClients 150 MaxRequestsPerChild 0

Tento modul má řadu velmi důležitých parametrů, i když existuje jeden z nich, který by nás zvlášť zajímal, tzv Maxclients. Tento parametr určuje maximální počet současných připojení a měl by být upraven na 250.

Jeden detail, který je třeba mít na paměti, je, že když je v uvedeném parametru zadána jiná než výchozí hodnota, je nutné přidat další ještě před PŘED touto. Tento parametr se nazývá ServerLimit a nastavuje limit připojení, který by server mohl „zadržet“, i když je mimo limit.

Parametr ServerLimit musí být vždy o něco vyšší než MaxClients a zde, protože je zde malý manévrovací prostor, limit 270. Díky tomu by modul vypadal takto:

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

Nyní by bylo pouze nutné restartovat službu Apache pomocí příkazu: 

/etc/init.d/apache2 restartujte

Díky tomu jsme si už mohli užívat náš optimalizovaný webový server.

Zdravím.


Zanechte svůj komentář

Vaše e-mailová adresa nebude zveřejněna. Povinné položky jsou označeny *

*

*

  1. Odpovědný za údaje: Miguel Ángel Gatón
  2. Účel údajů: Ovládací SPAM, správa komentářů.
  3. Legitimace: Váš souhlas
  4. Sdělování údajů: Údaje nebudou sděleny třetím osobám, s výjimkou zákonných povinností.
  5. Úložiště dat: Databáze hostovaná společností Occentus Networks (EU)
  6. Práva: Vaše údaje můžete kdykoli omezit, obnovit a odstranit.

  1.   zetatin řekl

    Díky za příspěvek!

    1.    drassill řekl

      Jsem rád, že vám to přišlo užitečné.

      Zdravím.

  2.   Michelangelo řekl

    Existuje způsob, jak clusterovat Apache a dva servery, můžete vysvětlit, jak to funguje?

    1.    drassill řekl

      Ačkoli jsem o tom četl nějakou teorii, nikdy jsem ji neaplikoval do praxe. Možná vám tento článek může v tomto ohledu poskytnout určité vodítko, i když opakuji, že jsem neměl příležitost jej uvést do praxe:

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

    2.    Edward Khalil řekl

      požádali jste na chvíli, pokud jste to nevyřešili; Mám vyvažovací schéma s třetí stranou, která funguje jako souborový systém, nasměrujete složky, které jsou v adresáři var / www / html / (v mém případě) na systém souborů, takže sdílejí stejné informace, a pravděpodobně budete potřebovat virtuální IP, která odpovídá a přesměrovat na IPS apačů, za to můžete obsadit haproxy a pokud chcete vysokou dostupnost, můžete integrovat keepalive pro případ, že jeden spadne, druhý bude nadále reagovat, nebo také pokud již máte doménu pro aplikaci, můžete zůstatek s librou dělat backendy na oba servery, v konkrétních případech, jako je moodle nebo určité aplikace, které se připojují k databázi v mysql, byste museli vytvořit uživatele na server aplikace, který ukazuje na stejnou databázi.

  3.   šamaru řekl

    Velice vám děkuji za příspěvek, máte úplnou pravdu, primární výpočet je beran, i když si představuji, že počítáme také maximální počet procesů, které náš procesor zvládne (samozřejmě nejprve proveďte výpočet hlavní paměti) a jak by byl disk distribuován tvrdě (Příklad diskových oddílů / var = 1TR).

    1.    drassill řekl

      Máš pravdu; vše je důležité, například regulace teploty. Je zřejmé, že výkonný procesor může provádět větší počet úkolů současně s velkou účinností, ale cílem tohoto příspěvku bylo vysvětlit důležitost RAM s ohledem na počet současných připojení.

      Dobrým způsobem, jak řídit všechny tyto faktory a zjistit, zda náš procesor není nasycený, nebo zda máme málo volné paměti RAM, by bylo použití bash skriptu. Možná je pro vás zajímavý tento příspěvek, který jsem o něm před pár dny zveřejnil, který vám nechávám v následujícím odkazu; Jedná se o globální monitorování, ale pro někoho může být zajímavé:

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

      pozdravy

  4.   Sergio S. řekl

    Velmi dobrá poznámka, moc děkuji!

    1.    drassill řekl

      Díky moc! Doufám, že jste to dokázali využít.

  5.   klaun řekl

    Nechci být blbec ...
    … Ale zvýšením počtu připojení nenecháte zranitelnější vůči útoku DDoS?

    1.    drassill řekl

      Není to žádná tichá kreténová otázka. Pravdou je, že zvýšením počtu současných připojení částečně posílíme Apache proti útokům DDOS, protože musíte vzít v úvahu, že počet maximálních současných připojení navázaných na serveru je počet celkových maximálních připojení, nikoli těch, které pocházejí z jeden uživatel. I když jsme na začátku mohli podporovat pouze 150 současných připojení (ať už jde o připojení z legitimního zdroje, nebo ne), nyní můžeme počítat s tolika, kolik náš server podporuje, což vyžaduje větší počet připojení současně, aby bylo servis. Je zřejmé, že zvýšení maximálního počtu připojení není způsob, jak se chránit před tímto typem útoku, ale spíše by bylo nutné implementovat zásady brány firewall. Pokud bude například webová služba, kterou chcete umístit, vystavena internetu, je možné implementovat bezpečnostní opatření přidáním těchto řádků do naší brány firewall:

      iptables -A INPUT -p tcp –syn –dport 80 -m connlimit –connlimit-až do 10 -m stavu –state NOVINKA -j PŘIJMOUT

      iptables -A INPUT -p tcp –dport 80 -m state –state ZAVEDENO, SOUVISEJÍCÍ -j PŘIJMOUT

      iptables -A VSTUP -p tcp –dport 80 -j DROP

      1.    klaun řekl

        Jednou z charakteristik útoků DDoS je to, že se útočník může zdát, že odesílá pakety z několika různých směrů, což brání toku paketů přicházet pouze z jednoho směru.

    2.    drassill řekl

      Máte pravdu v tom smyslu, že firewall, jako je ten, který jsem nastavil, není proti útoku DDOS příliš efektivní, protože pochází z různých zdrojů. Přesto je lepší omezit počet připojení na 10 pro každý z těchto zdrojů, než nemít limit, aby každý zdroj mohl navázat stovku připojení nebo více.

      Souprava otázky v každém případě spočívá v tom, že čím více současných připojení server podporuje, tím obtížnější bude srazit to pomocí útoku DDOS, což by ztížilo, aby útočník stránku srazil dolů .

      Zdravím.

  6.   eliotime3000 řekl

    Dobrý. Prozatím pokračuji s NGINX na mých stránkách, abych nemučil VPS, které mám.

  7.   Bruno cascio řekl

    Dobrý příspěvek @Drassill!

    Chtěl jsem přispět něčím možná statističtějším než konfigurace.
    Přestože nejjednodušší a nejrychlejší způsob výpočtu parametru spotřeby je průměr, možná bychom mohli být přísnější a místo „průměru“ použít „medián“. Před čím by nás to zachránilo? Že čísla vystřelí v případě, že spojení spotřebovalo hodně paměti. Předpokládejme například následující klienty, kteří spotřebovávají následující hodnoty v jednotkách paměti, které chtějí (KB, MB, MiB atd.):

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

    Průměr by dal asi ~ 30

    A to proto, že máme velmi velký extrém (150), a tyto výpočty jsou šílené. Medián se skládá z uspořádání těchto dat, vydělením počtu vzorků 2 (naše střed) a poté získáním počtu této pozice. S tím bychom měli něco jako

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

    Náš průměr by tedy byl: 8/2 = 4, což je ~ 10

    Zde vidíte, že bez ohledu na to, jak extrémní může být šílený, vždy nám dá realističtější hodnotu. Pokud k tomu přidáme zákazníka, který spotřebuje 200, náš medián bude 11, zatímco průměr může dosáhnout …….

    Je to jen příspěvek a je to velmi diskutabilní, protože s připojením to není zašroubováno.

    Objímejte lidi linuxera 🙂

  8.   Carlos řekl

    Dobrý den, na mém dedikovaném serveru jsem měl problém, a to je to, že pokaždé, když se online přiblíží přibližně 250 lidí, podle google analytics v reálném čase se můj server zhroutí a připojení se zpomalí, dokud spojení nevypadne na web a nikdy nenahraje více než tento počet uživatelů online, ale když vidím výkon dedikovaného serveru, který je 8 GB RAM, ukazuje 10% využití, procesor: 5% použití a pevný disk v: 1.99% použití.
    Můžeš mi pomoci? Nemohu najít, co mám dělat, dělá tyto kroky řešení?

    1.    drassill řekl

      Dobrý Carlos.

      Problém, který popisujete, je velmi častý, když server není správně připraven. Váš server pravděpodobně přijme mnohem menší počet současných připojení a po dosažení 250 připojení dojde k chybě. Podle příručky byste měli být schopni problém vyřešit, ačkoli pokud máte na daném serveru databázi, budete ji muset také optimalizovat.

      Zdravím.

      1.    Carlos řekl

        Drassill, udělal jsem konfiguraci, kterou jste zmínili, a byla uspokojivá, včera jsem dosáhl 280 uživatelů online a server nevisel, jsem s tímto výsledkem velmi spokojen a chci udělat i další věc, kterou mi řeknete, k optimalizaci databáze, ¿ Jak toho dosáhnu?

    2.    drassill řekl

      Koncept databáze je docela otevřený; použití mysql není totéž jako postgres (například). Je zřejmé, že neznám všechny databáze; Zkoušel jsem mysql a postgres a nárůst současných připojení v nich by byl založen na parametru max připojení; optimalizace mysql by byla provedena v /etc/my.conf a musel by být změněn parametr max připojení (mimo jiné). Pro postgres místo toho mám na svém blogu článek, který vysvětluje, jak jej optimalizovat, který pro vás může být užitečný nebo který můžete použít jako referenci pro vaši databázi:

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

      Zdravím.

  9.   Erickson vasquez řekl

    Dobrý den, když hodím první příkaz, ukazuje mi hodnotu 0. Co by to mohlo být?

  10.   Daniel Ojeda řekl

    Děkuji za tento příspěvek.

  11.   Rolando Aguilera Salazar řekl

    Jak dobrý manuál, tyto informace jsou součástí toho, co hledám... díky!

    Ale teď, pokud chci, aby při překročení těchto 250 návštěvníků přešel návštěvník 251 na čekající stránku nebo virtuální frontu, mohu to udělat ze stejné konfigurace?

    Zdravím a děkuji!