Apache'de eşzamanlı bağlantılar nasıl artırılır

Bugün sizlerle bir kez daha dünyanın en çok kullanılan web servislerinden biri hakkında konuşmaya geliyorum: Web sunucusu Apache2.

Bu, defalarca konuşulan bir konudur, ancak şimdi size bu hizmette hesaba katmanız gereken başka bir özellikten bahsetmeye geliyorum: Eşzamanlı bağlantı sınırı. Çok basit veya i7 işlemcili ve 32 GB ram olan bir uzay gemimiz olması fark etmez ...

Eşzamanlı bağlantıların sınırı, uygun önlemleri almadığımız sürece her zaman aynı olacaktır; bu, aynı anda birçok kişinin bağlanmasını istiyorsak, yalnızca iyi bir donanıma değil, aynı zamanda iyi bir yapılandırmaya da ihtiyaç duyacağımız anlamına gelir.

Bu durumda herhangi bir şey yüklemek gerekmez, her şey apache'yi yapılandırmak için dikkate alınması gereken basit kavramlara dayanır; Herhangi bir değişiklik yapmak istemeden önce çok net olması gereken kavramlar.

apache2_logo

Düşünülmesi gereken ilk şey şudur: Takımımın kapasitesi nedir? Mümkün olduğunca zorlarsam ekipmanım kaç eşzamanlı bağlantıyı destekleyebilir? Bütün bunlar tek bir faktöre bağlıdır; RAM (Rasgele Erişim Belleği).

RAM ne kadar büyükse, bağlantı sayısı o kadar fazla olur, ancak sabit bir değer (yani her X ram için X istemcisi) olmamasına rağmen, bu nedenle öncelikle web sunucumuzda bazı küçük hesaplamalar yapmak önemlidir. sınırlarımızı bilmek için.

Bilmeniz gereken ilk şey, her bir Apache bağlantısının ortalama olarak ne kadar RAM tükettiğidir, çünkü kurulan her bağlantı, sistemde belirli bir RAM tüketimini varsayar ... Açıkçası, tüm bağlantılar, bir kişinin yapmak zorunda olduğu aynı ram'ı tüketmez. bir medya ... Bunların tümü aşağıdaki komutla elde edilebilir:

ps -ylC apache2 --sort: rss | awk '{TOPLA + = 8 ABD doları; I + = 1} END {baskı TOPLA / I / 1024} '

Elde edilen sonuç megabayt olarak gösterilecek ve aktif bağlantıların sayısına, erişilen sayfaların türüne vb. Göre değişebilir. Bu nedenle testin farklı sekmeler açıkken yapılması tavsiye edilir; mümkünse her biri farklı içerik gösteriyor. Benim durumumda, örneğin, sonuç 9.5458 oldu ve bunu en üste yuvarlarsak 10 MB Bağlantı başına ortalama tüketilen RAM.

Ayrıca, sistemde aktif olan işlemlerin geri kalanı tarafından ne kadar RAM tüketildiğini bilmek de önemlidir, çünkü web hizmeti, işletim sisteminde çalışan tek hizmet değildir ve cihazda boş RAM belleği bırakmak gerekir. sunucu, görevlerin geri kalanını yürütebilsin. Bu, aşağıda gösterilen komutla elde edilebilir:

ps -N -ylC apache2 --sort: rss | awk '{TOPLA + = 8 ABD doları} SON {baskı TOPLAMI / 1024}'

Elde edilen sonuç megabayt olarak da gösterilecek ve bize işlemlerin geri kalanı tarafından tüketilen RAM miktarını oldukça kesin bir şekilde gösterecekti; benim durumumda 800 MB. Bu bilgilerle, sahip olabileceğimiz eşzamanlı bağlantıların sayısının genel bir hesaplamasını yapabiliriz; Çok basit bir işlemle elde edeceğimizi hesaplıyorum.

(RAMTOTAL - RAM_RESTOPROCESOS) / RAM_POR_CONNEXIÓN

Elimizdeki bu formül ile 4 GB RAM yani 4096 MB'lık bir bilgisayarımız olduğunu ve yukarıda belirtilen sonuçları bilgisayarımızın gösterdiğini düşünelim; hesaplama şöyle olacaktır:

(4096 - 800) / 10 = 329 eşzamanlı bağlantı

Bu hesaplamayla ilgili sorun, birinin çok aşırı olmasıdır, çünkü tüm RAM'i tüketir (sunucunun takas tüketmesini sağlar) ve ayrıca, MySQL veya başka bir veritabanı gibi bir veritabanına sahip olunması durumunda, buna yapılan bağlantılar da tüketir. RAM, yani elde edilen sayı ütopik bir sayı olarak nitelendirilebilir. Bu nedenle, belleği olası ek işlemler için boşaltmak ve ayrıca bir veri tabanına bağlantıların yürütülmesi olasılığını göz önünde bulundurmak için bağlantı sayısını azaltabiliriz. 250.

Artık maksimum sayıda eşzamanlı bağlantımıza sahip olduğumuza göre, bu çağrının yapılandırma dosyasında yapılan bu numarayı almak için Apache'yi hazırlamamız gerekir. apache2.confbarındırılan / etc / apache2.

Söz konusu dosya, aşağıdakilere dayalı bir yapı izler: modüller, her birine karşılık gelen adı var, ancak yalnızca adı olan biri ile ilgileneceğiz.  mpm_prefork_module. Söz konusu modül varsayılan olarak aşağıdaki verilere sahiptir:

StartServers 5 MinSpareServers 5 MaxSpareServers 10 MaxClients 150 MaxRequestsPerChild 0

Bu modülün bir dizi çok önemli parametresi var, ancak bizi özellikle ilgilendiren biri olmasına rağmen MaxClients. Bu parametre, maksimum eşzamanlı bağlantı sayısını belirtir ve şu şekilde değiştirilmelidir: 250.

Dikkate alınması gereken bir ayrıntı, söz konusu parametrede varsayılandan farklı bir değer belirtildiğinde, bundan hemen ÖNCE bir tane daha eklemek gerektiğidir. Bu parametre denir ServerLimit ve sunucunun, sınırın dışında olduğunda bile "tutabileceği" bağlantıların sınırını ayarlar.

ServerLimit parametresi her zaman MaxClients'tan biraz daha yüksek olmalıdır ve burada manevra için çok az yer olduğundan, bir limit 270. Bu, modülü şu şekilde gösterir:

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

Artık Apache hizmetini yalnızca şu komutu kullanarak yeniden başlatmak gerekli olacaktır: 

/etc/init.d/apache2 yeniden başlat

Bununla zaten optimize edilmiş web sunucumuzun keyfini çıkarabilirdik.

Selamlar.


Yorumunuzu bırakın

E-posta hesabınız yayınlanmayacak. Gerekli alanlar ile işaretlenmiştir *

*

*

  1. Verilerden sorumlu: Miguel Ángel Gatón
  2. Verilerin amacı: Kontrol SPAM, yorum yönetimi.
  3. Meşruiyet: Onayınız
  4. Verilerin iletilmesi: Veriler, yasal zorunluluk dışında üçüncü kişilere iletilmeyecektir.
  5. Veri depolama: Occentus Networks (AB) tarafından barındırılan veritabanı
  6. Haklar: Bilgilerinizi istediğiniz zaman sınırlayabilir, kurtarabilir ve silebilirsiniz.

  1.   zetatin dijo

    Gönderi için teşekkürler!

    1.    Ezgi dijo

      Yararlı bulduğuna sevindim.

      Selamlar.

  2.   Miguel Angel dijo

    Apache ve iki sunucu ile kümelenmenin bir yolu var, nasıl çalıştığını açıklayabilir misiniz?

    1.    Ezgi dijo

      Bununla ilgili bazı teori okumama rağmen, onu pratiğe hiç uygulamadım. Öyle olsa bile, belki de bu makale size bu konuda biraz rehberlik edebilir, ancak bunu uygulamaya koyma fırsatım olmadığını tekrar ediyorum:

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

    2.    Eduardo Celil dijo

      Uzun zamandır sordun, çözmediysen; Bir dosya sistemi olarak hareket eden üçüncü bir tarafla bir dengeleme planım var, var / www / html / (benim durumumda) içindeki klasörleri dosya sistemine yönlendiriyorsunuz, böylece aynı bilgileri paylaşıyorlar ve muhtemelen siz Apache'lerin ips'lerine yanıt veren ve yönlendiren sanal bir ip gerektirir, bunun için bir haproksi işgal edebilir ve yüksek kullanılabilirlikte olmasını istiyorsanız, birisinin düşmesi, diğerinin yanıt vermeye devam etmesi veya zaten varsa Uygulama için bir etki alanı, her iki sunucuya da arka uç yaparak dengeleyebilirsiniz, moodle veya mysql'deki bir veritabanına bağlanan belirli uygulamalar gibi belirli durumlar için, uygulama sunucusu başına aynı veritabanına işaret eden bir kullanıcı oluşturmanız gerekir. .

  3.   şamaru dijo

    Gönderi için çok teşekkür ederim, kesinlikle haklısınız, birincil hesaplama ram, ancak işlemcimizin üstesinden gelebileceği maksimum işlem sayısını da hesapladığımızı hayal ediyorum (tabii ki önce ana belleğin hesaplamasını yapıyoruz) ve diskin nasıl sabit olarak dağıtılacağı (Örnek bölümler / var = 1TR).

    1.    Ezgi dijo

      Haklısın; diğer şeylerin yanı sıra sıcaklık kontrolü gibi her şey önemlidir. Açıktır ki, güçlü bir işlemci aynı anda çok sayıda görevi büyük bir verimlilikle gerçekleştirebilir, ancak bu yazının amacı eşzamanlı bağlantıların sayısına göre RAM'in önemini açıklamaktı.

      Tüm bu faktörleri kontrol etmenin ve işlemcimizin doymuş olup olmadığını veya az boş RAM'imiz olup olmadığını görmenin iyi bir yolu, bir bash betiği kullanmak olabilir. Belki birkaç gün önce yaptığım bu gönderi senin için ilginç olacak, ki seni aşağıdaki linkte bırakıyorum; Bu küresel bir izlemedir ancak birisi için ilginç olabilir:

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

      selamlar

  4.   Sergio S. dijo

    Çok güzel not, çok teşekkür ederim!

    1.    Ezgi dijo

      Çok teşekkürler! Umarım bundan yararlanabilmişsindir.

  5.   palyaço dijo

    Salak olmak istemiyorum ...
    … Ancak bağlantı sayısını artırarak bir DDoS saldırısına daha açık bırakmazsınız?

    1.    Ezgi dijo

      Sakin bir soru değil. Gerçek şu ki, eşzamanlı bağlantıların sayısını artırarak, Apache'yi DDOS saldırılarına karşı kısmen güçlendiriyoruz, çünkü sunucuda kurulan maksimum eşzamanlı bağlantı sayısının toplam maksimum bağlantı sayısı olduğunu hesaba katmalısınız. tek bir kullanıcı. Böylece, başlangıçta yalnızca 150 eşzamanlı bağlantıyı destekleyebilirken (bunlar yasal bir kaynaktan gelen bağlantılar olsun ya da olmasın) artık sunucumuzun desteklediği kadarına güvenebiliriz ve aynı anda daha fazla sayıda bağlantıya ihtiyaç duymayabiliriz. hizmet. Açıktır ki, maksimum bağlantı sayısını artırmak, kendinizi bu tür saldırılardan korumanın bir yolu değildir, bunun yerine güvenlik duvarı ilkelerini uygulamanız gerekir. Örneğin, koymak istediğiniz web hizmeti internete maruz kalacaksa, uygulanabilecek bir güvenlik önlemi bu satırların güvenlik duvarımıza eklenmesi olacaktır:

      iptables -A GİRİŞ -p tcp –syn –dport 80 -m bağlantı sınırı –bağlantı sınırı-10 m duruma kadar –devlet YENİ -j KABUL

      iptables -A GİRİŞ -p tcp –dport 80 -m durum –devlet KURULU, İLGİLİ -j KABUL

      iptables -A GİRİŞ -p tcp -dport 80 -j DAMLA

      1.    palyaço dijo

        DDoS saldırılarının özelliklerinden biri, bir saldırganın paketleri birkaç farklı yönden gönderiyormuş gibi görünebilmesidir, bu da paket akışının yalnızca bir yönden gelmesini engeller.

    2.    Ezgi dijo

      Benim kurduğum gibi bir güvenlik duvarının, farklı kaynaklardan geldiği için bir DDOS saldırısına karşı çok etkili olmadığı konusunda haklısınız. Yine de, her bir kaynağın yüz veya daha fazla bağlantı kurabilmesi için, bu kaynakların her biri için bağlantı sayısını bir sınıra sahip olmamak yerine 10 ile sınırlandırmak daha iyidir.

      Her halükarda, sorunun kiti, sunucunun ne kadar çok eşzamanlı bağlantıyı desteklerse, DDOS saldırısıyla onu yıkmanın o kadar zor olacağı, bu da sayfanın bir saldırgan tarafından devrilmesini zorlaştıracağıdır. .

      Selamlar.

  6.   eliotime3000 dijo

    İyi. Şimdilik sahip olduğum VPS'ye işkence etmemek için sitemde NGINX ile devam ediyorum.

  7.   Bruno cascio dijo

    İyi gönderi @ Drassill!

    Yapılandırmadan belki daha istatistiksel bir şeyle katkıda bulunmak istedim.
    Tüketim parametresini hesaplamanın en kolay ve en hızlı yolu ortalama olmakla birlikte, belki daha titiz olabilir ve "ortalama" yerine "medyan" kullanabiliriz. Bizi ne kurtarır? Bir bağlantının çok fazla bellek tüketmesi durumunda sayıların artması. Örneğin, aşağıdaki değerleri istedikleri bellek biriminde (KB, MB, MiB, vb.) Kullanan aşağıdaki istemcileri varsayalım:

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

    Ortalama yaklaşık ~ 30 verir

    Ve bunun nedeni çok büyük bir sonucumuz var (150) ve hesaplamalar çılgınca. Medyan, bu verilerin sıralanması, örnek sayısının 2'ye (merkezimiz) bölünmesi ve ardından bu konumun numarasının elde edilmesinden oluşur. Bununla benzer bir şeye sahip olurduk

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

    Yani ortalamamız: 8/2 = 4 yani ~ 10

    Burada aşırılık ne kadar çılgınca olursa olsun, bize her zaman daha gerçekçi bir değer vereceğini görebilirsiniz. 200 tüketen bir müşteri eklersek, medyanımız 11 olurken, ortalama …… gidebilir.

    Bu sadece bir katkı ve çok tartışmalı, çünkü bağlantılarla vidalanmamış.

    İnsanları kucaklamak linuxera 🙂

  8.   Carlos dijo

    Merhaba, özel sunucumda bir sorun yaşadım ve gerçek zamanlı olarak google analytics'e göre yaklaşık 250 kişinin çevrimiçi yaklaştığı her seferinde sunucum çöküyor ve bağlantı kesilene kadar yavaşlıyor web sitesine giriyor ve çevrimiçi olarak bu sayıdan fazla kullanıcı yüklemiyor, ancak 8gb ram olan özel sunucunun performansını gördüğümde kullanımın% 10'unu, cpu: kullanımın% 5'ini ve sabit diskte:% 1.99 kullanım.
    Bana yardımcı olabilir misiniz? Ne yapacağımı bulamıyorum, bu adımları yapmak çözüm mü?

    1.    Ezgi dijo

      İyi Carlos.

      Tanımladığınız sorun, sunucu uygun şekilde hazırlanmadığında çok yaygındır. Sunucunuz muhtemelen çok daha az sayıda eşzamanlı bağlantıyı kabul edecek ve 250 bağlantıya ulaştığında çökecektir. Kılavuzu takip ederek sorunu çözebilmelisiniz, ancak bu sunucuda bir veritabanınız varsa, o veritabanını da optimize etmeniz gerekir.

      Selamlar.

      1.    Carlos dijo

        Drassill, bahsettiğiniz yapılandırmayı yaptım ve tatmin edici oldu, dün 280 kullanıcıya ulaştım ve sunucu takılmadı, bu sonuçtan çok memnunum ve bana söylediğin diğer şeyi de optimize etmek istiyorum veritabanı, ¿Bunu nasıl başarabilirim?

    2.    Ezgi dijo

      Veritabanı kavramı oldukça açıktır; mysql kullanmak postgres ile aynı şey değildir (örneğin). Açıkçası tüm veritabanlarını bilmiyorum; Mysql ve postgres'i denedim ve bunlardaki eşzamanlı bağlantıların artışı parametre max bağlantılarına bağlı olacaktır; mysql optimizasyonu /etc/my.conf dosyasında yapılır ve maksimum bağlantı parametresinin değiştirilmesi gerekir (diğerleri arasında). Bunun yerine postgres için, blogumda, sizin için yararlı olabilecek veya onu veritabanınız için referans olarak kullanabileceğinizi açıklayan bir makalem var:

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

      Selamlar.

  9.   Erickson vasquez dijo

    Merhaba, ilk komutu verdiğimde bana 0 değerini gösteriyor. Ne olabilir?

  10.   Daniel Ojeda dijo

    Bu gönderi için teşekkürler.

  11.   Rolando Aguilera Salazar dijo

    Ne güzel bir kılavuz, bu bilgi aradığım şeyin bir parçası... teşekkürler!

    Ama şimdi, bu 250 ziyaretçi aşıldığında, ziyaretçi 251'in bir bekleme sayfasına veya sanal kuyruğa gitmesini istersem, bunu aynı yapılandırmadan yapabilir miyim?

    Selamlar ve teşekkürler!