오늘은 Nginx와 Apache 간의 비교를 통해 Nginx의 구조를 살펴봤습니다.

 

 

Nginx

Apache의 C10K 문제점 해결을 위해 만들어진 Event-Driven 구조의 웹서버 소프트웨어 이름입니다.
C10K 문제란 한 시스템에 동시 접속자수가 1만명이 넘어갈 때 발생하는 성능저하를 의미합니다.

OSI7 Layer 중 application level 아래의 level 에서 Nginx 같은 웹서버가 HTTP 통신을 담당합니다.

 

Apache와 Nginx

Apache의 성능문제를 해결하기 위해 만들어진 기술이라면 Apache의 동작구조와 Nginx의 구조를 비교해볼 필요성이 있습니다.

각각의 기술들을 살펴보며 어떤 차이점이 있는지 알아봅시다.

Apache

MPM(Multi-Process Module) 방식

Apache 서버는 MPM 방식으로 HTTP 요청을 처리합니다.

MPM 방식은 크게 두가지 방식으로 나눌 수 있습니다.

  1. prefork MPM (다중 프로세스)
    • 응답 프로세스를 미리 올려놓고 클라이언트 요청 시 자식 프로세스가 반응하게 되는 방식입니다. 요청이 많아지면 새로운 Process를 생성합니다.
    • 하나의 자식 프로세스는 하나의 스레드를 갖습니다. 자식 프로세스는 최대 1024개 까지 가능합니다.
    • 스레드 간 메모리 공유를 하지 않습니다. 그러므로 메모리 사용량이 많습니다. 독립적이기에 안정적이라는 장점이 있습니다.
    • 실행 중인 프로세스를 메모리 영역까지 복제하여 실행합니다.
    • 상대적으로 쉬운 디버깅이 가능합니다.
  2. Worker MPM(멀티 프로세스-스레드)
    • 스레드간에 메모리를 공유합니다. prefork 방식보다 메모리 사용량이 적습니다.
    • 통신량이 많거나 동시접속자가 많은 사이트에 적합합니다.
    • 프로세스당 스레드가 최대 64개의 스레드 처리가 가능하고 각 스레드는 한 번에 한 연결을 담당합니다.
    • CPU가 많을 수록 성능이 좋습니다.

Apache의 단점

Apache 서버는 요청 하나 당 프로세스(또는 쓰레드)가 처리하는 구조입니다.

클라이언트 접속마다 process 혹은 thread가 생성됩니다. 즉 요청이 많을수록 CPU와 메모리 사용이 증가하기 때문에 성능 저하가 있을 수 있습니다.

또한 Apache 서버의 프로세스가 블록킹(blocking)이 되면 요청을 처리하지 못하고, 처리가 완료 될 때까지 계속 대기하는 일이 발생합니다.

이와 같은 문제들은 Keep Alive를 활성화 함으로써 해결이 가능하지만, Keep Alive 때문에 대량 접속 시 효율이 급격하게 떨어지는 또 다른 문제점이 발생합니다.

Keep Alive

HTTP 프로토콜의 특성상 한 번 통신이 이루어지면 접속을 끊어 버리지만, KeepAlive On 상태에서는 KeepAliveTimeOut 시간 동안 접속을 끊지 않고 다음 접속을 기다립니다.

한 번 연결된 클라이언트와 통신을 유지하고 있기 때문에, 다음 통신 시에 Connection을 생성하고 끊는 작업이 필요 없게 됩니다.

따라서 Keep Alive을 활성화 함으로써, 성능 향상을 기대 할 수 있습니다.

Apache 2.4

단, 바쁜 서버 환경에서 KeepAlive On으로 설정해 놓을 경우 모든 요청 마다 연결을 유지해야 하기 때문에 프로세스 수가 기하급수적으로 늘어나 MaxClient값을 초과하게 됩니다.

따라서 메모리를 많이 사용하게 되며 이는 곧 성능 저하의 원인이 됩니다. (대량 접속 시 효율이 떨어짐)

Apache 2.4 버전에서는 Event MPM 방식을 지원함으로써 이를 완화하고자 했습니다. 이 방식은 사용자 요청과 Apache의 요청을 그대로 맺어주는 것이 아니라, 요청을 처리하는 스레드를 따로 두어 분산된 처리를 하는데 그 목적을 두고 있습니다.

Nginx

Nginx는 보안과 속도를 최적화 시키려는 노력에서 탄생한 웹서버 입니다. 사용이 매우 간단하고 규모가 작으면서 정적 데이터처리가 많은 서비스에 적합합니다.

Event-Driven 처리 기반 구조

Event-Driven 처리 기반 구조는 각 요청에 대한 상태를 정해서 event가 발생할 때마다 event를 처리하는 방식으로 작동합니다. Apache 와 달리 동시접속자 수가 많아져도 추가적인 생성비용이 들지 않습니다.

여러개의 커넥션을 모두 Event-Handler를 통해 비동기 방식으로 처리하고 먼저 처리되는 것 부터 로직이 진행됩니다.

스레드를 적게 사용하기 때문에 context switching 비용이 적고 CPU 소모도 낮습니다. 적은 수의 스레드로 효율적인 일 처리를 진행합니다.

그러나 모듈 개발이 어렵고 다양한 모듈이 없는 것이 단점입니다.

Apache와 Nginx의 비교

Apache NginX
요청 당 스레드 또는 프로세스가 생성됩니다. 비동기 이벤트 기반으로 내부에서 프로그램 흐름을 결정합니다.
Nginx에 비해 모듈이 많습니다. Apache에 비해 모듈이 적습니다.
PHP 모듈 등을 직접 적재 가능합니다. 많은 접속자들을 대응할 수 있습니다.
안정성, 확장성, 호환성이 좋습니다. 성능이 좋습니다.

참고 문헌

https://velog.io/@ksso730/Nginx-Apache-%EB%B9%84%EA%B5%90 https://cntechsystems.tistory.com/24 https://victorydntmd.tistory.com/231

태그:

카테고리:

업데이트:

댓글남기기