NGINX
이번에는 NGINX 에 대해서 정리를 해보겠다.
nginx 는 트래픽이 많은 웹사이트를 위해 확장성을 위해 설계한 비동기 이벤트 기반 구조의 웹서버이다.
Introduction
우선 웹서버로 기존에 apache 가 존재했었다. apache 는 다양한 기능과 써드파티 확장기능과 함께 어떠한 웹 어플리케이션 개발에도 적용할 수 있는 웹서버가 되었지만, 클라이언트 접속 당 CPU 와 메모리 사용량이 증가함으로써 확장성이 떨어진다는 단점이 있었다.
그래서 대량의 클라이언트를 관리하기 위한 웹서버가 필요시되었고, 그래서 나온 것이 nginx 였다.
nginx 는 event 기반으로 동작하기 때문에 apache 와 같이 각각의 웹페이지 요청을 처리하기 위해 새롱누 precess or thread 를 생성하지 않는다고 한다. 그렇기 때문에 단일 서버에서도 수만 개의 동시 연결을 처리할 수 있다고 한다.
현재 nginx 는 분산 메모리 객체 캐시 시스템이 추가되었고, 로드 밸런싱을 위한 reverse proxy, 캐싱 같은 것도 추가되었다고 한다.
Architecture
기존에는, 동시 연결을 처리하던 process 나 thread 기반의 모델들은 개별 precess 나 thread 로 각 연결을 처리하고, 네트워크 또는 입출력 작업을 bloking 했었다. 그렇기 때문에 어플리케이션에 따라 메모리나 CPU 소비 측면에서 매우 비효율적일 수 있다. 또한, 별도의 precess 나 thread 를 생성하려면 heap 및 stack 메모리 할당을 포함한 새로운 런타임 환경을 준비하거나 새로운 execution context 를 생성했어야 했고, 추가적인 CPU 시간도 이러한 항목을 생성하는데 소모되며 과도한 컨텍스트 스위칭이 발생할 시 thread thrashing 으로 인해 성능이 저하될 수 있다고 한다.
그래서 위와 같은 모델이 아닌 다른 모델을 사용하여, 그 결과로 모듈식, 이벤트 기반, 비동기식, 단일 스레드, 논블러킹 아키텍처가 되었고 이것은 nginx 코드의 기초가 되었다.
nginx 는 multiplexing 및 이벤트 알림을 중점적으로 사용하고, 특정 작업을 별도의 프로세스에 할당한다. 연결은 worker 라고 불리는 한정된 단일 스레드 프로세스에서 매우 효율적인 실행 루프로 처리된다. 각 workernginx는 초당 수 천개의 동시 연결 및 요청을 처리할 수 있다고한다.