Apache
아파치는 클라이언트 요청을 받으면 MPM(Multi Processing Module : 다중처리모듈) 방식으로 처리한다.
스레드/프로세스 기반 구조 동작
- ServerSocket으로 request A가 들어오면 Thread를 할당해준다.
- Thread는 해당 socket을 가지고 read, write작업 등을 수행한다.
- 수행 도중 ServerSocket으로 request B가 들어오면, context switching이 일어난다.
- 새로 들어온 요청에 쓰레드를 배분하고, 또 해당 소켓을 가지고 작업을 수행한다.
- 아직 마무리되지 않은 A를 처리하기 위해 일정 기간마다 지속적으로 context switching을 반복하고 모든 작업을 마무리 한다.
Prefork MPM
실행중인 프로세스를 복제하여 처리하는 방식
각 프로세스는 한번에 한 연결만 처리하고, 요청량이 많아질수록 프로세스를 복제하여 동작한다.
프로세스를 복제하는 방식이기 떄문에 메모리가 많이 소비된다
연결 수 = 프로세스 수
Worker MPM
Prefork
방식은 한개의 프로세스가 한개의 스레드로 처리되지만, Worker
방식은 한개의 프로세스가 여러 쓰레드를 사용하여 처리한다.
쓰레드를 사용하기 떄문에 Prefork
방식보다 메모리 소모가 적고, 통신량이 많을 때 유리하다.
문제점
아파치는 접속마다 프로세스 또는 쓰레드를 생성하는 구조이다.
동시 접속 요청이 많을수록 그만큰 생성 비용이 들고 대용양 요청을 처리할 수 있는 웹 서버로서 한계가 나타난다.
Nginx
한개 또는 고정된 프로세스만 생성하고, 프로세스 내부에서 비동기 방식으로 작업을 처리한다. 따라서 동시 접속 요청이 많아도 프로세스 또는 쓰레드 생성 비용이 존재하지 않는다.
Event-Driven 방식
Event-Driven 방식은 Reactor pattern을 사용한다.
Reactor
는 이벤트가 들어오면 알맞는handler
로dispatch
해준다.Handler
는dispatch
된 이벤트를 받아서 처리하는 역할을 수행
Reactor pattern
이벤트 처리(event handling)디자인 패턴으로 하나의Reactor
가 계속 이벤트를 찾고 이벤트가 발생(trigger)하면 해당 이벤트 처리기(event handler)에게 알린다.
Nginx와 Apache의 차이점
컨텐츠의처리 방식
정적 컨텐츠 처리
- Apache: 전통적인 파일기반 방식의 정적 컨텐츠
- Nginx: 이벤트 처리/비동기식/논블로킹 방식 처리로 인해 정적 컨텐츠 제공시 고속 처리 가능
동적 컨텐츠 처리
- Apache: 서버 내에서 처리
- 기본적으로 유연성과 범용성을 갖추는 방식으로 서버 자체에서 동적 컨텐츠 처리가 가능하다.
- Nginx: 동적 컨텐츠를 처리하지 않음
- 동적 웹 페이지 컨텐츠를 가진 모든 요청을 위해 외부 자원과 연계한다. 따라서 최종적으로 동적 컨텐츠가 다시 돌아올 때까지 기다렸다가 클라이언트에게 전달하는 방식을 가지고 있다.
- Apache: 서버 내에서 처리
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