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

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

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



답변

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

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

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


답변

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

여기에 이미지 설명 입력

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

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

여기에 이미지 설명 입력


답변

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


답변

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

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

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

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


답변

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

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

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


답변

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

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

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

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


답변