Ne zaman NGinx'e geçmeliyim?


11

Apache üzerinden çalışan birkaç alan ve uygulama içeren bir sunucum var. Şu anda her şey iyi, ancak test için sunucumdan başlayarak, belki de hazır olduğunda bir kez sadece bu uygulama için ayrı bir sunucu elde etmek için bazı çok performans yoğun web uygulamaları (CPPCMS ile C ++ kullanarak) geliştirmeyi planlıyorum.

Her neyse, NGinx hakkında çok şey duydum, bu Apache'den daha performanslı görünüyor, bu yüzden kendime bu yeni proje için onunla çalışmaya değip değmeyeceğini soruyordum. Aklımda net değil çünkü NGinx'in tam olarak nasıl bir performans darboğazı düzelttiğini bilmiyorum.

Ben bir Apache güç kullanıcısı değilim, fakir bir linux yöneticisiyim ve web uygulamaları çok fazla geliştirmiyorum (ama kavramlarım var). Ben çoğunlukla yazılım yazmaya adanmışım, bu yüzden web sunucusu kısmı bazen bana çok belirsiz. Bir web sitesini apach yoluyla yapılandırmam gerektiğinde, her şeyi kırmadığımdan emin olmak için dokümana göz atarak çok fazla zamana ihtiyacım var.

Olduğu söyleniyor, bence bu tarafta çok daha iyiye gidiyorum ama yine de tavsiyeye ihtiyacım var. Bazı nginx yapılandırma dosyaları görüyorum ve bu Apache olanlardan çok daha anlaşılır görünüyor, ama belki yanılıyorum?

Topladığım bilgilerden, yük dengeleme istediğinizde NGinx en iyi seçim olacaktır, bu yüzden uygulamanız birkaç makineye yayılmışsa, değil mi? Korkutucu (ve performans) için başvurumu düşündüğüm gibi, ihtiyacım olan şey gibi görünüyor, ama belki de Apache'den NGinx'e taşınmanın ne zaman ilginç olduğu hakkında daha fazla şey bilmem gerekiyor. Mevcut tüm uygulamalarım için de NGinx'e geçmeye değer mi? Fiyatı ne kadar? (Yani, birinden diğerine geçmek zaman pahalı mı?) Apache ve NGinx'i aynı makinede sorunsuz bir şekilde kullanabilir miyim?

Yan not : Lütfen beni C ++ yerine yorumlanmış dilleri kullanmaya çağırmayın, bu soru ile ilgili değildir. Ne tür bir uygulamanın bundan yararlanabileceğini görmek için CPPCSM gerekçesi sayfasına bakın. Dezavantajları mükemmel bir şekilde anlıyorum (Ruby ve Python'daki uygulamalara kıyasla, daha az güce aç webapps için kullandığım) ve bununla iyiyim.

Yanıtlar:


10

Birkaç puan:

Apache ve Nginx veya Lighttpd arasındaki en büyük fark (kişisel olarak çok sevdiğim) mimaridir:

  1. Apache, işlem başına veya iş parçacığı başına bir bağlantı işler (mod-XYZ'ye bağlı olarak)
  2. Nginx ve Lighttpd tek olay döngüsünde tek iş parçacıklı çoklu bağlantılardır.

Sonuç olarak:

  1. Nginx ve Lighttpd çok sayıda eşzamanlı bağlantı altında çok daha iyi ölçeklendiriyor, diyelim 1000 bağlantı ile Apache mod-prefork'ta 1000 işlem veya mod-worker'de 1000 iş parçacığı gerektireceği için neredeyse ölecekti.

    Her bağlantının uzun sorgulamalı HTTP bağlantısı gerektirdiği Comet teknolojilerini kullanmayı planlıyorsanız, Apache iyi ölçeklenmediği için kabul edilemez.

  2. Nginx ve Lighttpd, her bağlantı + - iki yuva (HTTP ve FastCGI), ara bellek arabelleği ve bazı durumlar gerektirdiğinden, daha az bellek tüketirken, Apache yığın ve diğer şeyler de dahil olmak üzere tüm iş parçacığına ihtiyaç duyar.

Deneylerimdeki kişisel deneyimimden Lighttpd yaptım (ve ayrıca Nginx'in de FastCGI arka ucundan sonra Apache ile biraz daha hızlı olduğunu düşünüyorum, ancak bu düşük bağlantı sayısı içindir.

Şimdi başka bir nokta, FastCGI bağlantılarını kullanarak yük dengeleme yapmak istediğinizde.

Geleneksel mimaride

                               |
                              HTTP
                               |
         Balancer (Nginx/Lighttpd/Cherooke/something-else)
            /      |           |            |      \
         HTTP    HTTP         HTTP        HTTP     HTTP
         /         |           |            |         \
 Apache+PHP   Apache+PHP   Apache+PHP   Apache+PHP   Apache+PHP   
  Server 2    Server 3     Server 4      Server 5     Server 6

Apache, her biri mod-PHP (veya diğer modlar) çalıştıran işlem havuzlarını işlediğinden

Havuzları kendi başına işleyen CppCMS kullanırken farklı bir şey yapabilirsiniz:

                               |
                              HTTP
                               |
         Balancer (Nginx/Lighttpd/Cherooke/something-else)    
                           Server 1
            /      |           |            |      \
         FCGI    FCGI         FCGI        FCGI     FCGI
         /         |           |            |         \
    CppCMS App  CppCMS App  CppCMS App    CppCMS App  CppCMS App
     Server 2    Server 3     Server 4      Server 5     Server 6

Temel olarak başka bir dolaylama düzeyine ihtiyacınız yoktur çünkü CppCMS sizin için işlem, iş parçacığı ve bağlantı havuzunu işler. PHP / Ruby / Perl bazı Apache mod-XYZ'ye ihtiyaç duyarken veya kendi FastCGI bağlayıcısını kullanır.


+1 CppCMS yazarı tarafından güzel tam açıklama;) Tamam şimdi genel sorunu daha iyi görüyorum. Eğer doğru anlıyorsam, sadece bir sunucunuz (başlangıç ​​olarak) olduğu durumda HTTP-> Balancer-> FCGI-> CPPCMS olur. FastCGI'nin hızlı olmadığını söyleyen Jesper Mortensen'ın yorumları hakkında ne düşünüyorsunuz?
Klaim

@Klaim: Yukarıdaki mükemmel çizimlere bakın - bu mimaride FastCGI, her biri çok iş parçacıklı bir CppCMS örneği çalıştıran birden çok sunucu arasında ara bağlantı olarak kullanılır. FastCGI'nin nispi hızı bu durumda çok daha az önemlidir; alternatifleriniz HTTP, AJP ve 'hızlı' olmayan diğer ağ uyumlu protokoller olacaktır. Bu cevap muhtemelen kabul edilmiş olarak işaretlenmeli ve sorunuz düzenlenmiştir, çünkü bu gerçekten nginx'in buna değdiği zamanla ilgili değildir.
Jesper M

@Jesper Mortensen> Katılıyorum, ancak soruda hangi değişikliği tam olarak öneriyorsunuz?
Klaim

6

Genel olarak çok ( çok ) konuşan Nginx, web'e sayfa sunma sorununa farklı bir mimari yaklaşım sayesinde Apache'den çok daha yüksek verim elde edebilir. Nginx ayrıca öncelikle bir ters proxy olarak inşa edildi ve bu rolü olağanüstü derecede iyi dolduruyor (bu, bahsettiğiniz yük dengeleme bitidir); Apache ise, web sayfalarına hizmet etmek için oluşturuldu ve daha sonra proxy yapma yeteneği kazandı.

Bununla birlikte, Nachex'in sürekli olarak Apache'den daha iyi performans göstereceği diğerleri var, Apache'nin Nginx'ten sürekli olarak daha iyi performans göstereceği alanlar var.

Kısa cevap, Apache sizin için çalışıyorsa, geçişe gerek yoktur. (Ve bunu tamamen dönüştürülmüş bir Nginx öğrencisi olan eski bir Apache kullanıcısı olarak söylüyorum.) Yalnızca sunucunuza gelen trafik Apache'nin darboğaz haline geldiği seviyelere ulaştığında (bu, binlerce eşzamanlı bağlantı sırasına göre, ancak sunucu özelliklerinize ve diğer sunucu yükünüze bağlı olarak çılgınca değişecektir) veya Apache'yi neredeyse sığmayacağı kaynak açısından zayıf bir ortamda çalıştırmaya çalışıyorsanız, Nginx'e geçmek size sağlam bir fayda sağlar.

Bununla birlikte, Nginx'e geçmek istiyorsanız (ki bunu teşvik ediyorum!), O zaman gidin. Herhangi bir fayda görecek misin? 10 üzerinden 9 kez: Hayır, yapmayacaksın. Ancak Nginx'in yapılandırma dosyası dilini daha iyi sevdiğinizden bahsettiniz, bu yüzden Nginx'i yapılandırmak Apache'den daha rahat hissetmenizi sağlarsa, bu sizin için bir avantajdır! (Şahsen, Apache yapılandırmalarını genel olarak okumayı daha kolay buluyorum, ancak bunun nedeni, bunları okumak için uzun yıllar geçirdim ve Nginx için sadece birkaç kısa ay geçirdim!)

Bir yan notta: C ++ ile bir web uygulaması oluşturma isteğinizden bahsettiniz. Akıl sağlığınız için PHP, Python ve hatta Java gibi daha üst düzey bir dil kullanmanızı şiddetle tavsiye ediyorum. Daha sonra kodunuzu profil haline getirin ve belirli darboğazları ele almak için C ++ tabanlı modüller oluşturmayı düşünün (Python ve PHP buna oldukça izin verir; Java hakkında bilmiyorum). Genel performanstan endişe ediyorsanız, şunu düşünün: Dünyanın en büyük sabitlenmemiş MMORPG'si olan EVE Online, sadece C ++ ile yazılmış temel bileşenler (örn. Grafik kütüphaneleri) ile Python (Stackless Python) çeşidine dayanmaktadır. Python bunu halledebilirse, kesinlikle web uygulamanızı kaldırabilir mi?


+1 Teşekkürler. C ++ hakkında, Jesper Mortensen cevabı hakkındaki yorumuma bakın. Ayrıca, Python Eve Online'ın sunucu tarafında kullanılsa bile (bunu biliyorum, çok şey biliyorum), sadece oyun kodunu (büyük) yönetir ve diğer bazı bölümler aslında C ++ 'dadır. Grafik kodu istemci tarafındadır, bu nedenle C ++ bu tür grafik performansları için zorunludur. Dediğim gibi, neden seçtiğimi öğrenmek için CPPCMS Gerekçe sayfasına bakın. Tavsiyenizi takip edersem, başvuruma iki kez yazmam gerekirken, zaten çok aç olduğunu biliyorum. Ayrıca, dezavantajları anlıyorum ve onunla iyiyim.
Klaim

3

Kimse "ne zaman değiştirmeliyim" bölümüne gerçekten cevap veremez - yükünüze, kendi uygulama kodunuzun performansına vb.

NGinx, Apache'den daha performanslı görünüyor

nginx, olaylı G / Ç kullanarak tüm istemci bağlantılarını işlemek için tek bir işlem (veya çok az sayıda çalışan işlem) kullanır. Apache'nin birkaç "Çoklu İşlem Modülü" vardır, ancak hepsi çok sayıda işleme / birçok iş parçacığına daha fazla eğilir. Sonuç olarak, Apache temel HTTP bağlantısı işlemesi için genellikle nginx'ten daha fazla RAM ve CPU tüketecektir. Kegel'in C10K sayfasındaki farklı bağlantı yönetimi yaklaşımlarına genel bir bakış bulabilirsiniz .

performans açısından yoğun web uygulaması (CPPCMS ile C ++ kullanarak)

Temel web uygulamasını daha yüksek bir dilde (Python veya belki Ruby, Scala) yapmayı ve "performans yoğun" görevleri zaman uyumsuz olarak işleyen iş makinelerine iş biletleri göndermek için bir mesaj kuyruğu kullanmanızı şiddetle tavsiye ederim .

Yük dengeleme istediğinizde NGinx en iyi seçim olacaktır,

nginx iyi bir yük dengeleyicisidir; ancak bu alanda birçok seçenek var .

Apache ve NGinx'i aynı makinede sorunsuz bir şekilde kullanabilir miyim?

Evet. Bunları farklı IP bağlantı noktası numaralarında ve / veya IP adreslerinde çalıştırın.


"Temel web uygulamasını daha üst düzeyde bir dilde yapmayı şiddetle öneriyorum"> Bunun temel bir web uygulaması olduğunu söylemedim - o kadar da önemsiz değil. CPPCMS kullanma gerekçesini görürseniz, yazar faydalı olabilecek birkaç noktaya dikkat çeker ve ben bu durumlarda ben olurum. Diğer alternatifleri düşündüm ama C ++ ile gitmekten daha pahalı buldum, en azından yazdığım webapp türünde. Yani bu sorunun bir parçası değil. Ama size tavsiyelerinizi anlıyorum ve aynı şeyi web uygulamaları için C ++ kullanmaları gerekip gerekmediğini soran insanlara da veriyorum. Ayrıca Python'u daha basit bir uygulama için kullanmayı planlıyorum.
Klaim

Neyse, detaylar için +1.
Klaim

@Klaim: İyi ayarlanmış bir C # / Java uygulaması üzerinde iddia edilen "büyüklük sırası" performans iyileştirmesini gerçekleştirmek istiyorsanız, web sunucunuzda CppCMS ve uygulama kodunu işleyip çalıştıramayacağınıza bakın - yani bir eklenti olarak nginx / Apache. CppCMS sayfalarında FastCGI web sunucusu ile CppCMS arasında bağlantı olarak görülüyor; ve FastCGI aslında ... hızlı değil.
Jesper M

> İlginç bir fikir. Etraftaki tavsiyelerin çoğu, fastcgi'yi kullanmanız gerektiğinden, alternatiflerden daha hızlıdır. Bunu yapıp yapamayacağımı kontrol edeceğim, belki de CPPCMS yazarı ile neden en hızlı olduğunu düşündüğüne bakın.
Klaim
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.