Làm thế nào để "máy chủ" Node.js so sánh với máy chủ Nginx hoặc Apache?


86

Tôi đã nghiên cứu Node.js gần đây và xem một số tài liệu về cách viết các máy chủ dựa trên Node.js đơn giản. Ví dụ như sau.

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!");
});

Bây giờ, mặc dù tôi có vẻ hiểu những gì đang xảy ra trong mã, nhưng tôi hơi bối rối bởi thuật ngữ. Khi tôi nghe thấy thuật ngữ máy chủ, tôi nghĩ về những thứ như Apache hoặc Nginx. Tôi đã quen nghĩ về chúng giống như một thùng chứa có thể chứa các ứng dụng web của tôi. Máy chủ Node.js khác với máy chủ Nginx / Apache như thế nào? Có đúng là một máy chủ dựa trên Node.js (tức là mã) vẫn có thể được đặt trong một cái gì đó như Nginx để chạy không? Vậy tại sao cả hai đều được gọi là "máy chủ"?


2
Isn't it true that a Node.js based server (i.e. code) will still be placed within something like Nginx to run?Không, điều đó không chính xác
Jaromanda X

1
Về mặt kỹ thuật, bạn có thể chạy ứng dụng của mình và có nút phục vụ ứng dụng đó cho khách hàng thực hiện vai trò của máy chủ web một cách hiệu quả, nhưng có thể bạn đang cắn rứt nhiều hơn những gì bạn muốn. Gần đây tôi đã đọc bài viết tuyệt vời này về chủ đề: nginx.com/blog/nginx-vs-apache-our-view
datafunk

1
Hãy để tôi làm rõ rằng khi tôi hỏi sự khác biệt giữa cả hai, tôi KHÔNG nói về apache vs nginx. Tôi đã xem xét về Node.js vs Nginx.
Tri ân

1
Đừng để tiêu đề hiểu lầm bạn. Nếu bạn đọc bài viết bạn sẽ hiểu tại sao tôi nói rằng trong khi bạn có thể làm điều đó cho mình, bạn có thể không muốn ...
datafunk

Câu trả lời:


128

Đó là một máy chủ, vâng.

Ứng dụng web node.js là một máy chủ web chính thức giống như Nginx hoặc Apache.

Bạn thực sự có thể phục vụ ứng dụng node.js của mình mà không cần sử dụng bất kỳ máy chủ web nào khác. Chỉ cần thay đổi mã của bạn thành:

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

Thật vậy, một số dự án sử dụng node.js làm trình cân bằng tải front-end cho các máy chủ khác (bao gồm cả Apache).

Lưu ý rằng node.js không phải là ngăn xếp phát triển duy nhất để làm điều này. Các khung phát triển web trong Go, Java và Swift cũng làm được điều này.

Tại sao?

Ban đầu là CGI. CGI ổn và hoạt động tốt. Apache sẽ nhận được một yêu cầu, nhận thấy rằng url cần phải thực thi ứng dụng CGI, thực thi ứng dụng CGI đó và chuyển dữ liệu dưới dạng các biến môi trường, đọc stdout và cung cấp dữ liệu trở lại trình duyệt.

Vấn đề là nó chậm. Không sao cả khi ứng dụng CGI là một chương trình C biên dịch tĩnh nhỏ nhưng một nhóm các chương trình C biên dịch tĩnh nhỏ trở nên khó duy trì. Vì vậy, mọi người bắt đầu viết bằng ngôn ngữ kịch bản. Sau đó, điều đó trở nên khó duy trì và mọi người bắt đầu phát triển các khung MVC hướng đối tượng. Bây giờ chúng tôi bắt đầu gặp sự cố - MỌI YÊU CẦU phải biên dịch tất cả các lớp đó và tạo tất cả các đối tượng đó chỉ để phục vụ một số HTML, ngay cả khi không có gì động để phục vụ (vì khung công tác cần phải tìm ra rằng không có gì động để phục vụ).

Điều gì sẽ xảy ra nếu chúng ta không cần tạo tất cả các đối tượng đó trong mọi yêu cầu?

Đó là những gì mọi người nghĩ. Và từ việc cố gắng giải quyết vấn đề đó đã đưa ra một số chiến lược. Một trong những cách sớm nhất là nhúng trực tiếp trình thông dịch vào các máy chủ web như mod_phptrong Apache. Các lớp và đối tượng đã biên dịch có thể được lưu trữ trong các biến toàn cục và do đó được lưu vào bộ nhớ đệm. Một chiến lược khác là làm trước khi biên dịch. Và một chiến lược khác là chạy ứng dụng như một quy trình máy chủ thông thường và nói chuyện với máy chủ web bằng giao thức tùy chỉnh như FastCGI.

Sau đó, một số nhà phát triển bắt đầu chỉ đơn giản sử dụng HTTP làm ứng dụng-> giao thức máy chủ của họ. Trên thực tế, ứng dụng cũng là một máy chủ HTTP. Ưu điểm của việc này là bạn không cần phải triển khai bất kỳ giao thức mới nào, có thể có lỗi, có thể chưa được thử nghiệm và bạn có thể gỡ lỗi ứng dụng của mình trực tiếp bằng trình duyệt web (hoặc thông thường curl). Và bạn không cần máy chủ web đã sửa đổi để hỗ trợ ứng dụng của mình, chỉ cần bất kỳ máy chủ web nào có thể thực hiện chuyển hướng hoặc ủy quyền ngược.

Tại sao sử dụng Apache / Nginx?

Khi bạn phân phối ứng dụng node.js, hãy lưu ý rằng bạn là tác giả của máy chủ web của riêng mình. Mọi lỗi tiềm ẩn trong ứng dụng của bạn đều là lỗi có thể khai thác trực tiếp trên internet. Một số người không thoải mái với điều này.

Thêm một lớp Apache hoặc Nginx vào trước ứng dụng node.js của bạn có nghĩa là bạn có một phần mềm đã được thử nghiệm, kiểm tra bảo mật trên Internet trực tiếp làm giao diện cho ứng dụng của mình. Nó thêm một chút độ trễ nhỏ (proxy ngược) nhưng hầu hết đều coi nó là giá trị.

Đây từng là lời khuyên tiêu chuẩn trong những ngày đầu của node.js. Nhưng ngày nay cũng có nhiều trang và dịch vụ web đưa node.js trực tiếp lên internet. Các http.Servermô-đun tại là khá tốt chiến thử nghiệm trên internet để được tin cậy.


1
Tôi đã đọc trong các chủ đề SO tương tự rằng việc đặt một lớp Nginx hoặc Apache trước Node "làm mất đi tính chất không chặn của nó". Bất kỳ suy nghĩ về điều này?
MrfksIV

3
@MrfksIV Cả Nginx và Apache2 đều không chặn. Trên thực tế, họ đã triển khai tính năng không chặn từ rất lâu trước khi node.js tồn tại. Không sử dụng Apache1
slbetman

14

NodeJs tạo máy chủ của riêng nó. Như bạn có thể thấy, thuật ngữ khá rõ ràng:

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

Tạo một máy chủ và lắng nghe các yêu cầu http trên cổng 3000.

Chúng tôi đã sử dụng nginx trong một dự án của mình, nhưng nó giống như một bộ cân bằng tải cho nhiều phiên bản nodejs hơn.

Giả sử bạn có hai phiên bản nodejs đang chạy trên cổng 3000 và 3001, Bây giờ bạn vẫn có thể sử dụng nginxlàm máy chủ để nghe các httpcuộc gọi thực tế của mình port 80và có thể muốn chuyển hướng yêu cầu của bạn đến nodejsmáy chủ hoặc có thể là một số máy chủ khác, giống như một loadbalancer. Vì vậy, bạn vẫn có thể sử dụng bất cứ thứ gì được nginxcung cấp nodejs.

Một câu hỏi hay đã được hỏi ở đây .


1
Tôi thực sự không quá tập trung vào bản thân nginx. Tôi đã tự hỏi về sự khác biệt giữa "máy chủ" node.js và các "máy chủ" khác như apache hoặc nginx. Tôi không thể hiểu cách chứa (tức là mã nút) có thể được coi là vùng chứa (tức là apache) ... Nhưng tôi đoán cách hiểu này không chính xác. Bây giờ, tôi nhận ra rằng mã node.js lắng nghe cổng 3000 giống như Apache lắng nghe cổng 80 .... Vì vậy, tôi đoán chúng tương tự nhau. Vì vậy, có đúng khi nói rằng cả hai đều là máy chủ có điểm mạnh và điểm yếu riêng?
Biết ơn

2
createServer chỉ tạo một cổng lắng nghe. Nó không phục vụ bất cứ điều gì.
Roger F. Gay

1
Điều gì sẽ xảy ra khi nodejs sử dụng createServer để lắng nghe trên một cổng nếu nó không phục vụ một cái gì đó theo yêu cầu đến cổng đó? ... Do đó, theo cách này hay cách khác, theo cách mở rộng logic là một "máy chủ", phải không?
GG2

@ RogerF.Gay ... nó tạo một bộ lắng nghe trên một cổng được chỉ định và thực hiện một hàm gọi lại khi có yêu cầu. đó là những gì tôi muốn nói rằng nó tạo ra một máy chủ.
Naeem Shaikh

1
@Naeem Shaikh Nó không phục vụ bất cứ điều gì. Gọi một cái gì đó không phục vụ bất cứ điều gì một máy chủ không có ý nghĩa.
Roger F. Gay

1

Giả sử có một khách sạn tên là Apache Hotel có một người phục vụ cho mỗi khách hàng.

Ngay sau khi khách hàng gọi món salad, người phục vụ đi đến đầu bếp và nói với anh ta. Trong khi đầu bếp chuẩn bị thức ăn, người phục vụ đợi. Đây,

Chef => File System,

Waiter => Thread,

Customer => Event.

Ngay cả khi khách gọi nước, người phục vụ chỉ mang đến sau khi phục vụ món salad. Người phục vụ tiếp tục đợi cho đến khi món salad được đầu bếp chuẩn bị. Trạng thái này được gọi là trạng thái chặn. Ngay cả khi khách sạn phát triển mỗi khách hàng nên có những người phục vụ khác nhau để phục vụ. Điều này làm tăng tính chặn của các chủ đề (người phục vụ).

Bây giờ, đến Node Hotel chỉ có một người phục vụ cho tất cả các khách hàng. Nếu khách hàng đầu tiên gọi súp, người phục vụ nói với đầu bếp và chuyển sang khách hàng thứ hai. Sau khi thức ăn đã sẵn sàng người phục vụ giao cho khách hàng. Ở đây khách hàng sẽ không chờ đợi. Trạng thái này được gọi là trạng thái Không chặn. Người phục vụ duy nhất (Chủ đề) phục vụ tất cả khách hàng và khiến họ hài lòng.

Do đó, Node là một ứng dụng đơn luồng rất nhanh.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.