Node.js "sunucusu", Nginx veya Apache sunucularıyla karşılaştırıldığında nasıldır?


90

Son zamanlarda Node.js üzerinde çalışıyorum ve basit Node.js tabanlı sunucular yazma konusunda bazı materyallerle karşılaştım. Örneğin aşağıdaki.

var express = require("express"),
http = require("http"), app;

// Create our Express-powered HTTP server
// and have it listen on port 3000
app = express();
http.createServer(app).listen(3000);

// set up our routes
app.get("/hello", function (req, res) {
    res.send("Hello World!");
});

app.get("/goodbye", function (req, res) {
    res.send("Goodbye World!");
});

Şimdi, kodda neler olduğunu anlıyor gibi görünmeme rağmen, terminoloji beni biraz karıştırdı. Sunucu terimini duyduğumda, Apache veya Nginx gibi şeyleri düşünüyorum. Web uygulamalarımı tutabilecek bir kap gibi onları düşünmeye alışkınım. Node.js sunucusunun Nginx / Apache sunucusundan farkı nedir? Node.js tabanlı bir sunucunun (yani kodun) çalışması için hala Nginx gibi bir şeye yerleştirilebileceği doğru değil mi? Öyleyse neden her ikisi de "sunucular" olarak adlandırılıyor?


2
Isn't it true that a Node.js based server (i.e. code) will still be placed within something like Nginx to run?Hayır, bu yanlış
Jaromanda X

1
teknik olarak uygulamanızı çalıştırabilir ve müşteriye hizmet veren düğümün web sunucusunun rolünü etkin bir şekilde yerine getirmesini sağlayabilirsiniz, ancak muhtemelen çiğnemek istediğinizden daha fazla ısırıyorsunuzdur. Geçenlerde konuyla ilgili bu harika makaleyi okudum: nginx.com/blog/nginx-vs-apache-our-view
datafunk

1
İkisi arasındaki farkı sorduğumda apache ve nginx'i ALMADIĞIMI açıklığa kavuşturmama izin verin. Node.js ve Nginx hakkında konuşuyordum.
minnettarım

1
Başlığın sizi yanlış yönlendirmesine izin vermeyin. Makaleyi okursanız, neden kendiniz
yapabilseniz

Yanıtlar:


132

Bu bir sunucu, evet.

Bir node.js web uygulaması, Nginx veya Apache gibi tam teşekküllü bir web sunucusudur.

Gerçekten de node.js uygulamanıza başka herhangi bir web sunucusu kullanmadan hizmet edebilirsiniz. Kodunuzu şu şekilde değiştirin:

app = express();
http.createServer(app).listen(80); // serve HTTP directly

Aslında bazı projeler , diğer sunucular için (Apache dahil) ön uç yük dengeleyici olarak node.js kullanır .

Bunu yapan tek geliştirme yığını node.js olmadığını unutmayın. Go, Java ve Swift'deki web geliştirme çerçeveleri de bunu yapıyor.

Neden?

Başlangıçta CGI idi. CGI iyiydi ve iyi çalıştı. Apache bir istek alır, url'nin bir CGI uygulamasını yürütmesi gerektiğini bulur, bu CGI uygulamasını çalıştırır ve verileri ortam değişkenleri olarak iletir, stdout'u okur ve verileri tarayıcıya geri sunar.

Sorun, yavaş olması. CGI uygulaması statik olarak derlenmiş küçük bir C programı olduğunda sorun değil, ancak bir grup küçük statik olarak derlenmiş C programının bakımı zorlaştı. Böylece insanlar betik dillerinde yazmaya başladı. Sonra bunu sürdürmek zorlaştı ve insanlar nesne yönelimli MVC çerçeveleri geliştirmeye başladı. Şimdi sorun yaşamaya başladık - HER TALEP, tüm bu sınıfları derlemeli ve tüm bu nesneleri, hizmet verecek dinamik bir şey olmasa bile (çünkü çerçevenin hizmet verecek dinamik bir şey olmadığını anlamaya ihtiyacı var) bir miktar HTML sunmak için oluşturmalıdır.

Ya her istekte tüm bu nesneleri oluşturmamız gerekmiyorsa?

İnsanların düşündüğü buydu. Ve bu sorunu çözmeye çalışmaktan birkaç strateji geldi. İlk yöntemlerden biri, yorumlayıcıları mod_phpApache'de olduğu gibi doğrudan web sunucularına yerleştirmekti . Derlenen sınıflar ve nesneler genel değişkenlerde saklanabilir ve bu nedenle önbelleğe alınabilir. Diğer bir strateji de ön derleme yapmaktı. Ve bir başka strateji de uygulamayı normal bir sunucu işlemi olarak çalıştırmak ve FastCGI gibi özel bir protokol kullanarak web sunucusuyla konuşmaktı.

Sonra bazı geliştiriciler uygulama-> sunucu protokolü olarak HTTP kullanmaya başladı. Aslında, uygulama aynı zamanda bir HTTP sunucusudur. Bunun avantajı, yeni, muhtemelen hatalı, muhtemelen test edilmemiş bir protokol uygulamanıza gerek olmaması ve uygulamanızda doğrudan bir web tarayıcısı (veya genellikle curl) kullanarak hata ayıklayabilmenizdir . Ve uygulamanızı desteklemek için değiştirilmiş bir web sunucusuna ihtiyacınız yok, sadece ters proxy veya yeniden yönlendirme yapabilen herhangi bir web sunucusuna ihtiyacınız var.

Neden Apache / Nginx kullanıyorsunuz?

Bir node.js uygulaması sunduğunuzda, kendi web sunucunuzun yazarı olduğunuzu unutmayın. Uygulamanızdaki herhangi bir olası hata, internette doğrudan yararlanılabilen bir hatadır. Bazı insanlar (haklı olarak) bu konuda rahat değil.

Node.js uygulamanızın önüne bir Apache veya Nginx katmanı eklemek, uygulamanız için bir arayüz olarak canlı internette savaşta test edilmiş, güvenliği güçlendirilmiş bir yazılım parçasına sahip olduğunuz anlamına gelir. Küçük bir gecikme (ters proxy) ekler, ancak çoğu buna değer olduğunu düşünür.

Bu, node.js'nin ilk günlerinde standart bir tavsiyeydi. Ancak bu günlerde node.js'yi doğrudan internete maruz bırakan siteler ve web hizmetleri de var. http.ServerModül süreci oldukça iyi savaş görmüş internette güvenilir olmaktır.


1
Benzer SO iş parçacıklarında, Düğümün önüne bir Nginx veya Apache katmanı koymanın "engellemeyen doğasını ortadan kaldırdığını" okudum. Bununla ilgili herhangi bir fikrin var mı?
MrfksIV

4
@MrfksIV Hem Nginx hem de Apache2 engellemez. Aslında, node.js var olmadan çok önce engellemesizlik uyguladılar. Apache1'i kullanma
slebetman

14

NodeJs kendi sunucusunu oluşturur. Gördüğünüz gibi terminoloji oldukça açık:

http.createServer(app).listen(3000);

3000 numaralı bağlantı noktasında bir sunucu oluşturun ve http isteklerini dinleyin.

Projemizden birinde nginx kullandık, ancak daha çok birden fazla nodej örneği için bir yük dengeleyici gibiydi.

3000 ve 3001 numaralı bağlantı noktalarında çalışan iki nodejs örneğiniz olduğunu varsayalım. Artık nginxgerçek httparamalarınızı dinlemek için bir sunucu olarak kullanmaya devam edebilirsiniz port 80ve isteğinizi nodejssunucuya veya belki başka bir sunucuya, daha çok a loadbalancer. Demek hala ne olursa olsun kullanabilirsiniz nginxile sağlamaktadır nodejs.

Burada zaten iyi bir soru soruldu .


1
Aslında nginx'in kendisine fazla odaklanmıyorum. Node.js "sunucusu" ile apache veya nginx gibi diğer "sunucular" arasındaki farkı merak ediyordum. Kapsanan (yani düğüm kodu) kapsayıcıya (yani apache) nasıl eşitlenebileceğini anlayamadım ... Ama bu anlayış yanlıştı sanırım. Şimdi, node.js kodunun, tıpkı Apache'nin 80 numaralı bağlantı noktasını dinlediği gibi 3000 numaralı bağlantı noktasını dinlediğini anlıyorum ... Bu yüzden benzer olduklarını düşünüyorum. Öyleyse, her ikisinin de kendi güçlü ve zayıf yönlerine sahip sunucular olduklarını söylemek doğru mu?
Minnettar

2
createServer yalnızca bir dinleme bağlantı noktası oluşturur. Hiçbir şeye hizmet etmez.
Roger F. Gay

1
Bu bağlantı noktasına bir istek üzerine bir şey sunmayacaksa, nodej'lerin bir bağlantı noktasını dinlemek için createServer'ı kullanmasının anlamı ne olabilir? ... Bu nedenle, mantıksal uzantıya göre bir şekilde veya başka bir "sunucu", değil mi?
GG2

@ RogerF.Gay ... belirli bir bağlantı noktasında bir dinleyici oluşturur ve gelen istek üzerine bir geri arama işlevi yürütür. bir sunucu oluşturduğunu söyleyebilirim.
Naeem Shaikh

1
@Naeem Shaikh Hiçbir şeye hizmet etmez. Bir sunucuya hizmet etmeyen bir şeyi çağırmak mantıklı değil.
Roger F. Gay

1

Her müşterisi için bir garsonu olan Apache Hotel adında bir otel olduğunu varsayalım.

Müşteri salata siparişi verir vermez garson aşçıya gider ve söyler. Şef yemeği hazırlarken garson bekler. Buraya,

Chef => File System,

Waiter => Thread,

Customer => Event.

Müşteri su sipariş ettiğinde bile garson sadece salatayı servis ettikten sonra getirir. Garson, şef tarafından salata hazırlanana kadar beklemeye devam eder. Bu durum, engelleme durumu olarak adlandırılır. Otel büyüse bile, her müşterinin hizmet verecek farklı garsonları olmalıdır. Bu, konuların (garsonlar) engellenmesini artırır.

Şimdi Node Hotel'e gelince tüm müşteriler için sadece bir garson var. İlk müşteri çorba siparişi verirse garson şefe söyler ve ikinci müşteriye gider. Yemek hazır olduktan sonra garson müşteriye teslim eder. Burada müşteri beklemeyecek. Bu durum, Engellemesiz durum olarak adlandırılır. Tek garson (Thread) tüm müşterilere hizmet verir ve onları mutlu eder.

Böylece tek iş parçacıklı bir uygulama olan Node çok hızlıdır.

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.