Hur man ökar samtidiga anslutningar i Apache

Idag kommer jag att prata med dig en gång till om en av de mest använda webbtjänsterna i världen: webbservern Apache2.

Det är ett ämne som har pratats om många gånger, men nu kommer jag att berätta om en annan funktion att ta hänsyn till med den här tjänsten: Gränsen för samtidiga anslutningar. Det spelar ingen roll om vi har väldigt grundläggande eller ett rymdskepp med en i7-processor och 32 GB ram ...

Gränsen för samtidiga anslutningar kommer alltid att vara densamma såvida vi inte vidtar lämpliga åtgärder, vilket innebär att om vi vill ha många personer anslutna samtidigt behöver vi inte bara bra hårdvara utan också en bra konfiguration.

I det här fallet är det inte nödvändigt att installera någonting, allt är baserat på enkla begrepp som måste beaktas för att konfigurera apache; begrepp som måste vara mycket tydliga innan du vill göra några ändringar.

apache2_logotyp

Det första att tänka på är: Vilken kapacitet har mitt team? Hur många samtidiga anslutningar kan min utrustning stödja om jag tvingar den så mycket som möjligt? Allt detta beror på en enda faktor; RAM (Random Access Memory).

Ju större RAM, desto större antal anslutningar, även om det inte finns något fast värde (det vill säga X-klienter för varje X-ram), är det först och främst viktigt att göra några små beräkningar på vår webbserver, med för att känna till våra gränser.

Det första du bör veta är hur mycket RAM i genomsnitt varje förbindelse till Apache förbrukar, eftersom varje anslutning som upprättas antar en viss RAM-förbrukning i systemet ... Uppenbarligen förbrukar inte alla anslutningar samma RAM, som man skulle behöva göra ett media ... Allt detta kan erhållas med följande kommando:

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

Det erhållna resultatet kan representeras i megabyte och kan variera beroende på antalet aktiva anslutningar, vilken typ av sidor som nås, osv ... Därför är det lämpligt att utföra testet med olika öppna flikar; var och en av dem visar om möjligt olika innehåll. I mitt fall, till exempel, har resultatet varit 9.5458, som om vi rundar upp till toppen skulle vara 10 MB RAM förbrukas i genomsnitt per anslutning.

Det är också viktigt att veta hur mycket RAM som konsumeras av resten av processerna som är aktiva i systemet, eftersom webbtjänsten inte är den enda som körs i operativsystemet och det är nödvändigt att lämna ledigt RAM-minne på servern så att den kan köras resten av uppgifterna. Detta kan erhållas med kommandot nedan:

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

Det erhållna resultatet skulle också representeras i megabyte, och det skulle visa oss ganska exakt hur mycket RAM som konsumeras av resten av processerna; i mitt fall 800 MB. Med denna information kan vi göra en allmän beräkning av antalet samtidiga anslutningar som vi kan ha; Jag beräknar att vi skulle få genom en mycket enkel operation.

(RAMTOTAL - RAM_RESTOPROCESOS) / RAM_POR_CONNEXIÓN

Med denna formel i handen, låt oss föreställa oss att vi har en dator med 4 GB RAM, det vill säga 4096 MB och att vår dator har visat ovanstående resultat; beräkningen skulle vara:

(4096 - 800) / 10 = 329 samtidiga anslutningar

Problemet med denna beräkning är att man är för extrem, eftersom den skulle förbruka allt RAM-minne (vilket gör att servern förbrukar byte) och även om det finns en databas, som MySQL eller något annat, skulle anslutningarna till den också förbruka RAM, så det erhållna antalet kan kvalificeras som ett utopiskt nummer. För att frigöra minnet för eventuella ytterligare processer och även överväga möjligheten att anslutningar till en databas körs skulle vi därför minska antalet anslutningar till 250.

Nu när vi har vårt maximala antal samtidiga anslutningar, måste vi förbereda Apache för att ta emot detta nummer, vilket görs i konfigurationsfilen för detta samtal apache2.conf, som är värd för / etc / apache2.

Filen i fråga följer en struktur baserad på moduler, var och en med motsvarande namn, men vi skulle bara vara intresserade av en av dem, vars namn är  mpm_prefork_module. Modulen i fråga har som standard följande data:

StartServrar 5 MinSpareServrar 5 MaxSpareServrar 10 MaxKlienter 150 MaxFörfrågningarPerChild 0

Den här modulen har en serie mycket viktiga parametrar, även om det finns en av dem som skulle intressera oss särskilt Maxclients. Denna parameter anger det maximala antalet samtidiga anslutningar och ska ändras till 250.

En detalj att komma ihåg är att när ett annat värde än standardvärdet anges i nämnda parameter är det nödvändigt att lägga till ytterligare ett precis innan den här. Denna parameter kallas ServerLimit och anger gränsen för anslutningar som servern kan "hålla" även när den är utanför gränsen.

ServerLimit-parametern måste alltid vara något högre än MaxClients och här, eftersom det finns lite handlingsutrymme, en gräns på 270. Detta skulle få modulen att se ut så här:

StartServrar 5 MinSpareServrar 5 MaxSpareServrar 10 ServerLimit 270 MaxKlienter 250 MaxFörfrågningarPerChild 0

Nu skulle det bara vara nödvändigt att starta om Apache-tjänsten med kommandot: 

/etc/init.d/apache2 omstart

Med detta kunde vi redan njuta av vår optimerade webbserver.

Hälsningar.


Innehållet i artikeln följer våra principer om redaktionell etik. Klicka på för att rapportera ett fel här.

21 kommentarer, lämna din

Lämna din kommentar

Din e-postadress kommer inte att publiceras.

*

*

  1. Ansvarig för uppgifterna: Miguel Ángel Gatón
  2. Syftet med uppgifterna: Kontrollera skräppost, kommentarhantering.
  3. Legitimering: Ditt samtycke
  4. Kommunikation av uppgifterna: Uppgifterna kommer inte att kommuniceras till tredje part förutom enligt laglig skyldighet.
  5. Datalagring: databas värd för Occentus Networks (EU)
  6. Rättigheter: När som helst kan du begränsa, återställa och radera din information.

  1.   zetatin sade

    Tack för inlägget!

    1.    Drassill sade

      Jag är glad att du tyckte att det var användbart.

      Hälsningar.

  2.   Miguel Angel sade

    Det finns ett sätt att klustera Apache och två servrar. Kan du förklara hur det fungerar?

    1.    Drassill sade

      Även om jag har läst en del teori om det, har jag aldrig använt det för att träna. Ändå kanske den här artikeln kan ge dig lite vägledning i detta avseende, även om jag upprepar att jag inte har haft möjlighet att omsätta den i praktiken:

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

    2.    Edward Khalil sade

      Du har länge frågat om du inte har löst det; Jag har ett balanseringsschema med en tredje part som fungerar som ett filsystem, du pekar mapparna som finns i var / www / html / (i mitt fall) till filsystemet, så att de delar samma information, och du kommer möjligen kräva en virtuell ip som svarar och omdirigerar till ips av apacherna, för detta kan du ockupera en haproxy och om du vill ha den i hög tillgänglighet kan du integrera keepalive om en faller, den andra fortsätter att svara, eller också om du redan har en domän för applikationen, du kan balansera med pund som gör backends till båda servrarna, för specifika fall som moodle eller vissa applikationer som ansluter till en databas i mysql, måste du skapa en användare per appserver som pekar på samma databas .

  3.   shamaru sade

    Tack så mycket för inlägget, du har helt rätt, ram är den primära beräkningen, även om jag föreställer mig att vi också beräknar det maximala antalet processer som vår processor kan hantera (naturligtvis först göra beräkningen av huvudminnet) och hur skivan skulle fördelas hård (Exempel på partitioner / var = 1TR).

    1.    Drassill sade

      Du har rätt; allt är viktigt, som bland annat temperaturkontroll. Uppenbarligen kan en kraftfull processor utföra ett större antal uppgifter samtidigt med stor effektivitet, men målet med det här inlägget var att förklara vikten av RAM med avseende på antalet samtidiga anslutningar.

      Ett bra sätt att kontrollera alla dessa faktorer och se om vår processor inte är mättad eller om vi har lite ledigt RAM, skulle vara att använda ett bash-skript. Kanske det här inlägget som jag gjorde för några dagar sedan om det är intressant för dig, vilket jag lämnar dig i följande länk; Det är en global övervakning men det kan vara intressant för en:

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

      hälsningar

  4.   Sergio S. sade

    Mycket bra not, tack så mycket!

    1.    Drassill sade

      Tack så mycket! Jag hoppas att du har kunnat dra nytta av det.

  5.   clown sade

    Jag vill inte bli en idiot ...
    ... Men genom att öka antalet anslutningar lämnar du inte mer sårbarhet för en DDoS-attack?

    1.    Drassill sade

      Det är ingen tyst cretinfråga. Sanningen är att genom att öka antalet samtidiga anslutningar stärker vi delvis Apache mot DDOS-attacker, eftersom du måste ta hänsyn till att antalet maximala samtidiga anslutningar som är etablerade på servern är antalet totala maximala anslutningar, inte de som kommer från en enskild användare. Medan vi i början bara kunde stödja 150 samtidiga anslutningar (oavsett om de är anslutningar från en legitim källa eller inte) kan vi alltså räkna med så många som vår server stöder, vilket kräver ett större antal anslutningar samtidigt för att vara kvar utan service. Att öka det maximala antalet anslutningar är självklart inte ett sätt att skydda dig från denna typ av attack, utan snarare brandväggspolicyer bör genomföras. Om till exempel den webbtjänst som du vill placera kommer att exponeras för internet skulle en säkerhetsåtgärd som skulle kunna genomföras vara tillägget av dessa rader till vår brandvägg:

      iptables -A INPUT -p tcp –syn –port 80 -m connectlimit –connlimit-upto 10 -m state –state NEW -j ACCEPT

      iptables -A INPUT -p tcp –port 80 -m state –state ESTABLISHED, RELATED -j ACCEPT

      iptables -A INPUT -p tcp –port 80 -j DROP

      1.    clown sade

        En av kännetecknen för DDoS-attacker är att en angripare kan se ut att skicka paket från flera olika riktningar, vilket förhindrar att flödet av paket bara kommer från en riktning.

    2.    Drassill sade

      Du har rätt i den meningen att en brandvägg som den jag har skapat inte är särskilt effektiv mot en DDOS-attack, eftersom den kommer från olika källor. Ändå är det bättre att begränsa antalet anslutningar till 10 för var och en av dessa källor snarare än att inte ha en gräns, så att varje källa kan upprätta hundra anslutningar eller mer.

      I vilket fall som helst är frågan om att ju mer samtidiga anslutningar servern stöder, desto svårare blir det att slå ner den med en DDOS-attack, vilket skulle göra det svårare för sidan att slå ner av en angripare.

      Hälsningar.

  6.   eliotime3000 sade

    Bra. För närvarande fortsätter jag med NGINX på min webbplats för att inte tortera den VPS jag har.

  7.   Bruno cascio sade

    Trevligt inlägg @Drassill!

    Jag ville bidra med något kanske mer statistiskt än konfiguration.
    Även om det enklaste och snabbaste sättet att beräkna förbrukningsparametern är med medelvärdet, kanske vi kan vara strängare och använda "medianen" istället för "medelvärdet". Vad skulle rädda oss? Att siffrorna skjuter upp om en anslutning har förbrukat mycket minne. Antag till exempel att följande klienter som förbrukar följande värden i den enhet de vill ha (KB, MB, MiB, etc):

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

    Genomsnittet skulle ge ca ~ 30

    Och detta för att vi har en mycket stor extremitet (150), och beräkningarna är galna. Medianen består av att beställa dessa data, dela antalet prover med 2 (vårt centrum) och sedan erhålla numret på den positionen. Med detta skulle vi ha något liknande

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

    Så vårt medelvärde skulle vara: 8/2 = 4 det vill säga ~ 10

    Här kan du se att oavsett hur galet det extrema kan vara, det kommer alltid att ge oss ett mer realistiskt värde. Om vi ​​lägger till en kund som konsumerar 200 blir vår median 11, medan genomsnittet kan gå till …….

    Det är bara ett bidrag och det är mycket diskutabelt, för med anslutningarna är det inte skruvat.

    Kram människor linuxera 🙂

  8.   Carlos sade

    Hej, jag har haft ett problem på min dedikerade server, och det är att varje gång antalet cirka 250 personer online närmar sig, enligt google analytics i realtid, så ser min server ut att den kollapsar och anslutningen blir långsam tills den tappar anslutningen till webbplatsen och laddar aldrig upp fler än det antalet användare online, men när jag ser prestandan för den dedikerade servern som är 8 GB RAM visar den 10% av användningen, cpu: 5% av användningen och hårddisken i: 1.99 % av användningen.
    Kan du hjälpa mig? Jag hittar inte vad jag ska göra, är lösningen att göra dessa steg?

    1.    Drassill sade

      Bra Carlos.

      Problemet du beskriver är mycket vanligt när servern inte är ordentligt förberedd. Din server kommer antagligen att acceptera ett mycket mindre antal samtidiga anslutningar och när den når 250 anslutningar kommer den att krascha. Genom att följa manualen borde du kunna lösa problemet, men om du har en databas på den servern måste du också optimera den databasen.

      Hälsningar.

      1.    Carlos sade

        Drassill, jag har gjort den konfiguration du nämnde och den har varit tillfredsställande, igår nådde jag 280 användare online och servern kraschade inte, jag är väldigt nöjd med detta resultat, och jag vill också göra det andra du säger till mig för att optimera databasen, ¿ Hur uppnår jag detta?

    2.    Drassill sade

      Databaskonceptet är ganska öppet; att använda mysql är inte detsamma som postgres (till exempel). Självklart känner jag inte till alla databaser; Jag har provat mysql och postgres, och ökningen av de samtidiga anslutningarna i dessa skulle baseras på parametern max-anslutningar; mysql optimering skulle göras i /etc/my.conf och parametern max anslutningar måste ändras (bland andra). För postgres istället har jag en artikel på min blogg som förklarar hur man optimerar den som kan vara användbar för dig eller som du kan använda som referens för din databas:

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

      Hälsningar.

  9.   Erickson vasquez sade

    Hej, när jag slänger det första kommandot visar det mig värde 0. Vad kan det vara?

  10.   Daniel Ojeda sade

    Tack för det här inlägget.