Nginx란?
Nginx는 웹 서버로 트래픽이 많은 WAS(Web Application Server)를 도와주는 비동기 이벤트 기반구조의 웹 서버 프로그램이다.
주요 특징으로는
- 가볍고 빠름
- 로드 밸런싱 제공
- 리버스 프록시 지원
- SSL/TLS 적용 가능
등이 있다.
Web Server 와 WAS(Web Server Application)의 차이

웹 서버는 클라이언트(브라우저)의 요청을 받아 정적인 파일(HTML, CSS, JS, 이미지 등)을 제공한다.
WAS는 웹 서버가 처리하지 못하는 동적인 웹 애플리케이션을 실행하는 서버이다. 즉, 사용자의
요청을 받아 비즈니스 로직을 수행하고 DB와 연동하여 결과를 반환한다.
Nginx 등장 배경
1995년 최초의 웹서버인 유닉스 기반의 NCSA HTTPd가 있었다.
하지만 NCSA는 버그가 매우 많아서 사용하기 힘들었다.
이에 만들어진 것이 아파치 서버(Apache HTTP Server)이다.

아파치 서버는 매 요청마다 커넥션을 생성하기 위해 프로세스를 생성한다.
이런 프로세스는 생성 시간이 오래 걸리기 때문에 미리 프로세스를 생성해놓는 PREFORK 방식을 사용했다.
이후 새로운 요청이 들어오면 미리 생성해놓은 process를 가져다 사용했다.
이런 구조는 개발하기 편리함과 동시에 다양한 모듈을 만들어서 서버에 빠르게 기능을 추가할 수 있었다.
덕분에 아파치 서버는 동적 컨텐츠 처리가 가능했다.
아파치 서버의 한계

하지만 인터넷 사용이 늘어나면서 서버 트래픽량이 높아졌다.
결국 서버에 동시 연결된 커넥션이 많아졌을 때 더 이상 커넥션을 형성하지 못하는 문제가 발생했는데
이를 C10K 문제(Connection 10000 Problem)라고 한다.
이런 문제의 원인은 아파치 서버의 구조였다.
- 커넥션이 많아질수록 프로세스가 많아져 메모리 부족 현상 발생
- 아파치 서버의 모듈이 늘어남에 따라 프로그램이 무거워짐
- 많은 커넥션에서 요청이 들어왔을때 CPU 부하(Context Switching 많아짐)

결국 이런 문제를 해결하기 위해 Nginx가 나오게 됐다.
초창기에 Nginx는 Apache Server와 함께 사용하기 위해 만들어졌다.
Apache Server 앞에 Nginx를 두어서 기존에 Apache가 감당해야 했던
동시 커넥션을 Nginx가 대신해서 유지할 수 있도록 하였다.
또한 Nginx는 웹 서버이기 때문에 정적 파일에 대한 요청을 스스로 처리할 수 있어
아파치 서버의 부하를 줄여줬다.
Nginx는 클라이언트로부터 동적 파일 요청을 받았을 때만 뒤에 있는 서버와 커넥션을 형성했다.
Nginx의 구조

nginx의 구조를 살펴보면 마스터 프로세스가 설정파일을 읽고 워커 프로세스를 생성한다.
여기서 워커 프로세스가 실제로 일을 하는 프로세스이다.
워커 프로세스는 만들어질 때 listen 소켓을 배정받는다.
그리고 해당 소켓에 새로운 클라이언트로부터 요청이 들어오면 커넥션을 형성하고 요청을 처리한다.
이후 해당 커넥션은 정해진 Keep-Alive 시간만큼 유지된다.
여기서 커넥션이 형성되었다고 해서 워커 프로세스가 해당 커넥션 하나만 한정적으로 담당하지는 않는다.
형성된 커넥션에 아무런 요청이 없으면 새로운 커넥션을 형성하거나, 이미 만들어진 다른 커넥션으로부터 요청을 처리한다.
Nginx에서는 커넥션 형성, 커넥션 제거, 새로운 요청을 처리하는 것을 이벤트라고 부른다.

이벤트들은 OS 커널이 큐 형식으로 워커 프로세스에게 전달한다.
이 이벤트는 큐에 담긴 상태에서 워커 프로세스가 처리할 때까지 비동기 방식으로 대기한다.
워커 프로세스는 하나의 스레드로 이벤트를 꺼내서 처리한다.
(그림에서 네모칸은 큐이고 안에 들어가 있는 동그라미는 요청, 화살표는 연결을 의미한다.)
이런 식으로 큐를 이용한 구조는 워커 프로세스가 쉬지 않고 일을 한다는 장점이 있다.
아파치 서버의 구조와 비교해 보면 nginx는 커넥션이 연결되어 있어도 요청이 없으면 프로세스가 방치되던
아파치 서버와 다르게 효율적으로 작업을 처리할 수 있다.
여기서 만약 시간이 오래 걸리는 요청이 있다면 워커 프로세스는 블로킹을 방지하기 위해 해당 요청을
스레드풀로 보내고 다음 이벤트들을 처리한다.
이런 워커 프로세스는 CPU의 코어개수만큼 생성하는데 그 이유는 코어가 담당하는 프로세스를 바꾸는 횟수를 대폭 줄일 수
있기 때문이다. (Context Switching 줄어듦)
이런 구조를 Event-Driven Model(이벤트 기반 구조)이라고 한다.
동적 설정 변경

Nginx는 설정 파일을 변경하면 마스터 프로세스는 거기에 맞게 새로운 워커 프로세스를 생성한다.
이때 기존의 워커 프로세스가 더 이상 커넥션을 형성하지 않도록 처리하는 이벤트가 없다면 해당 프로세스를
종료시킨다.

이러한 동적 설정 변경이 가능하기에 이미 여러 커넥션을 관리하던 중 뒷단에 새로운 서버가 추가되어도 정상적으로 동작할 수 있다.
Nginx는 이런 상황에서 로드 밸런서의 역할을 담당하게 된다.
결국 동시커넥션을 유지한 채 기존 요청을 계속 처리하면서, 뒷단에 새로운 서버를 추가할 수 있다.
Nginx vs Apache Server
Apache
- 다양한 OS에 안정적
- 모듈을 추가할 수 있는 확장성
Nginx
- 동시 커넥션 관리 좋음
- 윈도우에서 제대로 된 성능을 내지 못함
Nginx 기능
- 웹 서버
- 로드 밸런서
- SSL 터미네이션 (클라이언트와는 HTTPS통신을 하고, 서버와는 HTTP 통신을 함)
- 캐싱 (SSL 터미네이션과 다르게 서버보다 클라이언트 쪽에 가깝게 배치)
- HSTS
- CORS 처리
- TCP/UDP 커넥션 부하 분산
- HTTP/2
...
참고
https://www.youtube.com/watch?v=6FAwAXXj5N0
https://blog.naver.com/gi_balja/223028077537
https://ssdragon.tistory.com/60
'Infra' 카테고리의 다른 글
Kafka란? (feat.성능과 고가용성) (0) | 2025.03.26 |
---|---|
클러스터와 노드 개념 (0) | 2025.03.24 |
도커(Docker) 알아보기 (1) | 2024.10.20 |