Nginx란?
- Nginx란 일종의 경량 트래픽이 많은 웹사이트의 확정성을 위해 개발된 경량 웹 서버이다.
클라이언트로부터 요청을 받았을 때 요청에 맞는 정적 파일을 응답해주는 HTTP Web Sever로
활용되기도 하고, 또는 Reverse Proxy Server로 활용하야 WAS 서버의 부하를 줄일 수 있는
로드 밸런서로 활용되기도 한다.
Nginx는 적은 자원의 사용으로 높은 성능과 높은 동시성을 목표로 만들어진 언어이다.
Nginx가 등장하기 이전에는 Apach를 통해 웹서버로 많이 사용되었지만 점차 늘어나는 트랙픽들을
감당하기가 어려워진 상황이 되었고 C10K문제(하나의 웹 서버에 1만개 이상의 클라이언트 접속을 처리하지
못하는 문제) 가 발생하였고 이를 해결하기 위해서 러시아의 Igor Sysoev라는 개발자에 의해서
2002년 Nginx의 개발이 시작되었고 2004년에 릴리즈가 배포되었다.
Nginx의 흐름
Nginx는 Event-Driven 구조로 동작하기 떄문에 한 개 또는 고정된 프로세스만을 생성하여 사용하고 있고,
비동기 방식으로 요청들을 Concurrency(병행성) 하게 처리할 수 있다.
위 그림을 보면 Nginx는 새로운 요청이 들어온다 하더라도 새로운 프로세스와 쓰레드를 생성하지 않기 때문에
프로세스와 쓰레드 생성 비용이 존재하지 않으며, 적은 자원으로도 효율적인 운용이 가능하다.
이러한 장점 덕분에 단일 서버에서도 동시에 많은 연결을 처리할 수 있다.
Nginx의 구조
Nginx는 하나의 Master Process와 다수의 Worker Process로 구성되어 실행된다.
Master Process에는 설정 파일을 일고, 유효성을 검사 및 Worker Process를 관리한다.
모든 요청에는 Worker Process에서 처리한다. Nginx는 이벤트 기반 모델을 사용하고
Worker Process 사이에 요청을 효율적으로 분배하기 위해서 OS에 의존적인 메커니즘을 사용한다.
Worker Process의 개수는 설정 파일에서 정의되며, 정의된 프로세스 개수와 사용 가능한
CPU 코어 숫자에 맞게 자동 조정 된다 .
Nginx와 Apache
Nginx
- 비동기 Event-Drive 으로 요청하여 적은 자원을 사용해 CPU 소모량이 적다
- 다수의 클라이언트 연결을 효율적으로 처리할 수 있다.
- 문맥 교환(context switching)의 비용이 적다.
- Apache에 비해서 모듈이 다소 적다.
- 복잡한 처리가 필요한 요청의 경우 시스템 큐에 쌓이게 되어 성능 저하가 발생할 수 있다.
- Nginx에서는 event driven으로 클라이언트 요청을 병렬 처리한다. 싱글 프로세스로 구성되어있으며,
클라이언트 요청 이벤트를 reactor가 받는다, 받은 이벤트는 handler를 통해서 worker로 전달되 처리된다.
Apache
- 환경에 맞게 PreFork 방식(요청마다 프로세스 생성). Worker 방식(프로세스와 쓰레드 병행해서 사용) 선택가능
- 안정성, 확장성, 호환성의 장점이 있다.
- 하나의 클라이언트에서 받는 연결에 하나의 쓰레드만 부여된다.
- 클라이언트 연결이 늘어남에 따라서 프로세스가 계속해서 늘어나 메모리 낭비가 심하며 문맥 교환 비용이 든다.
- 프로세스가 blocking 되면 요청을 처리하지 못하고 이전 요청을 처리하기 전까지 대기상태가 된다.
참고 자료