programing

Node.js "server"는 Nginx 또는 Apache 서버와 어떻게 비교됩니까?

muds 2023. 9. 8. 21:46
반응형

Node.js "server"는 Nginx 또는 Apache 서버와 어떻게 비교됩니까?

최근에 Node.js를 공부하다가 간단한 Node.js 기반 서버를 작성하는 것에 대한 자료를 발견했습니다.예를 들면 다음과 같습니다.

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

코드에 무슨 일이 일어나고 있는지 이해하는 것 같지만, 용어가 약간 혼란스럽습니다.서버라는 말을 들으면 아파치나 Nginx 같은 것들이 떠올라요.저는 그것들을 제 웹 애플리케이션을 담을 수 있는 컨테이너와 같다고 생각하는 것에 익숙합니다.Node.js 서버는 Nginx/Apache 서버와 어떻게 다릅니까?Nginx와 같은 것 내에 Node.js 기반 서버(즉, 코드)를 설치하여 실행할 수 있다는 것이 사실이 아닙니까?그렇다면 왜 둘 다 "서버"라고 불릴까요?

서버에요, 맞아요.

node.js 웹 애플리케이션은 Nginx나 Apache와 마찬가지로 완전한 웹 서버입니다.

다른 웹 서버를 사용하지 않고 node.js 응용 프로그램을 제공할 수 있습니다.코드를 다음으로 변경합니다.

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

실제로 일부 프로젝트에서는 node.js를 다른 서버(아파치 포함)의 프런트 엔드 로드 밸런서로 사용합니다.

node.js는 이 작업을 수행하는 유일한 개발 스택이 아닙니다.Go, Java 및 Swift의 웹 개발 프레임워크도 이를 수행합니다.

왜요?

처음에는 CGI가 있었습니다.CGI는 괜찮았고 잘 작동했습니다.Apache는 요청을 받고, URL이 CGI 앱을 실행하고, 해당 CGI 앱을 실행하고, 데이터를 환경 변수로 전달하고, stdout을 읽고 브라우저에 데이터를 다시 제공해야 합니다.

문제는 속도가 느리다는 것입니다.CGI 앱이 정적으로 컴파일된 작은 C 프로그램이었지만 정적으로 컴파일된 작은 C 프로그램 그룹이 유지보수가 어려워졌을 때는 괜찮습니다.그래서 사람들은 스크립트 언어로 쓰기 시작했습니다.그 후 유지보수가 어려워졌고 사람들은 객체 지향 MVC 프레임워크를 개발하기 시작했습니다.이제 우리는 문제를 겪기 시작했습니다. 모든 요청은 모든 클래스를 컴파일하고 HTML을 제공하기 위해 모든 개체를 생성해야 합니다. (프레임워크는 서비스할 동적이 없다는 것을 파악해야 하기 때문입니다.)

요청할 때마다 모든 개체를 생성할 필요가 없다면 어떻게 합니까?

사람들은 그렇게 생각했습니다.그리고 그 문제를 해결하기 위한 노력에서 몇 가지 전략이 나왔습니다.의 것 중 를 웹 서버에 직접 내장하는 것이었습니다.mod_php 를 글로벌 컴파일된 클래스와 개체는 전역 변수에 저장할 수 있으므로 캐시할 수 있습니다.또 다른 전략은 사전 편찬을 하는 것이었습니다.그리고 또 다른 전략은 애플리케이션을 정규 서버 프로세스로 실행하고 FastCGI와 같은 사용자 정의 프로토콜을 사용하여 웹 서버와 대화하는 것이었습니다.

그 후 일부 개발자들은 단순히 HTTP를 앱->서버 프로토콜로 사용하기 시작했습니다.사실상, 그 앱은 HTTP 서버이기도 합니다.되지 않은 앱을 수 입니다.curl앱을 지원하기 위해 수정된 웹 서버가 필요한 것이 아니라 역방향 프록시 또는 리디렉션을 수행할 수 있는 모든 웹 서버가 필요합니다.

Apache/Nginx를 사용하는 이유는 무엇입니까?

node.js 앱을 서비스할 때 자신의 웹 서버 작성자임을 유의하십시오.앱에 있는 모든 잠재적인 버그는 인터넷에서 직접적으로 악용 가능한 버그입니다.몇몇 사람들은 이것에 대해 불편해 합니다.

node.js 앱 앞에 Apache 또는 Nginx 계층을 추가하면 앱에 대한 인터페이스로 라이브 인터넷에서 전투 테스트를 받고 보안이 강화된 소프트웨어를 사용할 수 있습니다.이것은 약간의 지연 시간(역방향 프록시)을 추가하지만 대부분의 사람들은 그럴만한 가치가 있다고 생각합니다.

이것은 node.js의 초기에 표준 조언이었습니다.그러나 요즘에는 node.js를 인터넷에 직접 노출시키는 사이트와 웹 서비스도 있습니다.이 모듈은 이제 신뢰할 수 있도록 인터넷에서 꽤 잘 전투 테스트를 거쳤습니다.

NodeJs는 자체 서버를 만듭니다.보다시피 용어는 매우 명확합니다.

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

서버를 만들고 포트 3000에서 http 요청을 듣습니다.

프로젝트 중 하나에 nginx를 사용했지만 여러 nodejs 인스턴스에 대한 로드 밸런싱 장치에 가까웠습니다.

하면, 3000과 3001에서 의 nodejs 해 되고 가 해 되고 가 이제 여전히 사용할 수 있습니다.nginx당신의 실제 상황을 듣기 위한 서버로서.httpn를 방문합니다.port 80을 , 로 수 .nodejs 또는 즉버는버다더다a더er,,ererr버버e는loadbalancer. 그래서 당신은 여전히 무엇이든 사용할 수 있습니다.nginx를 제공합니다.nodejs.

여기에 이미 좋은 질문이 있었습니다.

Apache Hotel이라는 이름의 호텔이 있다고 가정해 보겠습니다. 각 고객마다 웨이터를 배치되어 있습니다.

손님이 샐러드를 주문하자마자 웨이터는 요리사에게 가서 그에게 말합니다.요리사가 음식을 준비하는 동안 웨이터는 기다립니다.여기서,

Chef => File System,

Waiter => Thread,

Customer => Event.

손님이 물을 주문할 때도 웨이터는 샐러드를 대접한 후에만 가져다 줍니다.웨이터는 요리사에 의해 샐러드가 준비될 때까지 계속 기다립니다.이 상태를 차단 상태라고 합니다.호텔이 성장하더라도 고객마다 서비스할 웨이터가 달라야 합니다.이렇게 하면 스레드(웨이퍼)의 차단이 증가합니다.

노드 호텔에 온 지금은 모든 손님을 위한 웨이터가 한 명뿐입니다.첫번째 손님이 수프를 주문하면 웨이터는 요리사에게 말하고 두번째 손님에게 갑니다.음식이 준비된 후 웨이터는 손님에게 배달합니다.여기서 고객은 기다리지 않습니다.이 상태를 Non-Blocking 상태라고 합니다.한 명의 웨이터(실)가 모든 고객을 응대하고 그들을 기쁘게 합니다.

따라서 단일 스레드 애플리케이션인 노드는 매우 빠릅니다.

언급URL : https://stackoverflow.com/questions/38821947/how-does-a-node-js-server-compare-with-nginx-or-apache-servers

반응형