Featured image of post Nginx VS Apache

Nginx VS Apache

NginX와 Apache 비교

Apache

아파치는 클라이언트 요청을 받으면 MPM(Multi Processing Module : 다중처리모듈) 방식으로 처리한다.

스레드/프로세스 기반 구조 동작

  1. ServerSocket으로 request A가 들어오면 Thread를 할당해준다.
  2. Thread는 해당 socket을 가지고 read, write작업 등을 수행한다.
  3. 수행 도중 ServerSocket으로 request B가 들어오면, context switching이 일어난다.
  4. 새로 들어온 요청에 쓰레드를 배분하고, 또 해당 소켓을 가지고 작업을 수행한다.
  5. 아직 마무리되지 않은 A를 처리하기 위해 일정 기간마다 지속적으로 context switching을 반복하고 모든 작업을 마무리 한다.

Prefork MPM

실행중인 프로세스를 복제하여 처리하는 방식

각 프로세스는 한번에 한 연결만 처리하고, 요청량이 많아질수록 프로세스를 복제하여 동작한다.

프로세스를 복제하는 방식이기 떄문에 메모리가 많이 소비된다

연결 수 = 프로세스 수

Worker MPM

Prefork 방식은 한개의 프로세스가 한개의 스레드로 처리되지만, Worker 방식은 한개의 프로세스가 여러 쓰레드를 사용하여 처리한다.

쓰레드를 사용하기 떄문에 Prefork 방식보다 메모리 소모가 적고, 통신량이 많을 때 유리하다.

문제점

아파치는 접속마다 프로세스 또는 쓰레드를 생성하는 구조이다.

동시 접속 요청이 많을수록 그만큰 생성 비용이 들고 대용양 요청을 처리할 수 있는 웹 서버로서 한계가 나타난다.

Nginx

한개 또는 고정된 프로세스만 생성하고, 프로세스 내부에서 비동기 방식으로 작업을 처리한다. 따라서 동시 접속 요청이 많아도 프로세스 또는 쓰레드 생성 비용이 존재하지 않는다.

Event-Driven 방식

Event-Driven 방식은 Reactor pattern을 사용한다.

  1. Reactor는 이벤트가 들어오면 알맞는 handlerdispatch 해준다.
  2. Handlerdispatch된 이벤트를 받아서 처리하는 역할을 수행

Reactor pattern
이벤트 처리(event handling)디자인 패턴으로 하나의 Reactor가 계속 이벤트를 찾고 이벤트가 발생(trigger)하면 해당 이벤트 처리기(event handler)에게 알린다.

Nginx와 Apache의 차이점

컨텐츠의처리 방식

  • 정적 컨텐츠 처리

    • Apache: 전통적인 파일기반 방식의 정적 컨텐츠
    • Nginx: 이벤트 처리/비동기식/논블로킹 방식 처리로 인해 정적 컨텐츠 제공시 고속 처리 가능
  • 동적 컨텐츠 처리

    • Apache: 서버 내에서 처리
      • 기본적으로 유연성과 범용성을 갖추는 방식으로 서버 자체에서 동적 컨텐츠 처리가 가능하다.
    • Nginx: 동적 컨텐츠를 처리하지 않음
      • 동적 웹 페이지 컨텐츠를 가진 모든 요청을 위해 외부 자원과 연계한다. 따라서 최종적으로 동적 컨텐츠가 다시 돌아올 때까지 기다렸다가 클라이언트에게 전달하는 방식을 가지고 있다.

OS 지원에 대한 범용성

  • Apache: 리눅스, BSD, UNIX, WINDOW
    • 역사가 있는 만큼 지원 범위가 다양하기 때문에 일관성 있는 웹 서비스 아키텍쳐를 구현할 수 있다.
  • Nginx: LINUX, BSD, UNIX, WIN(부분 지원)
    • 다양한 운영체제를 지원하지만 아파치 만큼 완벽히 지원하지 않는다.

분산/중앙집중식 구성 방식

  • Apache: 분산/중앙집중식 구성 채택
    • .htaccess를 통해 디렉토리별로 추가 구성을 할 수 있다. 단일 기반 뿐만 아니라 분산형 구칙이 가능하므로 대용량 서버 아키텍쳐에서 자원만 충분하다면 여러 웹 서비스를 구현 할 수 있다.
  • Nginx: 중앙집중식 구성 채택
    • 아파치처럼 .htaccess를 지원하지 않는다. 따라서 추가 구성을 할 수 없는 단점이 있다. 하지만 이러한 방식은 가상화, 클라우드, MSA와 같은 아키텍쳐에서는 오히려 경량화와 성능 보장이라는 측면에서 단점이 되지 않을 수도 있다.

모듈 및 확장성/보안

  • Apache
    • 60개 이상의 다양한 기능과 모듈을 지원하며, 필요에 따라 활성화 또는 비활성 시킬 수 있다. 동적 모듈을 통해 웹 서버의 사용자 지정도 가능하게 할 수 있는 등 다양한 디자인과 확장이 가능하다.
    • 보안을 위해 다양한 Web기반 DDoS 방어 기술을 제공한다.
  • Nginx
    • 다른 코어 모듈을 동적으로 로딩할 수 없도록 되어있다. 옵션을 최소화 해서 태생 부터 성능에 포커싱 했다.
    • 보안에 대한 다양한 기술 문서를 제공하며, 코드 자체가 가볍고 경량화 되어 있어서 보안에 유리한 측면도 있다.https://youngmind.tistory.com/entry/Apache-vs-Nginx