[CS지식] Nginx란 무엇인가요?
이번 장에서는 Nginx에 대해 전반적으로 알아보려고 한다.
Nginx의 정의
Nginx란 트래픽이 많은 웹사이트의 WAS를 도와주는 비동기 이벤트 기반 구조의 경량화 WS 프로그램.
Nginx는 웹 서버 기능 이외에 추가로 캐싱, 로드 밸런서, TLS/SSL 보안, 메일 프록시 등의 기능을 제공한다.
WAS 및 WS에 대하여
WS[Web Server]
- 정적인 파일 (이미지, html , css .. )을 제공하기 위한 서버로, HTTP 프로토콜에 의해 제공
- 정적인 파일로만 처리 가능한 것은 WAS로 요청을 넘기지 않고 바로 요청 처리
- 동적인 처리(로직에 따른 DB 업데이트, 회원에 따른 다른 화면 송출…)가 불가능
- apache, nginx …
WAS[Web Application Server]
- 동적인 데이터를 제공하기 위한 서버
- 동적인 정보를 처리해 WS에 정적인 정보를 제공
- 일반적으로 WS 기능을 내재하고 있어 WS 없이도 서비스가 가능
- tomcat, jeus …
Nginx가 만들어지게 된 배경
APACHE
unix 기반으로 만들어진 최초 WS인 NCSA Httpd의 버그가 많아 이를 구조 변경을 하고 기능을 개선을 한 WS인 APACHE가 출시되었다,
APACHE는 http request 가 들어올 때마다 새로운 process를 생성한다.
Process를 만드는 작업은 오래걸리는 작업이기 때문에 요청이 들어오기 전에 미리 process를 만들어 놓는 Prefork 방식을 사용했다. 추가적으로 APACHE는 확장성이 좋아 당시 개발자들에게 큰 환영을 받았다.
1999년에 들어 Client가 많아짐에 따라 Http Request가 점점 증가하였다. 이로 인해 C10K (Connection 10000 Problem) 문제가 발생했다. C10K문제란 Connection이 10000개가 되었을때 문제가 발생하는 현상을 말한다. Connection이 10000개가 넘어가게 되면 더이상 Connection이 생성되지 않는 문제 등등이 발생했다.
APACHE 서버의 문제점
[메모리 부족]
요청이 들어올 때마다 Process를 할당하기 때문에 동시에 처리하는 Connection이 많아지면 Process가 증가하기에 메모리 부족 현상이 발생한다.
[무거운 프로그램]
APACHE가 제공하는 많은 기능들은 process가 차지하는 리소스의 양을 증가시킨다.
[CPU 부하 증가]
Process간에 처리를 해야하기 때문에 Context Swithcing 비용이 크다.
이러한 문제 때문에 Client가 증가하는 환경에서 APACHE 서버가 점점 적합하지 않게 되었다.
NginX
2004년에 이러한 문제들을 해결하기 위해 Nginx가 등장했다.
초창기의 Nginx는 APACHE가 가진 구조적 한계를 Nginx가 담당하는 방식으로 APACHE와 함께 사용하기 위해 등장했다.
기존에 수많은 Connection을 처리하지 못해 문제가 있던 APACHE 서버 앞단에 두어 APACHE의 단점을 보완하는 목적으로 Nginx를 사용했다.
Nginx의 구조
Nginx는 Master process와 Worker process로 구성된다.
Master process는 Nginx의 설정 파일을 읽어들이고 설정에 맞게 worker process를 생성한다.
Worker process는 실제로 일을 하는 프로세스이며 worker process가 만들어 질 때 지정된 listen 소켓을 배정받는다.
Worker process는 요청이 없으면 새로운 Connection을 생성하거나 이미 만들어진 다른 Connection으로 부터 요청을 처리한다.
Connection 형성, 제거, 새로운 요청을 처리하는 동작을 Event
라고 한다.
Event들은 queue 형식으로 worker process에게 전달한다. event는 worker process에서 처리할 때 까지 비동기 방식으로 대기한다. worker process는 하나의 쓰레드로 queue에 있는 event들을 처리해 나간다.
만약 event를 처리하는 도중 시간이 오래걸리는 event가 있다면 이를 처리하기 위한 Thread Pool에게 event를 위임하고 다른 event를 처리한다.
Nginx는 worker process를 CPU core 만큼만 생성한다. 그렇기 때문에 Context Switching 을 대폭 줄일 수 있기 때문에 CPU 부하가 줄어든다.
Nginx의 장점 및 단점
Nginx의 장점
- 제한된 하드웨어 리소스로 여러 클라이언트 요청을 동시에 효율적으로 처리 가능
- 단일 스레드를 통해 여러 연결을 처리 가능
- 최소한의 리소스로 독립형 HTTP 서버로 배치 가능
Nginx의 단점
- 동적 컨텐츠를 기본적으로 처리할 수 없음
- 동적 웹페이지 컨텐츠를 가진 모든 요청을 위해 외부 자원과 연계해야 함
APACHE와 Nginx의 성능 비교
[메모리 사용량]
위 그래프는 동시 Connection대비 Memory 사용량을 나타낸 표인데 Nginx는 동시 요청수가 증가하여도 낮은 메모리 사용량을 보인다.
[초당 요청 수]
위 그래프는 동시 Connection 대비 초당 요청수를 나타낸 표인데 Nginx가 APACHE에 비해 훨씬 많은 요청을 처리하는 것을 확인 할 수 있다.
Nginx가 모든 방면에 있어 좋은 선택지인가?
APACHE와 Nginx는 태어나게 된 배경, 태어나게 된 이유가 서로 다르다.
APACHE의 경우에는 호환성과 확장성을 목적으로 때문에 Nginx에 비해 지원하는 모듈도 많고 안정적이다.
Nginx의 경우에는 동시 커넥션 관련 하여 우월한 성능을 가지고 있다.
내가 어떠한 기능이 필요한 것인지 생각을 해보고 적절한 WS를 선택하면 될 것이다.
출처
댓글남기기