Nginx의 탄생 배경
Apache 서버
Apache 서버는 클라이언트로부터 요청을 수신하면 연결(Connection)을 형성하기 위해 새로운 프로세스를 생성합니다. 이때 프로세스를 미리 준비해 두는 Pre-fork 방식을 통해 서비스 품질을 향상시켰습니다.
또한 연결을 생성하는 과정에는 상당한 자원과 시간이 소요되기 때문에, 한 번 생성된 연결을 일정 시간 유지하여 자원 사용의 효율성을 높였습니다. HTTP 헤더에서 자주 보이는 Keep-Alive: timeout 값은 바로 이 유지 시간을 의미합니다.
이와 같은 단순하고 명확한 구조는 개발 난이도를 낮추면서도 확장성 측면에서 유리한 장점을 제공합니다.
Apache 서버의 단점
하지만 이런 구조가 장점만 가지고 있는 것은 아니었습니다.
- Pre-fork로 인한 메모리 공간 부족
- 확장성이 좋은 만큼, 프로그램이 무거워짐
- Connection 증가 -> Process 증가 -> Context-Switch 증가 -> CPU 부하 증가
때문에 Apache의 구조는 대량의 동시 Connection을 처리하기에 부적합했으며, Connection이 1만개 이상 늘어날 경우 더이상 연결이 안되는 C10K(Connection 10,000)문제가 발생했습니다.
Nginx는 이런 Apache 서버의 문제를 해결하기 위해 만들어졌습니다.
구성요소
1. Master Process
설정파일(nginx.conf)을 읽고, 설정에 맞게 Worker Process를 생성하는 Process
2. Worker Process
실제로 일을 하는 Process.
보통 CPU의 Core의 개수만큼 생성하며, 이를 통해 Context Switching의 빈도를 대폭 줄일 수 있습니다.
3. Thread Pool
event 중에서 시간이 오래 걸리는 작업들을 따로 처리하는 요소
Worker Process는 시간이 오래 걸리는 event를 만나면 Thread Pool에게 해당 event를 위임하고, Queue안에 있는 다른 event를 처리합니다.
동작 과정
Nginx는 Event Based Model, 즉 이벤트 기반 구조로 만들어졌습니다.
Worker Process는 생성될 때, 각자 지정된 Listen Socket을 배정 받습니다. 그리고 Request가 들어오면 Listen Socket을 통해 Connection을 생성하고 Request를 처리합니다. 해당 Connection은 Keep-Alive 시간만큼 유지됩니다.
형성된 Connection으로부터 들어오는 요청(Request)을 처리하기도 하고, 더 이상 요청이 들어오지 않는 Connection을 제거하기도 하며, 새로운 Connection을 생성하기도 합니다. Nginx에서는 이러한 Connection의 생성과 제거, 그리고 새로운 요청 처리를 event라고 부릅니다.
이러한 event들은 OS 커널에 의해 Worker Process로 큐(Queue) 형태로 전달됩니다. event들은 Worker Process가 이를 처리할 때까지 비동기 방식으로 큐에서 대기하게 됩니다. 이후 Worker Process는 단일 스레드(Thread)로 하나의 event를 처리하게 됩니다.
지금까지의 내용을 쉽게 요약하면, Master Process가 Worker Process를 만들고, Worker Process는 일을 처리합니다. 들어오는 일 중에서 오래 걸리는 일은 Thread Poll에게 짬을 때립니다.
문제 해결
- Worker Process가 쉬지 않고 동작하기 때문에, Apache의 다수의 Process로 인한 메모리 부족 문제를 해결할 수 있다.
- Worker Process의 개수를 CPU의 개수와 동일하게 설정함으로써 Context Switching을 대폭 줄여 CPU의 부하를 낮춘다.
이러한 방법들로 Nginx는 대량의 동시 Connection을 효율적으로 처리라며 C10K 문제를 해결할 수 있었습니다.
참고자료
'프로젝트' 카테고리의 다른 글
| [WEB - WAS 프로젝트 04 - 1] 브라우저 캐싱 (0) | 2025.11.28 |
|---|---|
| [WEB - WAS 프로젝트 04] Local - 정적 컨텐츠 제공 (0) | 2025.11.22 |
| [WEB - WAS 프로젝트 03] Local - Nginx 설치 (0) | 2025.11.21 |
| [WEB - WAS 프로젝트 01] 소개 (0) | 2025.11.20 |