넌 뭐니 NGINX?
netcraft에서 조사한 2018년 웹 서버 수요 조사를 보면 Nginx 수요가 Apache 를 뛰어넘을 날이 머지 않은걸 알 수 있다.
NGINX? 그게 뭐길래?
NGINX란 러시아의 한 개발자가 apache의 C10K 문제 (한 시스템에 동시접속자 수가 1만명이 넘어갈 때 효율적인 방안)를 해결하기 위해 Event-Driven 구조로 만든 웹 서버 SW 이다.
우리가 개발한 응용 프로그램이 OSI 7 Layer 중 application Level에서 동작하고 그 아래 Level에서 NGINX 같은 웹 서버가 HTTP 통신을 제공하게 된다.
NGINX는 Apache와 많이 비교된다. 두 웹 서버의 구조를 살펴보자.
Apache
Client가 HTTP 요청을 보낼 때, Apache는 MPM (Multi-Process Module)을 사용하여 처리한다. MPM에는 크게 두 가지 방식이 있다.
1. PreFork 방식 (다중 프로세스 처리)
Client 요청에 대해 default 개수만큼 apache 자식 프로세스를 생성하여 처리하고, 요청이 많을 경우 Process를 생성하여 처리하는 방식이다. Apache 설치 시, default로 설정되어 있다.
2. Worker 방식 (멀티 프로세스 — 스레드 방식)
Prefork와 같이 Default Apache 자식 프로세스를 생성하고 요청이 많아지면 각 프로세스의 스레드를 생성해 처리하는 구조이다. 두 방식의 특징은 우리가 흔히 알고 있는 프로세스와 쓰레드 사용의 장/단점과 동일하다.
위에서 언급했던 C10K를 생각해보자. Apache는 접속마다 Process 또는 Thread를 생성하는 구조이다. 동시 접속 요청이 10,000 개라면 그 만큼 Process or Thread 생성 비용이 들 것이고 대용량 요청을 처리할 수 있는 웹서버로서의 한계를 드러내게 된다.
NGINX는?
NGINX는 Event-Driven 방식으로 동작한다. 한 개 또는 고정된 프로세스만 생성 하고, 그 프로세스 내부에서 비 동기 방식으로 효율적으로 작업들을 처리한다. 따라서 동시 접속 요청이 많아도 Process 또는 Thread 생성 비용이 존재하지 않는다.
위에서 비 동기 방식으로 효율적으로 작업을 처리한다고 언급했는데 좀 더 살펴보자. Event-Driven 방식에선 작업을 하다 I/O, socket read/write 등 CPU가 관여하지 않는 작업이 시작되면 기다리지 않고 바로 다른 작업을 수행한다. 진행중인 I/O 등의 작업들이 끝나면 아! 내가 아까 했던 작업을 다시 진행하면 된다는 이벤트가 발생하고 그 작업을 처리하게 된다.