엔진엑스는 오픈소스 Web server 프로그램으로 비동기 이벤트 기반의 구조로 동작한다.
로 로드 밸런서 역할도 수행해준다.
비동기 처리방식 Event-Driven 방식으로 동작하기 때문에 적은 리소스를 효율적으로 사용한다는 장점을 갖고 있다.
웹 서버로 주로 사용되는 Apache와 NGINX를 비교해보자면
아파치는 클라이언트 요청당 스레드 혹은 프로세스를 생성하여 처리하는 Process Driven방식을 활용하였다. 그러나 이러나 방식은 요청이 증가하면 CPU와 메모리, context switching 비용 등 자원 소모가 커지는 단점이 있었고,
컴퓨터의 보급이 커지면서 C10k(connection 10000 problem)문제를 발생시키게 된다.
엔진엑스는 Event Driven방식을 채택하여 단일 스레드를 통해 여러 연결을 처리하여 리소스를 적게 사용한다. 제한된 하드웨어 자원으로도 다수의 클라이언트 요청을 동시에 처리할 수 있어 동시접속 처리의 장점을 갖고 있다.
master process
는 worker process를 생성하고 listen소켓을 배정한다.
worker process
는 실제 유저의 요청을 처리한다.
connection의 연결, 요청처리, 종료 등을 event
라고 하는데,
os커널은 이러한 이벤트를 큐에 담아 worker process가 처리하도록 한다.
따라서 worker process가 Keep-Alive 동안 쉬지않아 요청이 없을때 프로세스가 방치되는 아파치보다 효율적이다.
이러한 방식의 또다른 장점은 동적으로 설정을 변경할 수 있다는 점이다. (NGINX로 배포시에 사용했던 service reload가 이것이었다..)
service reload
시에 master process는 새로운 worker process를 생성하고, 기존의 worker process에는 이벤트를 할당하지 않는다.
성능의 차이로 현재는 NGINX의 점유율이 Apache를 넘어 1위로 많은 웹사이트가 엔진엑스를 사용하고 있다고 한다.
배포를 진행해보면 만나게 되는 NGINX와 Apache 친구들
첫 배포 (try)에서 사용했던 NGINX를 이번 프로젝트에서 다시 사용하게 되어 자세히 알아보았다.