Yalnızca Node.js'yi kullanma ve Apache / Nginx ile Node.js kullanma


224

Hangi durumlarda Node.js'yi gerçek dağıtımda yalnızca sunucu olarak kullanmayı tercih etmeliyim?

Biri geldiğinde değil node.js daha ne oynadığına node.js sadece kullanmak istiyorsunuz? Apache mi, Nginx mi?

Yanıtlar:


207

Node.js'nin önüne başka bir web sunucusu yapıştırmanın birkaç iyi nedeni vardır:

  • Node.js işlemi için ayrıcalıklar / setuid konusunda endişelenmenize gerek yok. Tipik olarak sadece 80 numaralı bağlantı noktasına bağlanabilir. Nginx / Apache'nin root olarak başlaması, 80 numaralı bağlantı noktasına bağlanması ve daha sonra kök ayrıcalıklarından vazgeçmesi konusunda endişelenmenize izin verirseniz, Düğüm uygulamanızın bu konuda endişelenmesi gerekmez.
  • Resimler, css, js ve html gibi statik dosyaları sunma. Düğüm, uygun bir statik dosya web sunucusu kullanmaya kıyasla daha az verimli olabilir (Düğüm, belirli senaryolarda da daha hızlı olabilir, ancak bunun norm olması pek olası değildir). Daha verimli bir şekilde sunulan dosyaların üstünde, Düğüm dışında bir şey yayınlıyorsanız, eTag'leri veya önbellek kontrol başlıklarını kullanma konusunda endişelenmenize gerek kalmaz. Bazı çerçeveler bunu sizin için halledebilir, ancak emin olmak istersiniz. Ne olursa olsun, hala muhtemelen daha yavaş.
  • Matt Sergeant'ın cevabında belirttiği gibi, anlamlı hata sayfalarını daha kolay görüntüleyebilir veya düğüm hizmetiniz çökerse statik bir siteye geri dönebilirsiniz. Aksi takdirde kullanıcılar zaman aşımına uğramış bir bağlantı alabilirler.
  • Düğümün önünde başka bir web sunucusu çalıştırmak, düğümdeki güvenlik kusurlarını ve DoS saldırılarını azaltmaya yardımcı olabilir. Bir gerçek dünya Örneğin, CVE-2013-4450 edilir Düğüm önünde Nginx gibi bir şey çalıştırarak önlenebilir .

Muhtemelen bir CDN aracılığıyla veya Varnish gibi bir önbellek sunucusunun arkasından statik dosyalarınızı sunmanız gerektiğini söyleyerek ikinci mermi noktasını uyaracağım. Bunu yapıyorsanız, kökeni Düğüm veya Nginx veya Apache olması önemli değildir.

Özellikle nginx ile dikkat edin: websockets kullanıyorsanız, nginx'in son sürümünü kullandığınızdan emin olun (> = 1.3.13), çünkü sadece websockets kullanmak için bir bağlantıyı yükseltmek için destek ekledi.


11
express.staticETag'leri ve önbellek kontrol başlıklarını iyi işleyecek.
robertklep


4
pauljz, daha yavaş yedekleme kriterleri var mı? @pawlakpp'un işaret ettiği makaleler Node.js'nin yük altında çok daha hızlı olduğunu söylüyor.
Samuel Neff

3
Burada ilgili bazı tartışmalar var: stackoverflow.com/questions/9967887/… bazı ek bakış açıları ile. Oradaki karşılaştırmalar (ek karşılaştırmalar istediğinden beri) node.js / express'i, hatta kümelenmiş, fark edilir şekilde düşük performans gösteriyor. Benim düşüncem, statik dosya sunumunu tutmak ve düğüm olay döngüsünün dışında işlem yapılmasını istemek, Düğümde olması gereken iş için bu döngüleri kaydetmek en iyisidir. Ama dürüst olmak gerekirse, Düğümden statik şeyler çıkarırsanız, iyi olacaksınız. Çok önemli değil.
pauljz

4
Sadece düğümü doğrudan kullanıyorsanız, sadece :80authbind kullanarak düğümü kök olarak çalıştırma gibi ayrılmış bağlantı noktalarına bağlanabileceğinizi belirtmek gerekir: thomashunter.name/blog/using-authbind-with-node-js
wyqydsyq

70

Sadece pauljz'in cevabına bir neden daha eklemek için, bir ön uç sunucusu kullanıyorum, böylece arka uç sunucusunu yeniden başlattığımda 502 hata sayfası oluşturabilir veya bir nedenle çöküyor. Bu, kullanıcılarınızın bağlantı kuramama konusunda hiçbir zaman hata almamalarını sağlar.


28

İnanıyorum ki, ne yaptığınızı bildiğiniz sürece Node'u statik dosyalara sunmak için her durumda iyi . Uygulama sunucusunu, statik sunuculara hizmet etmek için kullanmak çok yeni bir paradigmadır (pek çok (her?) Rakip teknoloji (PHP, Ruby, Python, vb.) Uygulama sunucularının önünde HTTPD veya Nginx gibi bir web sunucusu gerektirir) .

Node ile statik dosyalar sunmaya karşı okuduğum her nesnel neden, en iyi bildiğiniz şeyleri kullanma veya daha iyi test edilmiş / daha kararlı olarak algılanan şeyleri kullanma fikri etrafında dönüyor. Bunlar pratik olarak konuşmak için çok geçerli nedenlerdir, ancak tamamen teknik bir ilgisi yoktur.

Düğüm ile mümkün olmayan klasik bir web sunucusunda mümkün olmayan bir özellik bulamadığınız sürece (ve bundan şüpheliyim), her iki yaklaşım da iyi olduğu için en iyi neyi bildiğinizi veya neyle çalışmayı tercih edeceğinizi seçin.

Nginx ve Apache'ye gelince - Düğüm ile aynı şekilde "oynayacaklar". Bunları Düğüm ile ilgili olmaksızın karşılaştırmalısınız.


2
Genel olarak teknik karşılaştırmalar hakkında iyi bir bakış açısı: "Düğüm ile statik dosyalara karşı hizmet etmek için okuduğum her nesnel neden, en iyi bildiğiniz şeyleri kullanma veya daha iyi test edilmiş / daha kararlı olarak algılanan şeyleri kullanma fikri etrafında dönüyor. Bunlar çok geçerli nedenler pratik olarak konuşur, ancak teknik açıdan çok az ilgisi vardır. " Bu günlerde çok fazla karşılaştırma önyargılı ve daha düşük ancak zaman test edilmiş teknolojilerdeki deneyim ve konfor seviyesine dayanmaktadır.
Sunny

Evet ama gerçekten / öznel / nedenler. Objektif bir nedenin harika bir örneği bir ölçüt olacaktır - bunların çoğu nginx> nodejs'yi gösteriyor (gerçekten kendim yapmalıyım ....)
Nick

@Nick Kesinlikle haklısın. Ve orada birkaç tane var, ancak bilimsel kıyaslama konusunda uzman değilim, bu yüzden insanların web'de arama yapmasına izin vereceğim. Ne diyeceğim ama iki yerine bir sunucu kullanmanın basitliğinin bir yararı olduğunu düşünüyorum. Bir şeyin yanlış gitmesi için daha az potansiyel vardır. Öte yandan, Nginx genellikle Unix benzeri iyi yapılandırma ile sisteme Düğüm ile oysa ile entegrasyon dışarı rakam gereken her bir paket var systemd, pm2vb orada artılar ve eksiler ve kullanıcı konuşuyoruz böylece onların zehir almalı Yani .

Bunun tam tersi olduğunu düşündüm - düğüm yük altında daha iyi olurdu (belki de saf yüksüz hızda değil) çünkü istek başına bir dosya sunan bir işlemi devretmek zorunda kalmaz, ancak yerel disk veya uzak istemci diğer tüm binlerce istemcinin hazır olduğu iş parçacığında hazırdır. Bu, elbette çoklu işlemcilere sahip olduğunuzda bozulur .. Düğüm şimdi nasıl kullanılacağını bilmediği sürece. Veya web sunucuları artık statik sayfaları sunuculaştırmak için kooperatif çoklu görevini kullanabilir ..
Gerard ONeill

1

Ekstra: Aynı Proxy'de aynı bağlantı noktasında bir Websocket Sunucusu yürütmek veya belki de bazı teknolojileri karıştırmak için bir Ters Proxy'ye ihtiyacınız varsa önemlidir (NodeJS ile bazı istekleri ve PHP ile bazılarını veya diğerlerini yanıtlayın)

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.