Node.js 기반 서버 대 Apache HTTP 서버와 같은 것
저는 최근에 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!");
});
... 이제 코드에서 무슨 일이 일어나고 있는지 이해하는 것 같지만 ... 용어에 약간 혼란스러워합니다 .... 서버라는 용어를들을 때 Apache 또는 Nginx와 같은 것을 생각하기 때문입니다. 나는 그것들이 내 웹 애플리케이션을 담을 수있는 컨테이너라고 생각하는 데 익숙하다. Node.js 서버는 Nginx / Apache 서버와 어떻게 다릅니 까? Node.js 기반 서버 (예 : 코드)를 Nginx와 같은 곳에 배치하여 실행할 수 있다는 것이 사실이 아닙니까? Node.js 코드는 Nginx를 사용하여 배치하고 제공 할 수있는 애플리케이션 인 것처럼 보이지만 둘 다 "서버"라고하는 이유는 무엇입니까?
네, 서버입니다.
node.js 웹 애플리케이션은 Nginx 또는 Apache와 같은 완전한 웹 서버입니다.
실제로 다른 웹 서버를 사용하지 않고도 node.js 애플리케이션을 제공 할 수 있습니다. 코드를 다음과 같이 변경하십시오.
app = express();
http.createServer(app).listen(80); // serve HTTP directly
실제로 일부 프로젝트에서는 다른 서버 (Apache 포함) 의 프런트 엔드 로드 밸런서 로 node.js를 사용 합니다.
node.js가이를 수행하는 유일한 개발 스택은 아닙니다. Go, Java 및 Swift의 웹 개발 프레임 워크도이 작업을 수행합니다.
왜?
처음에는 CGI였습니다. CGI는 괜찮 았고 정상적으로 작동했습니다. Apache는 요청을 받고 URL이 CGI 앱을 실행하고 해당 CGI 앱을 실행하고 데이터를 환경 변수로 전달하고 표준 출력을 읽고 데이터를 브라우저에 다시 제공해야 함을 발견합니다.
문제는 느리다는 것입니다. CGI 앱이 정적으로 컴파일 된 작은 C 프로그램 이었지만 정적으로 컴파일 된 작은 C 프로그램 그룹이 유지 관리하기 어려워지면 괜찮습니다. 그래서 사람들은 스크립팅 언어로 쓰기 시작했습니다. 그런 다음 유지 관리가 어려워졌고 사람들은 객체 지향 MVC 프레임 워크를 개발하기 시작했습니다. 이제 문제가 발생했습니다. 모든 요청은 서비스 할 동적이없는 경우에도 일부 HTML을 제공하기 위해 모든 클래스를 컴파일하고 모든 객체를 만들어야합니다 (프레임 워크가 제공 할 동적이 없음을 파악해야하기 때문).
매 요청마다 모든 객체를 생성 할 필요가 없다면 어떨까요?
사람들이 그렇게 생각했습니다. 그리고 그 문제를 해결하려는 시도에서 몇 가지 전략이 나왔습니다. 가장 초기의 방법 중 하나는 mod_php
Apache 와 같은 웹 서버에 인터프리터를 직접 포함하는 것이 었습니다 . 컴파일 된 클래스와 객체는 전역 변수에 저장 될 수 있으므로 캐시됩니다. 또 다른 전략은 사전 컴파일을 수행하는 것이 었습니다. 또 다른 전략은 애플리케이션을 일반 서버 프로세스로 실행하고 FastCGI와 같은 사용자 지정 프로토콜을 사용하여 웹 서버와 대화하는 것이 었습니다.
그런 다음 일부 개발자는 단순히 HTTP를 앱-> 서버 프로토콜로 사용하기 시작했습니다. 실제로 앱은 HTTP 서버이기도합니다. 이 방법의 장점은 버그가 있거나 테스트되지 않은 새로운 프로토콜을 구현할 필요가 없으며 웹 브라우저 (또는 일반적으로 curl
)를 사용하여 앱을 직접 디버깅 할 수 있다는 것 입니다. 또한 앱을 지원하기 위해 수정 된 웹 서버가 필요하지 않으며 역방향 프록시 또는 리디렉션을 수행 할 수있는 웹 서버 만 있으면됩니다.
Apache / Nginx를 사용하는 이유는 무엇입니까?
node.js 앱 노트를 제공 할 때 자신이 자체 웹 서버의 작성자라는 점을 유의하십시오. 앱의 잠재적 버그는 인터넷에서 직접 악용 할 수있는 버그입니다. 어떤 사람들은 이것에 대해 (당연히) 불편합니다.
node.js 앱 앞에 Apache 또는 Nginx 레이어를 추가하면 앱에 대한 인터페이스로 라이브 인터넷에서 테스트를 거쳐 보안이 강화 된 소프트웨어가 있습니다. 약간의 지연 시간 (역방향 프록시)을 추가하지만 대부분은 그만한 가치가 있다고 생각합니다.
이것은 node.js의 초기에 표준 조언이었습니다. 그러나 요즘에는 node.js를 인터넷에 직접 노출하는 사이트와 웹 서비스도 있습니다. 이 http.Server
모듈은 이제 인터넷에서 신뢰할 수있는 경쟁 테스트를 거쳤습니다.
NodeJ는 자체 서버를 만듭니다. 보시다시피 용어는 매우 명확합니다.
http.createServer(app).listen(3000);
서버를 만들고 포트 3000에서 http 요청을 수신합니다.
프로젝트 중 하나에서 nginx를 사용했지만 여러 nodejs 인스턴스에 대한로드 밸런서와 비슷했습니다.
Lets say you have two nodejs instances running on port 3000 and 3001, Now you can still use nginx
as a server to listen your actual http
calls on port 80
, and may want to redirect your request to nodejs
server or maybe some other server, more like a loadbalancer
. So you can still use whatever nginx
provides with nodejs
.
A good question already asked here.
Assume there is a hotel named Apache Hotel which has a waiter for each customer.
As soon as the customer orders a salad, the waiter goes to the chef and tells him. While the chef prepares the food, the waiter waits. Here,
Chef => File System,
Waiter => Thread,
Customer => Event.
Even when the customer orders water the waiter brings only after serving the salad. The waiter keeps on waiting until the salad is prepared by the chef. This state is referred as blocking state. Even if the hotel grows each customer should have different waiters to serve. This increases the blocking of threads(waiters).
Now, coming to Node Hotel there is only one waiter for all the customers. If first customer orders soup the waiter tells the chef and goes to second customer. After the food is ready the waiter delivers to the customer. Here the customer will not wait. This state is referred as Non-Blocking state. The single waiter(Thread) servers all the customer and makes them happy.
Thus, Node which is a single threaded application is very fast.
'IT박스' 카테고리의 다른 글
Julia에서 @printf가 함수 대신 매크로 인 이유는 무엇입니까? (0) | 2020.12.08 |
---|---|
Android 지원 중단 아파치 모듈 (HttpClient, HttpResponse 등) (0) | 2020.12.08 |
MVVM으로 다중 선택 관리 (0) | 2020.12.08 |
phpMyAdmin을 보호하는 방법 (0) | 2020.12.08 |
정적 생성자 란 무엇입니까? (0) | 2020.12.08 |