Apache는 모든 개발자들에게 친근할 거다.(Nginx에 비해)
Nginx가 왜 요즘 뜨고있는 HTTP서버인지, 자료를 조금 조사해보았다. (왜냐면 이제 Nginx 사용해볼거거든..)
Apache
Apache는 Client 요청을 받으면 MPM(Multi Processing Module : 다중처리모듈)이라는 방식으로 요청을 처리하며 대표적으로 Prefork와 Work방식이 있다. Apache 2.4에 Event 방식이 나왔지만, Worker방식과 비슷한것으로 알고있다. 아닌가?
일단 스레드/프로세스 기반구조에 대해 알아보자.
스레드/프로세스 기반 구조
- ServerSocket으로 request A가 들어오면 Thread를 할당해 준다.
- Thread는 그 socket을 가지고 read, write 작업(I/O) 등을 수행한다.
- 이 와중에 ServerSocket으로 request B가 들어오면, context switching이 일어난다.
- 새로 들어온 request에 Thread를 배분하고, 또 이 socket을 가지고 read, write 작업을 수행한다.
- 그러면서 A의 작업을 하기 위해 중간에 다시 context switching 하고, 그러다 다시 B 작업하려고 context switching을 하며 I/O 작업을 모두 처리
Prefork MPM
실행중인 프로세스를 복제하여 처리하는 방식이다.
각 프로세스는 한번에 한 연결만 처리하고, 요청량이 많아질수록 프로세스를 복제하여 동작한다.
프로세스를 복제하는 방식이기 때문에 메모리가 왕창 소비된다.
connection 수 = 프로세스 수 라고 보면 된다.
Worker MPM
Prefork 방식은 한개의 프로세스가 한개의 스레드로 처리되지만, Worker방식은 한개의 프로세스가 여러 쓰레드를 사용하여 요청을 처리한다.
쓰레드를 사용하기 때문에 Prefork 방식보다 메모리 소모가 적고, 통신량이 많을 때 유리하다.
문제점..?
Apache는 접속마다 Process 또는 Thread를 생성하는 구조이다.
동시 접속 요청이 10,000개라면 그 만큼 Process or Thread 생성비용이 들 것이고 대용량 요청을 처리할 수 있는 웹서버로서의 한계를 드러내게 된다. ㅜ_ㅜ
Nginx
Nginx
는 Event-Driven 방식으로 동작한다.
한 개 또는 고정된 프로세스만 생성 하고, 그 프로세스 내부에서 비동기 방식으로 효율적으로 작업을 처리한다. 따라서 동시 접속 요청이 많아도 Process 또는 Thread 생성 비용이 존재하지 않는다.
더 자세히 알아보자면, Event-Driven 방식은 작업을 하다 I/O, socket read/write 등 CPU가 관여하지 않는 작업이 시작되면 기다리지 않고 바로 다른 작업을 수행한다. 그러다 진행중인 I/O 등의 작업들이 끝나면 이벤트가 발생하여 그 다음 작업을 처리하게 된다.
Event-Driven 방식
- Reactor는 event가 들어오면 알맞는 handler로 dispatch를 해준다.
- Handler는 이 dispatch된 event를 받아서 처리하는 역할을 수행
Event-Driven 방식은 Reactor pattern을 사용한다고 한다.(처음들었음)
Reactor pattern이란 이벤트 처리(event handling)디자인 패턴으로, 하나의 Reactor가 계속 이벤트를 찾고 이벤트가 발생(trigger)하면 해당 이벤트 처리기(event handler)에게 이를 알린다.
즉,Reactor
: Reacator는 별도의 스레드에서 실행되며 발생한 I/O 이벤트는 dispatching되어 해당 이벤트 처리기로 보내 처리한다.Handlers
: Reactor로부터 I/O 이벤트를 받아 실제 작업을 수행한다.
reactor pattern에 대해선 아래 블로그에 무척 잘 설명되어 있다.
https://jongmin92.github.io/2019/03/05/Java/java-reactor-pattern/
참고
https://medium.com/sjk5766/넌-뭐니-nginx-9a8cae25e964
https://sarc.io/index.php/nginx/64-nginx-event-driven
'프로그래밍 노트 > 인프라' 카테고리의 다른 글
[nginx] upstream (nginx + tomcat 연동) (2) | 2020.04.28 |
---|---|
[nginx] 가상호스트 설정(virtual host) (0) | 2020.04.14 |
[nginx] mac os에 nginx를 설치해보자!! (0) | 2020.04.10 |
Reverse Proxy, Forward Proxy (프록시란?) (2) | 2020.03.03 |
Apache SSL module(mod_ssl) (0) | 2020.02.17 |