Node.js 만 사용 및 Apache / Nginx와 함께 Node.js 사용


224

실제 배포에서 Node.js를 서버로만 사용하는 것을 선호하는 경우는 무엇입니까?

하나 않으면 하지 Node.js를 더 잘 재생 어떤 Node.js를 만, 사용하려면? 아파치 또는 Nginx?

답변:


207

Node.js 앞에 다른 웹 서버를 설치해야하는 몇 가지 이유가 있습니다.

  • Node.js 프로세스의 권한 / setuid에 대해 걱정할 필요가 없습니다. 루트 만 일반적으로 포트 80에 바인딩 할 수 있습니다. nginx / Apache가 루트로 시작하고 포트 80에 바인딩 한 다음 루트 권한을 포기하는 것에 대해 걱정한다면 노드 앱이 걱정할 필요가 없음을 의미합니다.
  • 이미지, css, js 및 html과 같은 정적 파일 제공 노드는 적절한 정적 파일 웹 서버를 사용하는 것보다 효율성이 떨어질 수 있습니다 (일부 시나리오에서는 노드가 더 빠를 수도 있지만 이는 일반적이지 않습니다). 보다 효율적으로 제공되는 파일 이외에도 노드 외부에서 서비스를 제공하는 경우와 같이 eTag 또는 캐시 제어 헤더를 처리하는 것에 대해 걱정할 필요가 없습니다. 일부 프레임 워크가이를 처리 할 수도 있지만 확실하게 원할 것입니다. 그럼에도 불구하고 여전히 느려질 것입니다.
  • Matt Sergeant가 자신의 답변에서 언급했듯이 노드 서비스가 중단되면 의미있는 오류 페이지를 더 쉽게 표시하거나 정적 사이트로 돌아갈 수 있습니다. 그렇지 않으면 사용자는 연결 시간이 초과 될 수 있습니다.
  • 노드 앞에서 다른 웹 서버를 실행하면 노드에 대한 보안 결함 및 DoS 공격을 완화하는 데 도움이 될 수 있습니다. 실제 예를 들어 CVE-2013-4450Node 앞에서 Nginx와 같은 것을 실행하여 방지됩니다 .

CDN을 통해 또는 Varnish와 같은 캐싱 서버 뒤에서 정적 파일을 제공해야한다고 말함으로써 두 번째 글 머리 기호에주의해야합니다. 이 작업을 수행하는 경우 원점이 Node, Nginx 또는 Apache인지는 중요하지 않습니다.

nginx를 사용한주의 사항 : 웹 소켓을 사용하는 경우 웹 소켓을 사용하도록 연결을 업그레이드하기위한 지원 만 추가했기 때문에 최신 버전의 nginx (> = 1.3.13)를 사용해야합니다.


11
express.staticETag 및 캐시 제어 헤더를 잘 처리합니다.
robertklep


4
pauljz, 느리게 백업 할 벤치 마크가 있습니까? @pawlakpp이 지적한 기사는 Node.js 가로 드에서 훨씬 빠르다고 말합니다.
사무엘 네프

3
여기에 몇 가지 관련 토론이 있습니다. stackoverflow.com/questions/9967887/… 몇 가지 추가 관점이 있습니다. 거기에있는 벤치 마크 (추가 벤치 마크를 요청한 이후)에는 node.js / express가 클러스터링되어 눈에 띄게 저조한 것으로 나타났습니다. 내 생각은 정적 파일 제공 및 요청 처리를 노드 이벤트 루프에서 완전히 유지하고 노드에서 발생 해야하는 작업에 대한주기를 저장하는 것이 가장 좋습니다. 그러나 솔직히 노드에서 정적 항목을 제공하면 괜찮을 것입니다. 별거 아니에요
pauljz

4
노드 만 직접 사용하는 경우 :80authbind를 사용하여 간단히 루트로 노드를 실행하지 않고 예약 된 포트에 바인딩 할 수 있습니다 . thomashunter.name/blog/using-authbind-with-node-js
wyqydsyq

70

pauljz의 답변에 한 가지 더 많은 이유를 추가하기 위해 백엔드 서버를 다시 시작할 때 502 오류 페이지를 표시하거나 어떤 이유로 충돌이 발생하도록 프런트 엔드 서버를 사용합니다. 이를 통해 사용자는 연결을 설정할 수 없다는 오류가 발생하지 않습니다.


28

정적 파일을 제공하기 위해 Node를 사용 하는 것은 당신이 무엇을하고 있는지 아는 한 모든 상황에서 좋습니다 . 많은 (모든?) 경쟁 기술 (PHP, Ruby, Python 등)이 응용 프로그램 서버 앞에 HTTPD 또는 Nginx와 같은 웹 서버를 필요로하므로 정적 파일을 제공하기 위해 응용 프로그램 서버를 사용하는 것은 새로운 패러다임입니다. .

Node로 정적 파일을 제공하는 것에 대해 읽은 모든 객관적인 이유는 가장 잘 알고있는 것을 사용하거나 더 잘 테스트되고 더 안정적인 것으로 인식되는 것을 사용한다는 아이디어를 중심으로합니다. 이것들은 실제로 말하는 매우 유효한 이유이지만 순수한 기술적 관련성은 거의 없습니다.

Node에서 가능하지 않은 클래식 웹 서버에서 가능한 기능을 찾지 못하면 (그리고 의심 할 것입니다), 가장 잘 알고 있거나 두 가지 방법 중 하나를 사용하여 선호하는 것을 선택하십시오.

Nginx와 Apache는 노드와 동일하게 "재생"됩니다. 노드에 관계없이 비교해야합니다.


2
일반적인 기술 비교에 대한 좋은 관점 : "노드에서 정적 파일을 제공하는 것에 대해 읽은 모든 객관적인 이유는 가장 잘 알고있는 것을 사용하거나 더 나은 테스트 /보다 안정적인 것으로 인식되는 것을 사용한다는 아이디어를 중심으로합니다. 실질적으로 말하지만 기술적으로 관련성이 거의 없습니다. " 요즘 너무 많은 비교는 편견이 있고 열등하지만 시간이 오래 걸리는 기술에 대한 경험과 안락함의 수하물에 근거합니다.
Sunny

예. 그러나 실제로 / 주관적 / 이유입니다. 객관적인 이유의 좋은 예는 벤치 마크 일 것입니다. 대부분 내가 찾은 nginx> nodejs (실제로 내 자신을해야하지만 ....)
Nick

@Nick 당신은 절대적으로 맞습니다. 과학적인 벤치마킹 전문가는 아니지만 사람들이 웹 검색을 할 수 있도록 몇 가지가 있습니다. 내가 말할 것은 두 대의 서버 대신 한 대의 서버를 사용하는 것이 간단하다는 이점이 있다고 생각합니다. 무언가 잘못 될 가능성은 적습니다. 반면에 Nginx는 일반적으로 모든 유닉스 계열 시스템에 좋은 구성의 패키지를 가지고 있지만 Node를 사용 systemd하면 pm2, 등의 통합을 알아 내야합니다 . 그래서 플러스와 마이너스가 있으며 사용자가 독을 선택해야합니다. .

나는 그것이 반대라고 생각했다. 요청 당 파일을 처리하는 프로세스를 전달할 필요가 없기 때문에 노드가로드에서 더 좋을 것입니다 (아마 순수한 언로드 속도가 아닐 것입니다). 원격 클라이언트는 다른 모든 수천 개의 클라이언트가있는 동일한 스레드에서 준비됩니다. 다중 프로세서가있는 경우이 과정은 물론 중단됩니다. 노드에서 지금 사용 방법을 알고 있지 않는 한. 또는 웹 서버는 협력적인 멀티 태스킹을 사용하여 정적 페이지를 서버에 올릴 수 있습니다.
Gerard ONeill

1

추가 사항 : 리버스 프록시가 필요한 경우, 예를 들어 동일한 포트에서 Websocket 서버를 실행하거나 일부 기술을 혼합 할 수도 있습니다 (NodeJS 일부 요청 및 PHP 또는 기타 다른 항목으로 응답)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.