node.js 자체 또는 정적 파일을 제공하기위한 nginx 프런트 엔드?


90

더 빠른 벤치 마크 또는 비교가 있습니까? 노드 앞에 nginx를 배치하고 정적 파일을 직접 제공하거나 노드 만 사용하고이를 사용하여 정적 파일을 제공합니까?

nginx 솔루션이 더 관리하기 쉬운 것 같습니다.


3
또한 한 서버를 다른 서버 위에 사용하기 위해 작성해야하는 구성 및 코드의 양에 따라 달라집니다. IPO를 기대하지 않고 앱 서버가 이미 구성되어 있고 필요한 모든 작업을 수행하는 경우 충분하지 않을 때까지 계속 사용할 수 있습니다.
m33lky 2012

답변:


119

나는 여기에 대한 대답에 동의하지 않을 것입니다. Node는 잘 작동하지만, 올바르게 구성되면 nginx가 가장 빠릅니다. nginx는 작은 메모리 풋 프린트로 유사한 패턴 (필요할 때만 연결로 돌아 가기)에 따라 C에서 효율적으로 구현됩니다. 또한, 작업을 수행하는 것은 OS 커널 자체이기 때문에 가능한 한 빨리 파일을 제공 할 수 있도록 sendfile syscall을 지원합니다 .

이제 nginx는 프런트 엔드 서버로서 사실상의 표준이되었습니다. 정적 파일, gzip, SSL 및 나중에로드 밸런싱을 제공 할 때 성능을 위해 사용할 수 있습니다.

추신 : 이것은 파일이 요청시 디스크에있는 것처럼 실제로 "정적"이라고 가정합니다.


7
사소한 참고 사항 : node.js도 지원 sendfile하지만 코드를 작성해야하는 것 같습니다. blog.std.in/2010/09/09/using-sendfile-with-nodejs
tuomassalo

정적 콘텐츠를 제공하는 것 외에 공용 도메인에 기본 웹 서버 (Tomcat / Jetty / IIS 등)를 노출하는 것보다 Nginx 성능이 더 나은 이유는 무엇입니까?
raffian

1
앱에 요청이 발생하면 먼저 nginx를 통해 라우팅하여 해당 요청이 마술처럼 빠르게 이루어지지 않습니다 (nginx가 정적 CSS 및 js, gzip 및 SSL을 처리하는 최상의 경우 눈에 띄게 더 빠를 수 있음). 그러나 nginx는 또한 최고의 소프트웨어로드 밸런서 중 하나이므로 대부분의 서버가 중간 정도의 높은로드로 전환되는 것으로 악명이 높기 때문에 이것이 중요 할 수 있습니다.
m33lky

그러나 Node.js를 사용하여 비동기 방식으로 파일을 서버 할 수 있습니다. NGINX로 그렇게 할 수 있습니까?
드라고 C.

1
@lwansbrough는 이러한 벤치 마크를 테이블로 가져옵니다. 이 주제에서 적어도 한 사람은 자신의 실험을했습니다.
m33lky jul.

75

nginx, Express.js (정적 미들웨어) 및 클러스터 된 Express.js를 비교 ab -n 10000 -c 100하여 정적 1406 바이트를 제공하기 위해 신속하게 수행했습니다 favicon.ico. 도움이 되었기를 바랍니다:

여기에 이미지 설명 입력

불행히도 내 컴퓨터에서 nginx가 오류를 던지기 시작하므로 1000 또는 10000 동시 요청을 테스트 할 수 없습니다.

편집 : artvolk에서 제안한대로 클러스터 + static미들웨어 (느림) 의 결과는 다음과 같습니다.

여기에 이미지 설명 입력


감사합니다. favicon : senchalabs.org/connect/favicon.html 에이 미들웨어를 사용 했습니까? 아니면 그냥 정적 파일로 제공 했습니까 ?
artvolk 2013 년

@artvolk 파비콘 하나 :)
gremo

3
테스트에 대해 NODE_ENV = production을 설정 했습니까? 캐싱 static미들웨어가 프로덕션에서 할 것이기 때문에 그것은 엄청난 차이를 만들 것이기 ​​때문입니다 .
ruffrey

21
이탈리아어를 사용하지 않는 사람들에게 x 축은 요청 수이고 Y 축은 파일을 제공하는 데 걸린 ms입니다. 데이터를 잘못 읽지 않았는지 확인하고 싶었 기 때문에 구글 번역을해야했습니다. 이 데이터는 믿을 수 없을 정도로 도움이되었고 여기 벤치 마크 테스트에 정말 감사드립니다. 결국 nginx를 고수 할 것입니다
JL Griffin

1
NODE_ENV = 프로덕션 세트입니까?
basickarl

11

@gremo의 차트에 대해 다른 해석이 있습니다. 동일한 요청 수 (9-10k 사이)에서 노드와 nginx 스케일이 모두 나에게 보입니다. nginx에 대한 응답의 지연 시간은 일정한 20ms만큼 낮지 만 사용자가 반드시 그 차이를 인식 할 것이라고는 생각하지 않습니다 (앱이 잘 빌드 된 경우). 고정 된 수의 머신이 주어지면 노드가 대부분의로드가 처음에 발생한다는 점을 고려하여 노드 머신을 nginx로 변환하기 전에 상당한 양의로드가 필요합니다. 이에 대한 한 가지 대위법은로드 밸런싱을 위해 이미 머신을 nginx 전용으로 사용하는 경우입니다. 이 경우 정적 콘텐츠도 제공 할 수 있습니다.


1
"확실히 nginx에 대한 응답의 지연 시간이 20ms만큼 낮지 만 사용자가 반드시 그 차이를 인식 할 것이라고 생각하지 않습니다." 여러분이 이러지 않기를 진심으로 바랍니다. 사용자가 1ms 차이를 감지 할 것이라는 증거가 있습니다!
Navin

4
인용 필요
David Burrows 2018

9

어느 쪽이든 정적 파일을 캐시하도록 Nginx를 설정했습니다 ... 거기에 큰 차이가 있습니다. 그런 다음 노드에서 서비스를 제공하는지 여부에 관계없이 기본적으로 노드 앱에서 동일한 성능과 동일한 부하 의존성을 얻습니다.

저는 개인적으로 Nginx 프런트 엔드가 대부분의 경우 정적 자산을 제공한다는 생각이 마음에 들지 않습니다.

1) 프로젝트는 이제 동일한 머신에 있어야합니다. 또는 자산 (nginx 머신에서) 및 웹 앱 (확장을 위해 여러 머신에서)으로 분할되어야합니다.

2) Nginx 구성은 이제 정적 자산의 경로 위치를 유지하고 변경시 다시로드해야합니다.


0

대답하기 어려운 질문입니다. 정적 파일을 제공하기 위해 정말 가벼운 노드 서버를 작성했다면 nginx보다 성능이 더 좋을 가능성이 높지만 그렇게 간단하지는 않습니다. ( 다음 은 nodejs 파일 서버와 lighttpd를 비교 하는 "벤치 마크" 입니다. 정적 파일을 제공 할 때 ngingx와 성능이 비슷합니다.)

정적 파일 제공과 관련된 성능은 종종 작업을 수행하는 웹 서버 이상으로 떨어집니다. 가능한 최고의 성능을 원하는 경우 CDN을 사용하여 파일을 제공하여 최종 사용자의 지연 시간을 줄이고 에지 캐싱의 이점을 누릴 수 있습니다.

그것에 대해 걱정하지 않는다면 노드는 대부분의 상황에서 정적 파일을 잘 제공 할 수 있습니다. 노드는 단일 스레드이고 모든 차단 I / O가 전체 프로세스를 차단하고 애플리케이션 성능을 저하시킬 수 있기 때문에 또한 의존하는 비동기 코드에 적합합니다. 비 차단 방식으로 코드를 작성하고있을 가능성이 높지만 동기식으로 작업을 수행하는 경우 차단을 유발하여 다른 클라이언트가 정적 파일을 제공하는 속도를 저하시킬 수 있습니다. 쉬운 해결책은 블로킹 코드를 작성하지 않는 것이지만 때로는 가능성이 없거나 항상 적용 할 수는 없습니다.


9
이건 말도 안돼. 이 질문은 Apache가 아닌 nginx 에 관한 것 입니다. nginx와 node는 이벤트 루프에 libev를 사용합니다. Nginx는 노드보다 몇 배 더 빠를 것입니다. 그중 하나는 VM의 오버 헤드가 없으며 특별히 파일 시스템에서이 작업을 수행하도록 작성되었습니다.
Evan Carroll

1
libev는 초기 노드였습니다. Libuv는 노드가 크로스 플랫폼을 실행할 수 있도록이 역할을 채택했습니다.
tsturzl 2014 년

1
나는 비동기 코드가 이것에 어떻게 영향을 미치는지 알지 못합니다. 노드의 성능은 Nginx의 성능보다 훨씬 나빠질 것이며 디스크에서 파일을 읽도록 요청하는 클라이언트가 많을 때 발생하는 I / O 차단 때문일 수 있습니다. 모범 사례는 노드 앱이 애플리케이션 로직을 처리 할 수 ​​있도록 정적 자산에 항상 Nginx를 사용하는 것입니다. 우리는 Node가 더 잘 수행 할 것이지만 실제 세계에서는 Nginx가 10 점 만점에 9 배씩 이길 이론적 시나리오에 대해 이야기 할 수 있습니다.
wgp

-11

순전히 node.js가 많은 측면에서 nginx를 능가 할 수 있다고 확신합니다.

NginX에는 내장 캐시가 있지만 node.js는 공장 설치된 상태로 제공되지 않습니다 (사용자 자신의 파일 캐시를 만들어야 함). 사용자 정의 파일 캐시는 매우 간단하기 때문에 nginx 및 시장의 다른 서버보다 성능이 뛰어납니다.

또한 Nginx는 다중 코어에서 실행됩니다. Node의 잠재력을 최대한 활용하려면 노드 서버를 클러스터링해야합니다. 방법을 알고 싶다면 오후를 기쁘게 해주세요.

노드로 성능 열반을 달성하려면 심층 파기가 필요합니다. 그게 유일한 문제입니다. 일단 완료되면 네 ... Nginx를 이깁니다.


1
나는 당신이 말하는 것을 믿고 싶지만 실제 세계를 기반으로한다면 벤치 마크가 필요합니다. 하지만 경우 가장자리하지
스테판 Rogin

5
재미있는 점은이 답변이 가장 많은 찬성표를 가진 선택된 답변만큼 많은 사실을 가지고 있다는 것입니다. 사람들은 [다른 웹 응용 프로그램 기술 삽입]에서 그렇게하는 방법을 배웠기 때문에 앞에 웹 서버를 선호한다고 생각합니다. 이것은 좋은 대답은 아니지만 유감으로 +1합니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.