Sipariş: 1. nginx 2. vernik 3. haproxy 4. web sunucusu?


50

İnsanların hepsini bir akışta birleştirmeyi önerdiklerini gördüm, ancak birçok örtüşen özelliğe sahip oldukları görünüyor, bu yüzden gerçek web sunucunuza çarpmadan önce neden 3 farklı programdan geçmek isteyebileceğiniz konusunda kazmak istiyorum.

nginx:

  • ssl: evet
  • sıkıştır: evet
  • önbellek: evet
  • arka uç havuzu: evet

vernik:

  • ssl: hayır (stunnel?)
  • sıkıştır:
  • önbellek: evet (birincil özellik)
  • arka uç havuzu: evet

HAProxy:

  • ssl: hayır (stunnel)
  • sıkıştır:
  • önbellek: hayır
  • arka uç havuzu: evet (birincil özellik)

Bunların hepsini, birincil özellik avantajlarından bazılarını elde etmek için ana web sunucularınızın önünde zincirleme niyeti var mı?

Bir çok daemonun birbirine benzer şeyler yaparak akması çok kırılgan görünüyor.

Dağıtım ve sipariş tercihiniz nedir ve neden?


1
Vernik şimdi SSL desteğine sahip: bkz. Blog.exceliance.fr/2012/09/10/…
MiniQuark

4
HAPROxy demek istiyorsun?
Luis Lobo Borobia

Nginx her şeye sahip gibi görünüyor, bu yüzden sadece nginx kullanın derim.
Seun Osewa

Yanıtlar:


60

Basit ifadeyle..

HaProxy , piyasadaki en iyi açık kaynaklı yük dengeleyicidir .
Vernik , piyasadaki en iyi açık kaynaklı statik dosya önbelleğidir.
Nginx , piyasadaki en iyi açık kaynak kodlu web sunucusudır.

(elbette bu benim ve diğer birçok halkın görüşüdür)

Ancak genel olarak, tüm sorgular yığının tamamından geçmez.

Her şey haproxy ve nginx / multiple nginx'lerden geçer.
Tek fark, statik talepler için verniği "cıvatalamanız".

  • Herhangi bir istek fazlalık ve verim için yük dengelenmiş (iyi, bu ölçeklenebilir fazlalık)
  • Statik dosyalar için yapılan herhangi bir istek, önce vernik önbelleğine isabet ediyor
  • Herhangi bir dinamik istek doğrudan arka uca gider (harika, vernik kullanılmaz)

Genel olarak, bu model ölçeklenebilir ve büyüyen bir mimariye uyar (birden fazla sunucunuz yoksa haproxy'yi kullanın)

Bu yardımcı olur umarım: D

Not: Aslında SSL için Pound for SSL sorgularını da tanıtacağım: D
SSL isteklerinin şifresini çözmek ve standart istekleri arka uç yığınına iletmek için adanmış bir sunucunuz olabilir: D (Tüm yığının daha hızlı ve basit çalışmasını sağlar)


1
Çok ilginç, özellikle şifre çözme sunucusu ile ilgili bölüm. +1
Gerry

Müthiş cevap. Her şeyin önünde ne oturuyor merak ediyorum? HAProxy mi, Nginx mi?
John

2
@John: [Müşteri -> HAProksi -> Vernik -> Nginx -> Statik İçerik] veya [Müşteri -> HAProxy -> Nginx (isteğe bağlı) -> Uygulama Sunucusu (dinamik içerik)]
MiniQuark 16:13

2
Neden statik önbellek ve dinamik hizmet verdiniz? Nginx, statik dosyalar sunmak için hızlı bir şekilde şimşek çakıyor. Dinamikte bir önbellek uygulamak için statik için [ HAProxy-> Nginx] ve [ HAProxy-> Nginx-> Varnish-> Apache] gibi bir yığın kullanmayı tercih ederim . SSL'yi, atanmış sonlandırma düğümleriyle belirttiğiniz gibi yük dengeleyicisinde sonlandırma.
Steve Buzonas

33

Önsöz

2016'da güncelleme. Her şey değişiyor, tüm sunucular daha iyi hale geliyor, hepsi SSL'yi destekliyor ve web her zamankinden daha şaşırtıcı.

Belirtilmediği sürece, aşağıdakiler binlerce ila milyonlarca kullanıcıyı destekleyen iş dünyasında ve yeni başlayan işletmelere yöneliktir.

Bu araçlar ve mimariler çok fazla kullanıcı / donanım / para gerektirir. Bunu bir ev laboratuarında deneyebilir veya bir blog çalıştırabilirsiniz, ancak bu pek mantıklı değil.

Genel bir kural olarak, basit tutmak istediğinizi unutmayın . Eklenen her ara katman, korunacak başka bir kritik katman aracıdır. Ekleyecek bir şey olmadığında mükemmellik elde edilemez, ancak çıkarılacak hiçbir şey kalmadığında.

Bazı Ortak ve İlginç Dağıtımlar

HAProxy (dengeleme) + nginx (php uygulaması + önbellekleme)

Web sunucusu nginx çalışan php'dir. Nginx zaten oradaysa, önbelleğe alma ve yönlendirmeleri de kaldırabilir.

HAProxy ---> nginx-php
A       ---> nginx-php
P       ---> nginx-php
r       ---> nginx-php
o       ---> nginx-php
x       ---> nginx-php
y       ---> nginx-php

HAProxy (dengeleme) + Vernik (önbellekleme) + Tomcat (Java uygulaması)

HAProxy, istek URI'sına (* .jpg * .css * .js) dayanarak Vernik'e yönlendirebilir.

HAProxy ---> tomcat
A       ---> tomcat
        ---> tomcat
P       ---> tomcat <----+
r       ---> tomcat <---+|
o                       ||
x       ---> varnish <--+|
y       ---> varnish <---+

HAProxy (balanslama) + nginx (sunucuya SSL ve önbellekleme) + Web sunucusu (uygulama)

Web sunucuları, HERHANGİ SSL KONUŞMASI rağmen SSL konuşmuyor ( özellikle EC2'den geçen özel kullanıcı bilgileriyle birlikte bu HAProxy-WebServer bağlantısı ). Yerel bir nginx eklemek, SSL'yi ana bilgisayara getirmeye izin verir. Nginx bir kez orada bazı önbellekleme ve URL yeniden yazma da olabilir.

Not : Bağlantı noktası yönlendirmesi 443: 8080 gerçekleşiyor, ancak özelliklerin bir parçası değil. Port yönlendirme yapmanın anlamı yok. Yük dengeleyici doğrudan web sunucusu ile konuşabilir: 8080.

          (nginx + webserver on same host)
HAProxy ---> nginx:443 -> webserver:8080
A       ---> nginx:443 -> webserver:8080
P       ---> nginx:443 -> webserver:8080
r       ---> nginx:443 -> webserver:8080
o       ---> nginx:443 -> webserver:8080
x       ---> nginx:443 -> webserver:8080
y       ---> nginx:443 -> webserver:8080

Ara Katman

HAProxy: Yük dengeleyici

Ana Özellikler :

  • Yük dengeleme (TCP, HTTP, HTTPS)
  • Çoklu algoritmalar (yuvarlak robin, kaynak ip, başlıklar)
  • Oturum ısrarı
  • SSL sonlandırma

Benzer Alternatifler : nginx (yük dengeleyici olarak yapılandırılabilir çok amaçlı web sunucusu)
Farklı Alternatifler : Bulut (Amazon ELB, Google yük dengeleyici), Donanım (F5, fortinet, citrix netscaler), Diğer ve Dünya Çapında (DNS, anycast, CloudFlare)

HAProxy ne yapar ve ne zaman kullanmak zorundasınız?
Yük dengelemeye ihtiyacınız olduğunda. HAProxy çözüme gitmektir.

Dışında mevcut becerileri yok VEYA çok ucuz VEYA hızlı & kirli istediğinizde, o zaman bir ELB kullanabiliriz: D

Kendi veri merkezinizi zor şartlar altında kullanmak isteyen (özel altyapı, güvenilir yük devretme, 2 güvenlik duvarı katmanı, denetim malzemesi, SLA'nın durma süresinin% x'ini ödemek için, hepsi bir arada) dışında bankacılık / hükümet / benzeri olduğunuz durumlar dışında 30 uygulama sunucunuzu içeren rafın üzerine 2 F5 koyabilirsiniz.

Dışında size 100k HTTP (S) [ve çoklu sitelere] ötesine geçmesini istediğinizde, o zaman sahip ZORUNLU katları onlara (cloudflare, DNS, anycast) önünde dengeleme [global] yükün bir katmanla HAProxy. Teorik olarak, küresel dengeleyici doğrudan HAProxy'yi atlatmaya izin veren web sunucuları ile konuşabilir. Bununla birlikte, genellikle, HAProxy'leri veri merkezinize ortak giriş noktaları olarak saklamanız ve ana bilgisayarlar arasında oldukça dengelemek ve varyansı en aza indirgemek için gelişmiş seçenekleri ayarlamanız gerekir.

Kişisel Görüş : Tamamen TEK DOĞRU AMAÇ'a ithaf edilmiş, küçük, içerilmiş, açık kaynaklı bir proje. En kolay yapılandırma (ONE dosya) arasında, hayatımda karşılaştığım en kullanışlı ve en güvenilir açık kaynaklı yazılım.

Nginx: Emmeyen Apache

Ana Özellikler :

  • Web Sunucusu HTTP veya HTTPS
  • Uygulamaları CGI / PHP / diğerlerinde çalıştırın
  • URL yönlendirme / yeniden yazma
  • Giriş kontrolu
  • HTTP Başlıkları manipülasyonu
  • Caching
  • Ters Proxy

Benzer alternatifler : Apache, Lighttpd, Tomcat, Gunicorn ...

Apache, onlarca modülden oluşan devasa bir küme ve httpd.confkırılmış bir talep işleme mimarisinin tepesinde binlerce hat olarak da bilinen fiili web sunucusuydu . nginx, hepsini daha az modülle (biraz) daha basit bir konfigürasyon ve daha iyi bir çekirdek mimarisi ile yineledi.

Nginx ne yapar ve ne zaman kullanmak zorundasınız?
Bir web sunucusu uygulamaları çalıştırmak için tasarlanmıştır. Uygulamanız nginx üzerinde çalışacak şekilde geliştirildiğinde, zaten nginx'e sahipsiniz ve tüm özelliklerini kullanabilirsiniz.

Uygulamanızın nginx üzerinde çalışması istenmediği sürece ve nginx yığınınızda (Java mağazası olan herhangi biri var mı?) Bulunmadığı durumlarda nginx'te küçük bir nokta yoktur. Web sunucusu özelliklerinin mevcut web sunucunuzda bulunması muhtemeldir ve diğer görevler uygun araç (HAProxy / Varnish / CDN) tarafından daha iyi yerine getirilebilir.

Web sunucunuz / uygulamanızın özellikleri olmadığı zaman, yapılandırması zor ve / veya işine bakmak yerine işiniz ölmeyi tercih ederseniz (Gunicorn herkes mi?), URL yapmak için önüne bir nginx koyabilirsiniz (örneğin, her düğümde yerel olarak) yeniden yazma, 301 yönlendirmeler gönderme, erişim denetimini zorlama, SSL şifrelemesi sağlama ve anında HTTP üstbilgilerini düzenleme. [Bunlar bir web sunucusundan beklenen özellikler]

Vernik: Önbellek sunucusu

Ana Özellikler :

  • Caching
  • Gelişmiş Önbellekleme
  • İnce Taneli Önbellekleme
  • Caching

Benzer Alternatifler : nginx (önbellek sunucusu olarak yapılandırılabilir çok amaçlı web sunucusu)
Farklı Alternatifler : CDN (Akamai, Amazon CloudFront, CloudFlare), Donanım (F5, Fortinet, Citrix Netscaler)

Varnish ne yapar ve ne zaman kullanmak zorundasınız?
Önbellekleme yapar, yalnızca önbellekleme yapar. Bu genellikle çabaya değmez ve zaman kaybıdır. Bunun yerine CDN'yi deneyin. Bir web sitesini çalıştırırken önbelleğe almanız gereken en son şey olduğunu unutmayın.

Yalnızca bir resim veya videolarla ilgili bir web sitesi çalıştırıyor olmanız dışında , CDN'yi dikkatlice incelemeli ve önbelleğe almayı ciddi şekilde düşünmelisiniz.

Kendi donanımınızı kendi veri merkezinizde kullanmaya zorlamadığınız sürece (CDN bir seçenek değildir) ve web sunucularınız statik dosyalar sunmaktan korkunçtur (yardımcı olmayan daha fazla web sunucusu eklemek) ve Varnish son çaredir.

Çoğunlukla statik fakat henüz karmaşık, dinamik olarak oluşturulmuş içeriğe sahip bir siteniz olmadığı sürece (aşağıdaki paragraflara bakın), sonra Vernik web sunucularınızda çok fazla işlem gücü tasarrufu sağlayabilir.

Statik önbellekleme 2016 yılında abartılıyor

Önbelleğe alma işlemi neredeyse yapılandırma ücretsiz, parasız ve zamansızdır. Sadece CloudFlare veya CloudFront veya Akamai veya MaxCDN'ye abone olun. Bu satırı yazmam için geçen süre, önbellekleme kurulumunun süresidir ve elimde tuttuğum bira medyan CloudFlare üyeliğinden daha pahalıdır.

Tüm bu hizmetler statik * .css * .js * .png ve daha fazlası için kutunun dışında çalışır. Aslında, çoğunlukla Cache-ControlHTTP başlığındaki yönergeyi onurlandırırlar . Önbelleğe almanın ilk adımı, web sunucularınızı uygun önbellek yönergeleri gönderecek şekilde yapılandırmaktır. Hangi CDN, ne Vernik, ortada hangi tarayıcı olduğu önemli değil.

Performans ile ilgili önemli noktalar

Cila, ortalama web sunucularının bir blogda bir kedi resmi sunmak için boğulduğu bir zamanda oluşturuldu. Günümüzde ortalama modern ve çok parçacıklı asenkron buzzword odaklı web sunucusunun tek bir örneği yavru kedileri tüm ülkeye güvenilir bir şekilde ulaştırmaktadır. Nezaket sendfile().

Çalıştığım son proje için bazı hızlı performans testleri yaptım. Tek bir tomcat örneği, HTTP üzerinden saniyede 21.000 - 33.000 statik dosya sunabilir (değişen HTTP / istemci bağlantılarının sayısıyla 20B'den 12kB'ye kadar olan dosyaları test eder). Sürdürülen çıkış trafiği 2,4 Gb / s'den fazla. Üretim sadece 1 Gb / s arayüze sahip olacaktır. Donanımdan daha iyisini yapamıyorum, vernik denemeye gerek yok.

Önbelleğe Alma Kompleksi, Dinamik İçeriği Değiştirme

Gibi CDN ve önbelleğe alma sunucuları genellikle parametrelerle URL'yi görmezden ?article=1843, onlar oturumları çerez veya doğrulanmış kullanıcılarla herhangi bir isteği yok saymak ve bunlar dahil olmak üzere en MIME türlerini görmezden application/jsongelen /api/article/1843/info. Konfigürasyon seçenekleri vardır, fakat bunlar genellikle "iyi ya da hiç" yerine ince taneli değildir.

Cila, neyin saklanabileceğini ve neyin olmayacağını tanımlamak için özel karmaşık kurallara sahip olabilir (bakınız VCL). Bu kurallar, belirli içerikleri URI, başlıklar ve geçerli kullanıcı oturumu çerezi ile MIME türü ve TÜM BİRLİKTE içerikle önbelleğe alabilir. Bu, çok özel bir yükleme şekli için web sunucularında çok fazla işlem gücü tasarrufu sağlayabilir. Varnish kullanışlı ve müthiş o zaman.

Sonuç

Tüm bu parçaları anlamak, ne zaman kullanacakları ve nasıl bir araya geleceklerini anlamam biraz zaman aldı. Umarım bu size yardımcı olabilir.

Bu oldukça uzun (6 saat yazmak. OMG!: O). Belki de bunun hakkında bir blog veya kitap başlatmalıyım. Eğlenceli gerçek: Cevap uzunluğunda bir sınır yok gibi görünüyor.


5
Cevap uzunluğunun bir sınırı vardır, ancak ona ulaşmak için birkaç kitap daha yazmanız gerekir.
Michael Hampton

2
Önbelleğe alma konusunda bahsetmeye değer bir nokta: uygulamanın kontrolü sizde değilken bir sitenin performansını iyileştirmenin güçlü bir yoludur; özellikle de uygulama gerçekten aptal önbellek başlıklarına sahipse (kurumsal uygulamalar kimsede?). Yine de, kimliği doğrulanmış kaynakların daha farkında olmanız gerekir.
Cameron Kerr

@ user5994461 Blogunuzu okumayı çok isterim. Şaşırtıcı cevap!
oxalorg

20

3 aracın ortak özellikleri paylaştığı doğrudur. Çoğu kurulum, 3 içinden 2'nin herhangi bir kombinasyonu ile iyi sonuç verir. Bu, ana amaçlarının ne olduğuna bağlıdır. Uygulama sunucunuzun statikte hızlı olduğunu biliyorsanız (örneğin: nginx), bazı önbelleklemeyi feda etmeyi kabul etmek yaygındır. Onlarca ya da yüzlerce sunucu kuracaksanız ve bunlardan en iyi şekilde yararlanmayı ya da sorun giderme sorunlarını önemsemiyorsanız, bazı yük dengeleme özelliklerinden fedakarlık etmek yaygındır. Her yerde birçok bileşenle birlikte dağıtılmış bir uygulama çalıştırmayı düşünüyorsanız, bazı web sunucusu özelliklerini feda etmek yaygındır. Yine de, bazı insanlar hepsiyle ilginç çiftlikler kurarlar.

3 sağlam üründen bahsettiğinizi aklınızda bulundurmalısınız. Genellikle onları dengelemeniz gerekmez. Ön SSL'ye ihtiyacınız varsa, önce ters proxy olarak nginx iyidir. Buna ihtiyacınız yoksa, öndeki vernik iyidir. Ardından, uygulamalarınızı dengelemek için haproxy koyabilirsiniz. Bazen, dosya türlerine veya yollarına bağlı olarak haproxy'nin kendisindeki farklı sunucu çiftliklerine geçmek istersiniz.

Bazen ağır DDoS saldırılarına karşı korunmak zorunda kalacaksınız ve önündeki hapoksi diğerlerinden daha uygun olacaktır.

Genel olarak, seçimleriniz arasında ne gibi bir uzlaşmaya varacağınız konusunda endişelenmemelisiniz. İhtiyaçlarınız için en iyi esnekliği elde etmek için şimdi ve gelecek şekilde nasıl monte edileceğini seçmelisiniz. Bunları birkaç defa üst üste koysanız bile, bazen ihtiyaçlarınıza bağlı olarak doğru olabilir.

Bu umuduyla yardımcı olur!


1
HAProxy için +1 - yazar Sunucu Hatası ile ilgili sorulara yanıt verir. Teşekkürler.
Joel K

Arenstar: Bu araçlardan birini yazdın mı? Willy Tarreau, HAProxy'nin ana geliştiricisidir.
Joel K

Bunun için teşekkürler Willy. Sorumu yukarıdaki Arenstar'a cevapladınız.
John

2
HAProxy için geçerli geliştirme kodunun artık SSL içerdiğini unutmayın.
Joel K,

14

Diğer tüm cevaplar 2010 öncesidir, bu nedenle güncellenmiş bir karşılaştırma ekler.

nginx

  • Tam bir web sunucusu, diğer özellikler de kullanılabilir. Örn: HTTP Sıkıştırma
  • SSL Desteği
  • Nginx, en başından beri hafif olacak şekilde tasarlandığından çok hafif.
  • Cilaya yakın önbellek performansı
  • HAProxy yük dengeleme performansına yakın

vernik

  • Karmaşık önbellekleme senaryoları ve uygulamalara dahil edilmesi için en iyisi.
  • en iyi statik dosya önbelleği
  • SSL Desteği Yok
  • Hafıza ve CPU yiyici

HAProxy

  • en iyi yük dengeleyici, en son yük dengeleme özellikleri için, donanım yük dengeleyicileriyle karşılaştırılabilir
  • SSL, 1.5.0'dan beri desteklenmektedir.
  • Basit, daha hızlı ve daha az hata eğilimli hale getiren bir http uygulaması olmadan sadece bir tcp proxy'si olmak.

Bu yüzden en iyi yöntem, hepsini uygun bir düzende uygulamak gibi görünüyor.

Bununla birlikte, genel amaç için, Nginx, herkes için ortalamanın üstünde bir performans elde ettiğinizde en iyisidir : Önbellekleme, Ters proxy işlemi, Yük dengeleme , kaynak kullanımı konusunda çok az ek yük ile. Ve sonra SSL ve tam web sunucusu özelliklerine sahipsiniz.


6

Vernik, yük dengeleme için desteğe sahiptir: http://www.varnish-cache.org/trac/wiki/LoadBalancing

Nginx, yük dengeleme için desteğe sahip: http://wiki.nginx.org/NginxHttpUpstreamModule

Ben sadece bunu cila + sersemlet ile yapılandırabilirim. Başka bir sebepten dolayı nginx'e ihtiyacım olsaydı, sadece nginx + vernik kullanırdım. Nginx'in SSL bağlantılarını kabul etmesini ve bunların verniklenmesini proxy'ye göndermesini sağlayabilirsiniz, daha sonra http üzerinden nginx ile konuşun.

Bazı insanlar nginx (veya Apache) ürününü karışımın içine atabilir çünkü bunlar Vernik'ten biraz daha genel amaçlı bir araçtır. Örneğin, proxy katmanındaki içeriği (örneğin, XDV, apache filtreleri vb. Kullanarak) dönüştürmek istiyorsanız, bunlardan birine ihtiyacınız olacaktır, çünkü Varnish bunu tek başına yapamaz. Bazı insanlar bu araçların yapılandırmasına daha aşina olabilir, bu nedenle Varnish'i basit bir önbellek olarak kullanmak daha kolaydır ve yük dengeleyicisini zaten bir yük dengeleyici olarak Apache / nginx / haproxy ile tanıdıklarından başka bir katmanda yapar.


Sağ - "arka uç havuzu", bunların üçünün de yük dengeleme özelliklerine sahip olduğunu belirtmek içindir. İlk araştırmamda, HAProxy'nin en ayarlanabilir yük dengeleme seçeneklerine sahip olduğu görülüyor.
Joel K

Kulağa mantıklı geliyor, çünkü bir yük dengeleme aracı olarak tasarlandı. Öte yandan, Varnish'in yük dengeleme özellikleri oldukça iyi ve bir işlemi bu karışımdan kaldırmak daha az gecikmeyle daha basit bir konfigürasyona sahip olmanızı sağlıyor.
larsks
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.