Đó 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);
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_php
trong 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.Server
mô-đun tại là khá tốt chiến thử nghiệm trên internet để được tin cậy.
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