Apache vs Nginx


29

Son zamanlarda Apache ve Nginx arasındaki farkları araştırıyordum ve hangisini seçmem gerektiği konusunda kafam karıştı.

Bazı araştırmalar yaptım ancak ikisi arasında kesin bir karşılaştırma yok ve buradaki birisinin ikisi arasındaki farklar hakkında görüşlerini verebilecek olup olmadığını merak ediyordum.

Şu anki bilgilerim mod_php'nin fastcgi'den daha hızlı ve daha güvenli olduğunu anlamamı sağlıyor, ancak Apache, eşzamanlı bağlantılar ve bellek tüketimi konusunda çok daha kötü.

Sitem çok uzun süredir oylama kullanıyor, ancak AJAX dışı bir web tabanına sahip (yani, üzerinde uzun oylama olan Apache).

Apaches bellek sorunlarına benim orijinal çözümüm, uzun sorgulamayı node.js aracılığıyla göndermek ve ardından node.js'yi almak için her 2 saniyede bir Apache'ye erişmek oldu; bu durumda Apache'nin açık bir bağlantısı olmazdı, bunun yerine node.js olur. Bunun yeterince iyi olmayabileceğini ve farklı çözümlere baktığımın farkına vardım. Hala asıl fikrimin işe yarayıp yaramayacağıyla ilgileniyorum.

Peki, modern web için hangisi daha iyi? Apache veya Nginx?

Güncelleme: Verilen tüm öneriler iyi ve geçerliydi. Tam bir Nginx sunucusu kullanmak için orijinal ikinci fikri ile gittim. Özel bir sunucu olmanın fastcgi'nin güvenlik sorunlarından muzdarip olamayacağından ve uzun sorgulama komut dosyalarımın PHP'de yazılması gerektiğinden memnunum, yüksek eşzamanlı bağlantılarla başa çıkabilen bir sunucuya ihtiyacım var ve Apache ne kadar olursa olsun bunu yapamıyor. Yapısını değiştiriyorum, hala hafızada aç olacak.

Martin F'ın cevabını, sorularıma böylesine açık ve eksiksiz bir cevap verdiğinden beri, işareti hak ettiğini düşündüğümü işaret ettim, ancak üç cevap da iyi ve geçerliydi ve en kesin olarak sahip olduğum başka bir site için ters proxy kullanmaya bakacak. Zira Nginx’in proxy yapabileceği, çok ama çok mahkum olan bir şey buldum.

Teşekkürler,

Yanıtlar:


28

Ele alınması gerektiğini düşündüğüm bir kaç yanlış anlama geliyor.

Her şeyden önce, mod_php sadece marjinal olarak daha hızlı, tüm testlerim farkın o kadar küçük olduğunu dikkate almayacak kadar küçük olduğunu gösterdi: Ayrıca güvenlik yönünün size adanmış bir sunucuya bakıyormuş gibi göründüğünden şüpheliyim. mod_php gerçekten sadece paylaşılan bir ortamda bir avantaja sahiptir - aslında, adanmış bir ortamda php-fpm, PHP ve web sunucunuz artık farklı işlemler olarak çalıştığından daha avantajlı olacaktır ve bu php- Yavaş log gibi fpm.

Eğer dünya siyah beyaz olsaydı saf bir nginx kurulumuna gider ve php-fpm ile php derler derdim. Daha gerçekçi bir şekilde Apache'yi çalıştırıyorsanız, nginx'i apache'ye ters bir proxy yapın ve birkaç saatlik kurulum zamanından tasarruf edersiniz ve performanstaki fark çok küçük olur.

Ancak, dünyanın bir saniye siyah beyaz olduğunu varsayalım, çünkü bu çok daha harika kurulumlar için yapar. Web sunucunuz için nginx + php-fpm yapın. Yüklemeleri çözmek için, nginx için yükleme modülünü ve yükleme ilerleme modülünü kullanın. Bu, web sunucunuzun yükleme işlemini kabul ettiği ve bittiğinde dosya yolunu PHP'ye aktardığı anlamına gelir, böylece dosyanın nginx ve PHP arasında fastcgi protokolü ile akıtılması gerekmez, tatlı. (Bunu canlı kurulumda yaptım ve harika çalışıyor, btw!)

Kullanıcıları indirmek için, x-accel-redirect adlı nginxs x-send-file benzeri bir özellik kullanırsınız, temel olarak PHP'de kimlik doğrulama işlemini yapar ve nginx'in seçtiği ve bu dosyayı aktarmaya başladığını gösteren bir başlık belirler. PHP yürütmeyi sonlandırır ve web sunucunuz aktarımı gerçekleştiriyor, tatlı! (Yine, canlı bir kurulumda bu var ve harika çalışıyor)

Sunucular veya diğer uzun süreli işlemlerde genelinde dosyaları dağıtmak için biz PHP gerçekten en iyi biz Gearman, farklı sunucularda işçiler arasında iş dağıtabilirsiniz iş sunucusudur yüklemek böylece, bu işçiler yazılabilir, bunun için uygun olmadığını fark herhangi dil. Bu nedenle bir dağıtım çalışanı oluşturabilir ve 100 MB PHP kullanmak yerine toplam 200 KB bellek kullanarak bunların 5 tanesini ortaya çıkarabilirsiniz. Tatlı. (Ayrıca bu canlı yayın var, bu yüzden aslında hepsi mümkün)

Henüz almadıysanız, sorunlarınızın çoğunun web sunucunuzla hiçbir ilgisi olmadığını düşünüyorum, Apache'nin yapısı nedeniyle web sunucunuzla ilgili olmaya zorladığını düşünüyorum. Genellikle iş için PHP'den çok daha iyi araçlar vardır ve PHP bunu bilen bir dildir ve PHP'yi hiç terk etmeden yükleme işleri için mükemmel seçenekler sunar.

Nginx'i şiddetle tavsiye ederim, ancak bir ölçeklendirme veya performans probleminiz varsa bana yazmaktan çekinmeyin, diğer problemleriniz için diğer seçeneklere de bakmanız gerektiğini düşünüyorum. Buradan mesaj gönderebilir misin bilmiyorum ama aksi halde bana nginx ile etiketlenmemiş herhangi bir şey için sunucu hatası takip etmediğim için martin@bbtn.us adresinden yaz. :)


1
Kahretsin, işleri gerçekten hallettim :) teşekkürler, aradığım açıklama buydu. Sanırım Apache sitemi kullanarak boğularak öleceğinden Nginx'i öğrenmeye başladım. Neyse ki, onu taşımak için gerçekten oldukça kolay görünüyor. Demek istediğim, node.js'deki insanlar bununla ilgili birçok şey yazdıklarını ve gerçekten ihtiyaç duyduğunuzda php oturum sınıfınızı sorguladığını söyledi (kullanıcılar pencerelerini kapattıklarında bunu algılamanın bir yolu olmadığı sürece yapabilirim: P). Evet ben, bu yüzden hiçbir güvenlik tehdidi ton yardımcı olduğunu bilerek büyük bir sunucu çiftliğinde :) harika açıklama için teşekkür koşuyorum
Sammaye

Şuna bakıyorum: joeandmotorboat.com/2008/02/28/… ve bu: blog.webfaction.com/a-little-holiday-present ve beni çok uzun süredir düşünme düşüncesiyle kandırdı kalbimin içeriğine gerçekten göz kulak ol. Apache'nin aksine tek bir hafıza sorunu değil
Sammaye 19

Java'da çok iş parçacıklı bir işçi olabileceğimi ve php'nin bunun etrafında mükemmel şekilde çalışabileceğini söyleyerek bekleyin. Gördüğüm en büyük sorun sunucu. Çünkü Apache ile uzun süren bir sorgulama kullanarak büyük bellek sorunları alıyorum ...
Sammaye

1
Temel olarak evet, PHP'de şoför eklentisini kullanarak dosya yazım işçileri var, şantiye iş sunucusuna bir dağıtım işi gönderiyorum ve bunu herhangi bir dilde yazılabilen bir işçiye gönderiyor; PHP, Java, C, vb. Bu işçi işini yapar ve durumu PHP'ye geri bildiren dişliciye bildirir. (bir arka plan işi seçilmediği sürece, bu durumda PHP beklemeden biter)
Martin Fjordvald

2
Bunun eski bir gönderi olduğunu biliyorum ama şunu söylemeliyim ki, bu nginx ve apache konusunda bulduğum en bilgilendirici yazılardan biri. Thans Martin, +1.
Akoi Meexx

5

Nginx'i ters proxy olarak çalıştırmanızı öneririm. Tüm statik ve önbelleğe alınmış dosyalarınızı (Apache'den daha az hızlı olduğu yerlerde (ek yükü daha az bellekte)) yönetir ve ardından dinamik içerik isteklerini Apache'ye iletir.


Evet, bu çoğu insanın atm gibi göründüğü şey. Kesinlikle buna bakmam gerekecek :)
Sammaye

1
Apache için mod_rpaf'ı kurmayı unutmayın, böylece oturum açma amacıyla istemci IP adreslerinden geçebilirsiniz (aksi halde Apache günlükleri tüm istekleri 127.0.0.1'den itibaren gösterecektir), aşağıdakileri nginx config içine ekleyin: proxy_set_header X-Forwarded-For $ proxy_add_x_forwarded_for;
Greg Annandale

Bunu bu gece denemeden önce bir şeyi merak ediyorum. PHP'ime hizmet eden Nginx üzerinden Apache'ye yönlendiriyorum, bu uzun oylamanın hala Apache ile aynı sorunları olacağı anlamına mı geliyor yoksa ters proxy'de çağırmak Apache'nin bir şekilde farklı davranmasına neden oluyor mu?
Sammaye

1

Mod_php'nin alternatiflerinden daha hızlı olduğundan emin değilim, bunu nereden okudunuz? Nginx + php-fpm ile bazı laboratuar testleri yaptım ve ölçtüklerimden diğer tüm kurulumları geçti.

Bu kuruma bir göz atın: http://interfacelab.com/nginx-php-fpm-apc-awesome/

Http://www.dotdeb.org/ adresindeki PHP paketlerini kullanmam dışında, kullanıma hazır bir php-fpm paketi ve init betiği içermesi dışında neredeyse aynı şekilde ayarlarım . Memecache veya syck kullanmıyorum.


stackoverflow.com/questions/78108/… buradan aldım ve php el kitabını kontrol ettim ve php_mod'un cgi sürümlerine göre önemli avantaj sağladığını söylüyor. Kurulumun iyi görünüyor. O da çok kolay görünüyor. Ben içine bakacağım :)
Sammaye

2

1
Peki - PHP işlemesi ölmekte (veya zaman aşımına uğrar) hakkında endişeleniyorsanız, FastCGI (veya PHP-FPM) bu yoldan gitme yoludur. Ölü çocuk işçilerini diğer etkinliklere ara vermeden öldürebilir.
pauska

1
Evet. Ya da buna bağlı olarak değişir. Aynı anda kaç (en fazla) yavaş istek işleyeceksiniz? Bunun için maksimum PHP FPM dizisini ayarlayın, ayrıca istediğiniz "hızlı" cgi sayısını girin. 4GB RAM'e sahip bir sunucuda 200 PHP-FPM childs çalıştıran insanlar hakkında bir şeyler duydum, bu yüzden sen olsam bu konuda çok fazla endişelenmem. PHP'nin bir sonraki sürümü (5.3.3) standart olarak PHP-FPM içerecektir, burada bir adpative motoru da vardır - bu, kaç tane beklemede bulunduğunuza bağlı olarak ölçeklenir.
pauska

1
Kolayca birden fazla sunucu üzerinde çalışıyor olabilirim (belki 10'a kadar) ancak 4GB'lık bir sunucuda uzun süre sorgulanabilecek 200 istek uydurabilseydim bu Apache'yi çalıştırmak için gereken 20 sunucunun neredeyse yarısı olmalıydı. hmmmm ... Bu gece bunu test etmem gerekecek
Sammaye
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.