node.js'nin kendisi mi yoksa statik dosyalar için nginx ön ucu mu?


91

Daha hızlı olan herhangi bir kıyaslama veya karşılaştırma var mı: nginx'i düğümün önüne yerleştirin ve statik dosyaları doğrudan sunmasına izin verin veya sadece düğümü kullanın ve onu kullanarak statik dosyalar sunun?

nginx çözümü benim için daha yönetilebilir görünüyor, herhangi bir fikriniz var mı?


3
Bunun aynı zamanda bir sunucuyu diğerinin üzerinde kullanmak için yazmanız gereken yapılandırma ve kod miktarına da bağlı olduğunu söyleyebilirim. IPO'ya gitmeyi beklemiyorsanız ve uygulama sunucunuz zaten yapılandırılmışsa ve ihtiyacınız olan her şeyi yapıyorsa, o zaman yeterli olmayana kadar ona bağlı kalabilirsiniz.
m33lky

Yanıtlar:


120

Buradaki cevaplara katılmıyorum. Node iyi durumda olsa da, nginx doğru yapılandırıldığında kesinlikle daha hızlı olacaktır. nginx, küçük bir bellek ayak iziyle benzer bir örüntüyü takip ederek (yalnızca gerektiğinde bir bağlantıya geri dönen) C'de verimli bir şekilde uygulanır. Dahası, işi yapan işletim sistemi çekirdeği olduğu için, dosya sunarken olabildiğince hızlı olan dosyaları sunmak için dosya gönderme sistem çağrısını destekler .

Şimdiye kadar nginx, ön uç sunucusu olarak fiili standart haline geldi. Statik dosyalar, gzip, SSL sunma ve hatta daha sonra yük dengeleme performansı için bunu kullanabilirsiniz.

Not: Bu, dosyaların istek sırasında diskte beklemede olduğu gibi gerçekten "statik" olduğunu varsayar.


7
Küçük bir not: node.js de destekler sendfile- ancak bazı kod yazmanız gerekiyor gibi görünüyor, bkz. blog.std.in/2010/09/09/using-sendfile-with-nodejs
tuomassalo

Statik içerik sunmanın dışında, Nginx'in performansı neden ana web sunucusunu (Tomcat / Jetty / IIS, vb.) Halka açık etki alanında göstermekten daha iyi?
rafya

1
Uygulamanıza bir istekte bulunulursa, bu istek, önce nginx üzerinden yönlendirilerek sihirli bir şekilde daha hızlı yapılmaz (nginx, statik CSS ve js, gzip ve SSL'yi işlediğinde en iyi durumda fark edilir derecede daha hızlı olabilir). Bununla birlikte, nginx aynı zamanda en iyi yazılım yük dengeleyicilerinden biridir, bu nedenle çoğu sunucu orta derecede yüksek yüklerde tersine dönme konusunda kötü şöhretli olduğundan bu kritik olabilir.
m33lky

Ancak, Node.js kullanarak dosyaları eşzamansız bir şekilde sunuculayabilirsiniz. Bunu NGINX ile yapabilir misin?
Dragos C.

1
@lwansbrough bu kriterleri masaya getiriyor. Bu konudaki en az bir kişi kendi deneylerini yapmıştır.
m33lky

76

Nginx, Express.js (statik ara yazılım) ve kümelenmiş Express.js'yi karşılaştırarak ab -n 10000 -c 100statik bir 1406 bayt sunmak için hızlı bir şekilde yaptım favicon.ico. Bu yardımcı olur umarım:

görüntü açıklamasını buraya girin

Ne yazık ki 1000 hatta 10000 eşzamanlı isteği test edemiyorum, nginx, makinemde hata vermeye başlayacak.

DÜZENLEME : artvolk tarafından önerildiği gibi, küme + staticara yazılımın sonuçları (daha yavaş):

görüntü açıklamasını buraya girin


Teşekkür ederim, çok yardımcı! Bu ara yazılımı favicon için mi kullandınız: senchalabs.org/connect/favicon.html veya sadece statik dosya olarak mı sunuyorsunuz ?
artvolk

@artvolk the favicon one :)
gremo

3
Testler için NODE_ENV = üretim ayarladınız mı? Çünkü bu static, üretimde yapacağı önbelleğe alma ara yazılımları nedeniyle inanılmaz bir fark yaratır .
ruffrey

21
italyanca konuşmayanlarınız için x ekseni istek sayısıdır ve Y ekseni dosyayı sunmak için geçen ms sayısıdır. Bunu Google'a çevirmek zorunda kaldım çünkü verileri yanlış okumadığımdan emin olmak istedim. bu veriler inanılmaz derecede yardımcı oldu ve buradaki kıyaslama testini gerçekten takdir ediyorum. sonuçta nginx'e yapışacak
JL Griffin

1
NODE_ENV = üretim ayarlanmış mıydı?
basickarl

11

@ Gremo'nun çizelgeleri için farklı bir yorumum var. Bana aynı sayıda istekte (9-10k arasında) hem düğüm hem de nginx ölçeği gibi görünüyor. Nginx için yanıttaki gecikmenin sabit bir 20 ms kadar daha düşük olduğundan emin olun, ancak kullanıcıların bu farkı mutlaka algılayacağını sanmıyorum (uygulamanız iyi oluşturulmuşsa). Sabit sayıda makine verildiğinde, bir düğüm makinesini nginx'e dönüştürmeden önce, yükün çoğunun ilk etapta oluşacağı düğüm olduğunu düşünürsek, oldukça önemli miktarda yük alacaktır. Bunun tek karşı noktası, yük dengeleme için zaten bir makineyi nginx'e adamış olmanızdır. Bu durumda, statik içeriğinize de hizmet etmesini sağlayabilirsiniz.


1
"Nginx için yanıttaki gecikmenin sabit 20 ms kadar daha düşük olduğundan eminim, ancak kullanıcıların bu farkı mutlaka algılayacağını sanmıyorum"? Umarım bunu yapmazsınız. Kullanıcıların 1 ms'lik bir fark algılayacağına dair kanıt var!
Navin

4
Alıntı gerekli
David Burrows

9

Her iki durumda da, statik dosyaları önbelleğe almak için Nginx'i kurardım ... orada BÜYÜK bir fark göreceksiniz. Ardından, onlara düğümden sunsanız da vermeseniz de, temelde düğüm uygulamanızda aynı performansı ve aynı yük rahatlamasını elde edersiniz.

Kişisel olarak Nginx ön ucumun çoğu durumda statik varlıklar sunması fikrinden hoşlanmıyorum.

1) Proje şimdi aynı makinede olmalı veya varlıklara (nginx makinesinde) ve web uygulamasına (ölçeklendirme için birden fazla makinede) bölünmelidir

2) Nginx yapılandırması artık statik varlıklar için yol konumlarını korumak zorundadır / değiştiklerinde yeniden yüklemek zorundadır.


0

Bu cevaplanması zor bir soru. Sadece statik dosyaları sunmak için gerçekten hafif bir düğüm sunucusu yazdıysanız, büyük olasılıkla nginx'ten daha iyi performans gösterir, ancak bu o kadar basit değil. ( Burada bir nodejs dosya sunucusu ile lighttpd'yi karşılaştıran bir "kıyaslama" verilmiştir - statik dosyalar sunarken performans açısından ngingx'e benzer).

Statik dosyaların sunulmasıyla ilgili performans, genellikle işi yapan web sunucusundan daha fazlasına indirgenir. Mümkün olan en yüksek performansı istiyorsanız, son kullanıcılar için gecikmeyi azaltmak ve uç önbelleğe alma özelliğinden yararlanmak için dosyalarınızı sunmak üzere bir CDN kullanacaksınız.

Bu konuda endişelenmiyorsanız, düğüm çoğu durumda statik dosyaları gayet iyi sunabilir. Node, tek iş parçacıklı olduğundan ve herhangi bir engelleme giriş / çıkışının tüm süreci engelleyebileceği ve uygulama performansınızın düşmesine neden olabileceği için de dayandığı zaman uyumsuz koda kendini ödünç verir. Büyük olasılıkla kodunuzu engellemeyecek şekilde yazıyorsunuzdur, ancak eşzamanlı olarak herhangi bir şey yapıyorsanız, engellemeye neden olabilirsiniz, bu da diğer istemcilerin statik dosyalarının sunulma hızını düşürür. Kolay çözüm engelleme kodu yazmamaktır, ancak bazen bu bir olasılık değildir veya her zaman uygulayamazsınız.


9
Bunların hepsi saçmalık. Bu soru Apache ile değil nginx ile ilgilidir . Hem nginx hem de node, olay döngüleri için libev kullanır. Nginx, düğümden çok daha hızlı olacak. Bunlardan biri bir VM'nin ek yüküne sahip değildir ve bu işlemi dosya sisteminizde yapmak için özel olarak yazılmıştır.
Evan Carroll

1
libev erken düğümdü. Libuv, düğümün platformlar arası çalışmasını sağlamak için bu rolü benimsemiştir.
tsturzl

1
Zaman uyumsuz kodun bunu nasıl etkilediğini anlamıyorum. Düğümün performansı Nginx'inkinden çok daha kötü olacak ve büyük olasılıkla sizden dosyaları diskten okumanızı isteyen bir grup istemciniz olduğunda karşılaşacağınız G / Ç'yi engellemekten kaynaklanacak. En iyi uygulama, Node uygulamanızın uygulama mantığını işleyebilmesi için statik varlıklar için her zaman Nginx kullanmaktır. Node'un daha iyi performans göstereceği ancak gerçek dünyada Nginx'in 10'da 9 kez bir mil kazanacağı teorik senaryolar hakkında konuşabiliriz.
wgp

-11

Tamamen node.js'nin birçok açıdan nginx'ten daha iyi performans gösterebileceğinden eminim.

NginX'in yerleşik bir önbelleği var, oysa node.js fabrikada yüklenmiş olarak gelmiyor (KENDİ DOSYA ÖNBELGENİZİ OLUŞTURMANIZ GEREKİR). Özel dosya önbelleği, süper basit olduğu için nginx'ten ve piyasadaki diğer tüm sunuculardan daha iyi performans gösterir.

Ayrıca Nginx birden çok çekirdek üzerinde çalışır. Düğümün tam potansiyelini kullanmak için düğüm sunucularını kümelemeniz gerekir. Nasıl olduğunu merak ediyorsanız lütfen pm.

Düğüm ile performans nirvana elde etmek için derin kazmaya ihtiyacınız var, tek sorun bu. Bir kez yaptıktan sonra, evet ... Nginx'i yener.


1
Söylediklerinize inanmak istediğim için bazı gerçekleri getirmeniz gerekiyor, ancak gerçek dünyaya dayanıyorsa, kıyaslamalara ihtiyacınız var, harika! ancak uç vakalar değil
Stefan Rogin

5
İşin garibi, bu cevabın en fazla oyu alan seçilen cevap kadar çok gerçek içermesi. Bence insanlar öndeki bir web sunucusunu tercih ediyorlar çünkü [başka herhangi bir web uygulama teknolojisini ekleyin] içinde bunu nasıl yapmaları öğretilmişti. Bu iyi bir cevap değil ama +1 merhametle.
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.