Kako povečati sočasne povezave v Apacheju

Danes se še enkrat pogovarjam z vami o eni najbolj uporabljenih spletnih storitev na svetu: spletnem strežniku Apache2.

To je tema, o kateri smo že večkrat govorili, zdaj pa vam želim povedati še eno funkcijo, ki jo je treba upoštevati pri tej storitvi: Omejitev hkratnih povezav. Vseeno je, ali imamo zelo osnovno ali vesoljsko ladjo s procesorjem i7 in 32 GB RAM-a ...

Omejitev hkratnih povezav bo vedno enaka, razen če bomo sprejeli ustrezne ukrepe, kar pomeni, da če želimo, da je hkrati povezanih veliko ljudi, ne bomo potrebovali le dobre strojne opreme, temveč tudi dobro konfiguracijo.

V tem primeru ni treba ničesar nameščati, vse temelji na preprostih konceptih, ki jih je treba upoštevati pri konfiguraciji apache; koncepti, ki morajo biti zelo jasni, preden želite spremeniti.

logotip apache2

Najprej je treba pomisliti: Kakšno sposobnost ima moja ekipa? Koliko hkratnih povezav lahko podpira moja oprema, če jo prisilim čim več? Vse to je odvisno od enega samega dejavnika; RAM (pomnilnik z naključnim dostopom).

Večji kot je RAM, večje je število povezav, čeprav ni fiksne vrednosti (to je X odjemalcev za vsak X ram), zato je najprej pomembno, da na našem spletnem strežniku opravimo nekaj majhnih izračunov, pri čemer da bi spoznali svoje meje.

Najprej morate vedeti, koliko RAM-a v povprečju porabi vsako povezavo z Apachejem, saj vsaka vzpostavljena povezava predvideva določeno porabo RAM-a v sistemu ... Očitno ne porabijo vse povezave istega RAM-a, s katerim bi morali naredite medij ... Vse to lahko dobite z naslednjim ukazom:

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

Dobljeni rezultat bi bil predstavljen v megabajtih in se lahko razlikuje glede na število aktivnih povezav, vrsto dostopanih strani itd ... Zaradi tega je priporočljivo preizkus izvesti z odprtimi različnimi zavihki; vsak od njih po možnosti prikazuje drugačno vsebino. V mojem primeru je na primer rezultat znašal 9.5458, kar bi bilo, če bi ga zaokrožili na vrh 10 MB RAM, porabljen v povprečju na povezavo.

Pomembno je tudi vedeti, koliko RAM-a porabijo ostali procesi, ki so aktivni v sistemu, saj spletna storitev ni edina, ki deluje v operacijskem sistemu, zato je treba prosti pomnilnik RAM-a pustiti na strežnik, da lahko izvede preostale naloge. To lahko dobite z spodnjim ukazom:

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

Dobljeni rezultat bi bil predstavljen tudi v megabajtih in bi nam pokazal precej natančno količino RAM-a, ki ga porabijo ostali procesi; v mojem primeru 800 MB. S temi informacijami bi lahko naredili splošen izračun števila sočasnih povezav, ki bi jih lahko imeli; Izračunam, da bi to dobili z zelo preprostim postopkom.

(RAMTOTAL - RAM_RESTOPROCESOS) / RAM_POR_CONNEXIÓN

S to formulo v roki si predstavljajmo, da imamo računalnik s 4 GB RAM-a, to je 4096 MB in da je naš računalnik pokazal prej omenjene rezultate; izračun bi bil:

(4096 - 800) / 10 = 329 hkratnih povezav

Težava pri tem izračunu je v tem, da je ena preveč ekstremna, saj bi porabila ves RAM (zaradi česar strežnik porabi zamenjavo) in tudi, če bi imela bazo podatkov, kot je MySQL ali katera koli druga, bi tudi povezave z njo porabile RAM-a, tako da bi lahko pridobljeno številko opredelili kot utopično številko. Da bi sprostili pomnilnik za morebitne dodatne procese in tudi razmišljali o možnosti izvajanja povezav do baze podatkov, bi zmanjšali število povezav na 250.

Zdaj, ko imamo največje število hkratnih povezav, bi morali Apache pripraviti na sprejem te številke, kar se naredi v konfiguracijski datoteki tega klica apache2.conf, ki gostuje v / etc / apache2.

Zadevna datoteka sledi strukturi, ki temelji na moduli, vsak s svojim ustreznim imenom, vendar bi nas zanimal le eden izmed njih, ki mu je ime  mpm_prefork_module. Zadevni modul ima privzeto naslednje podatke:

StartServers 5 MinSpareServers 5 MaxSpareServers 10 MaxClients 150 MaxRequestsPerChild 0

Ta modul ima vrsto zelo pomembnih parametrov, čeprav obstaja eden izmed njih, ki bi nas še posebej zanimal, imenovan Maxclients. Ta parameter določa največje število sočasnih povezav in ga je treba spremeniti v 250.

Upoštevati je treba še eno podrobnost: če je v navedenem parametru navedena vrednost, ki ni privzeta, je treba dodati še eno, šele pred tem. Ta parameter se imenuje ServerLimit in nastavi mejo povezav, ki bi jo strežnik lahko "zadržal", tudi če je zunaj omejitve.

Parameter ServerLimit mora biti vedno nekoliko višji od MaxClients in tu je, ker je manevrskega prostora malo, meja 270. Tako bi modul izgledal takole:

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

Zdaj bi bilo treba znova zagnati storitev Apache z ukazom: 

/etc/init.d/apache2 znova zaženi

S tem bi lahko že uživali v našem optimiziranem spletnem strežniku.

Lep pozdrav.


22 komentarja, pustite svojega

Pustite svoj komentar

Vaš e-naslov ne bo objavljen. Obvezna polja so označena z *

*

*

  1. Za podatke odgovoren: Miguel Ángel Gatón
  2. Namen podatkov: Nadzor neželene pošte, upravljanje komentarjev.
  3. Legitimacija: Vaše soglasje
  4. Sporočanje podatkov: Podatki se ne bodo posredovali tretjim osebam, razen po zakonski obveznosti.
  5. Shranjevanje podatkov: Zbirka podatkov, ki jo gosti Occentus Networks (EU)
  6. Pravice: Kadar koli lahko omejite, obnovite in izbrišete svoje podatke.

  1.   zetatin je dejal

    Hvala za prispevek!

    1.    drassill je dejal

      Vesel sem, da se vam je zdel koristen.

      Lep pozdrav.

  2.   Miguel Angel je dejal

    Obstaja način združevanja z Apachejem in dvema strežnikoma, ali lahko razložite, kako to deluje?

    1.    drassill je dejal

      Čeprav sem o tem prebral nekaj teorije, je nisem nikoli uporabil v praksi. Kljub temu vam bo morda ta članek dal nekaj napotkov v zvezi s tem, čeprav ponavljam, da tega nisem imel priložnosti uresničiti:

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

    2.    Edward Khalil je dejal

      nekaj časa ste prosili, če niste rešili; Imam shemo uravnoteženja s tretjo osebo, ki deluje kot datotečni sistem, mape, ki so v var / www / html / (v mojem primeru), usmerite v datotečni sistem, tako da si delijo iste podatke in verjetno boste tudi vi potrebujete navidezni ip, ki se odziva in preusmeri na ips apacha, za to lahko zasedete haproxy in če ga želite imeti v visoki razpoložljivosti, lahko integrirate keepalive, če eden pade, se drugi še naprej odziva ali pa tudi, če že imate domeno za aplikacijo, lahko uravnotežite s funtom, ki dela zapornice na obeh strežnikih, za posebne primere, kot so moodle ali nekatere aplikacije, ki se povežejo z bazo podatkov v mysqlu, bi morali ustvariti uporabnika na strežnik aplikacij, ki kaže na isto bazo podatkov .

  3.   šamaru je dejal

    Najlepša hvala za prispevek, imate popolnoma prav, ram je primarni izračun, čeprav si predstavljam, da izračunamo tudi največje število procesov, ki jih lahko obdela naš procesor (seveda najprej opravimo izračun glavnega pomnilnika) in kako bi bil disk trdo distribuiran (Primer particij / var = 1TR).

    1.    drassill je dejal

      Prav imaš; vse je pomembno, med drugim tudi nadzor temperature. Očitno lahko zmogljiv procesor hkrati z veliko učinkovitostjo opravlja večje število nalog, vendar je bil cilj tega prispevka pojasniti pomen RAM-a glede na število hkratnih povezav.

      Dober način za nadzor vseh teh dejavnikov in ugotavljanje, ali naš procesor ni nasičen ali imamo malo prostega RAM-a, je uporaba bash skripta. Mogoče vam bo zanimiva ta objava, ki sem jo pred dnevi o njej objavil, kar vam zapuščam na naslednji povezavi; Gre za globalno spremljanje, vendar je morda za koga zanimivo:

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

      pozdrav

  4.   Sergio S. je dejal

    Zelo dobra nota, najlepša hvala!

    1.    drassill je dejal

      Najlepša hvala! Upam, da ste to lahko izkoristili.

  5.   klovn je dejal

    Nočem biti kreten ...
    ... Toda s povečanjem števila povezav ne postanete bolj ranljivi za napad DDoS?

    1.    drassill je dejal

      To ni tiho vprašanje o kretenu. Resnica je, da s povečanjem števila hkratnih povezav Apache deloma okrepimo pred napadi DDOS, saj morate upoštevati, da je število največjih hkratnih povezav, vzpostavljenih na strežniku, skupno število največ povezav, ne tistih, ki prihajajo iz en uporabnik. Torej, medtem ko smo na začetku lahko podpirali le 150 sočasnih povezav (ne glede na to, ali gre za povezave iz zakonitega vira ali ne), lahko zdaj računamo na toliko, kolikor jih podpira naš strežnik, kar zahteva večje število povezav hkrati brez storitev. Očitno je, da povečanje največjega števila povezav ni način za zaščito pred tovrstnimi napadi, ampak bi bilo treba uvesti politike požarnega zidu. Če bo na primer spletna storitev, ki jo želite postaviti, izpostavljena internetu, bi bil varnostni ukrep, ki bi ga lahko izvedli, dodajanje teh vrstic našemu požarnemu zidu:

      iptables -A INPUT -p tcp –syn –dport 80 -m connlimit –connlimit-up to 10 -m state –state NEW -j ACCEPT

      iptables -A INPUT -p tcp –dport 80 -m state - state VZPOSTAVLJENO, POVEZANO -j SPREJEM

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

      1.    klovn je dejal

        Ena od značilnosti napadov DDoS je, da se zdi, da napadalec pošilja pakete iz več različnih smeri, kar preprečuje, da tok paketov prihaja samo iz ene smeri.

    2.    drassill je dejal

      Prav imate v smislu, da požarni zid, kakršnega sem nastavil, ni preveč učinkovit proti napadu DDOS, saj prihaja iz različnih virov. Kljub temu je bolje omejiti število povezav na 10 za vsakega od teh virov, namesto da bi imeli omejitev, tako da lahko vsak vir vzpostavi sto ali več povezav.

      Vsekakor je sklop vprašanja v tem, da več hkratnih povezav, kot jih strežnik podpira, težje ga bo odstraniti z napadom DDOS, kar bi napadalcu otežilo odstranitev strani .

      Lep pozdrav.

  6.   eliotime3000 je dejal

    Dobro. Za zdaj nadaljujem z NGINX-om na svoji spletni strani, da ne bi mučil VPS-a, ki ga imam.

  7.   Bruno cascio je dejal

    Dober prispevek @Drassill!

    Želel sem prispevati nekaj bolj statističnega od konfiguracije.
    Čeprav je najlažji in najhitrejši način za izračun parametra porabe srednja vrednost, bi lahko bili bolj strogi in bi namesto "srednje vrednosti" uporabili "srednjo vrednost". Česa bi nas rešil? Da se številke izklopijo, če je povezava porabila veliko pomnilnika. Recimo na primer naslednje odjemalce, ki v enoti, ki jo potrebujejo pomnilnik (KB, MB, MiB itd.), Porabijo naslednje vrednosti:

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

    Povprečje bi dalo približno ~ 30

    In to zato, ker imamo zelo velik konec (150), izračuni pa so nori. Mediana je sestavljena iz urejanja teh podatkov, deljenja števila vzorcev z 2 (naše središče) in nato pridobivanja števila tega položaja. S tem bi imeli nekaj takega

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

    Tako bi bila naša srednja vrednost: 8/2 = 4, to je ~ 10

    Tu lahko vidite, da ne glede na to, kako nor je skrajnost, nam bo vedno dal bolj realno vrednost. Če dodamo kupca, ki porabi 200, bo naša mediana enaka 11, povprečje pa lahko znaša …….

    To je samo prispevek in je zelo diskutabilen, saj s povezavami ni zajeban.

    Objemite ljudi linuxera 🙂

  8.   Carlos je dejal

    Pozdravljeni, imel sem težavo na svojem namenskem strežniku in to je, da vsakič, ko se približa število približno 250 ljudi na spletu, se v skladu z Googlovo analitiko v realnem času moj strežnik, kot da propade, in povezava postane počasna, dokler ne prekine povezave na spletno mesto in nikoli ne naloži več kot to število uporabnikov na spletu, toda ko vidim zmogljivost namenskega strežnika, ki je 8 GB RAM-a, prikaže 10% uporabe, procesor: 5% uporabe in trdi disk: 1.99% uporabe.
    Mi lahko pomagaš? Ne najdem, kaj naj storim, ali je izvajanje teh korakov rešitev?

    1.    drassill je dejal

      Dober Carlos.

      Težava, ki jo opisujete, je zelo pogosta, če strežnik ni pravilno pripravljen. Vaš strežnik bo verjetno sprejel veliko manjše število hkratnih povezav in ko bo dosegel 250 povezav, se bo zrušil. Po navodilih bi morali težavo rešiti, čeprav bi morali imeti bazo podatkov na tem strežniku tudi bazo podatkov.

      Lep pozdrav.

      1.    Carlos je dejal

        Drassill, opravil sem konfiguracijo, ki ste jo omenili, in je bila zadovoljiva, včeraj sem dosegel 280 uporabnikov v spletu in strežnik ni visel, zelo sem zadovoljen s tem rezultatom in želim narediti še tisto, kar mi naročite, da optimiziram zbirko podatkov, ¿Kako to dosežem?

    2.    drassill je dejal

      Koncept baze podatkov je precej odprt; uporaba mysqla ni isto kot postgres (na primer). Očitno ne poznam vseh baz podatkov; Preizkusil sem mysql in postgres in povečanje hkratnih povezav v njih bi temeljilo na parametru max connections; mysql optimizacijo bi izvedli v /etc/my.conf in morali spremeniti parameter max connections (med drugim). Namesto tega imam v svojem spletnem dnevniku članek, v katerem je razloženo, kako ga optimizirati, kar vam lahko koristi ali ki ga lahko uporabite kot referenco za svojo bazo podatkov:

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

      Lep pozdrav.

  9.   Erickson vasquez je dejal

    Pozdravljeni, ko vržem prvi ukaz, se mi prikaže vrednost 0. Kaj bi lahko bilo?

  10.   Daniel Ojeda je dejal

    Hvala za to objavo.

  11.   Rolando Aguilera Salazar je dejal

    Kako dober priročnik, te informacije so del tega, kar iščem ... hvala!

    Ampak zdaj, če želim, da ko je teh 250 obiskovalcev preseženih, gre obiskovalec 251 na čakalno stran ali navidezno čakalno vrsto, ali lahko to storim iz te iste konfiguracije?

    Lep pozdrav in hvala!