Apache HTTP Server
Apache는 Apache Software Foundation에서 만든 웹 서버 프로그램이다. 거의 모든 OS에서 실행되고, 다른 유명한 소프트웨어 프로젝트와의 문서화가 잘 되어있고 통합 지원 등의 이점이 있습니다.
주요 특징
동적 컨텐츠 처리
다양한 모듈
스레드 / 프로세스 기반 구조
- Apache는 클라이언트 요청당 하나의 스레드가 처리하는 구조입니다.
- 사용자가 많으면 스레드 생성, 메모리 및 CPU 낭비가 심합니다.
MPM (Multi-Process Module)
MPM은 크게 두 가지 방식이 있습니다.
PreFork 방식 / Worker 방식
PreFork MPM (다중 프로세스)
- Client 요청에 대해 Apache 자식 프로세스를 생성하여 처리합니다.
- 요청이 많을 경우 Process를 생성하여 처리합니다.
이 방식은 Apache 설치 시 default로 설정되어 있습니다.
- 하나의 자식 프로세스 당 하나의 스레드 를 갖는 구조로, 자식 프로세스는 최대 1024개까지 가능합니다.
- 스레드 간 메모리 공유를 하지 않습니다.
이 방식은 독립적이기에 안정적인 반면, 메모리 소모가 크다는 단점이 있습니다.
- 실행 중인 프로세스를 복제하여 실행합니다. (메모리 영역까지 복제)
- 응답 프로세스를 미리 띄어놓고 클라이언트 요청 시 자식 프로세스가 반응하는 방식입니다.
- 디버깅이 빈약한 플랫폼에서 쉬운 디버깅이 가능합니다.
- 일반적으로 Single CPU 또는 Dual CPU에서 성능이 더 좋습니다.
Worker MPM (멀티 프로세스-스레드)
- Prefork 보다 메모리 사용량이 적고, 동시 접속자가 많은 사이트에 적합합니다.
각 프로세스의 스레드를 생성해 처리하는 구조입니다.
- 스레드 간의 메모리 공유가 가능합니다.
- 프로세스당 최대 64개의 스레드 처리가 가능하며, 각 스레드는 하나의 연결만을 부여받습니다.
- 일반적으로 Multi CPU 시스템에서 성능이 좋습니다.
단점
- 클라이언트 접속 시 마다 프로세스 또는 스레드를 생성하는 구조이기에 대량의 클라이언트(1만 이상)가 동시 접속한다면 CPU/메모리 사용이 증가하고 프로세스/스레드 생성 비용이 드는 등 요청에 한계가 있습니다.
- Apache 서버의 프로세스가 blocking되면 요청을 처리하기 못하고 처리가 완료될 때 까지 계속 대기합니다.
Keep Alive(접속 대기)를 이용해 해결이 가능하지만, Keep Alive 때문에 대량 접속 시 효율이 떨어짐
NginX
Apache의 C10K 문제점 해결을 위해 만들어진 Event-Driven 구조의 웹 서버 소프트웨어입니다. 즉, 프로그램의 흐름이 이벤트에 의해 결정되는 방식입니다.
C10K : 1만개의 클라이언트 문제
한 시스템에 동시 접속자 수가 1만명이 넘어갈 때 효율적 방안
주요 특징
Event-Driven 처리 기반 구조
- 한 개 또는 고정된 프로세스만 생성하고, 여러 개의 Connection을 모두 Event-Handler를 통해 비동기 방식으로 처리합니다.
- 적은 양의 스레드만 사용되기 때문에 Context Swiching 비용이 적고, CPU 소모가 적습니다.
- Apache와 달리 동시 접속자 수가 많아져도 추가적인 생성 비용이 들지 않습니다.
- CPU와 관계없이 모든 I/O들을 전부 Event Listener로 미루기 때문에 흐름이 끊기지 않고 응답이 빠르게 진행되어 1개의 프로세스로 더 빠른 작업이 가능합니다.
이 덕분에 메모리를 적게 사용합니다.
Context Swiching
- Context: 스레드가 작업을 진행하는 동안 작업정보(레지스터, 커널스택, 사용자스택 등)를 보관.
- OS가 A작업을 진행할 때 A스레드의 Context를 읽어오며, B스레드로 전환 할 때 A스레드의 Context를 저장하고 B스레드의 Context를 읽어오는 일련의 반복을 수행.
- 스레드의 갯수가 많아질 수록 context swiching 작업은 더 빈번하게 일어나고, 이 때문에 성능이 저하될 수 있음.
리버스 프록시로 배치 가능
- NginX의 빠른 처리 속도를 활용하여 클라이언트의 모든 요청을 처리합니다.
단점
- 동적 컨텐츠를 기본적으로 처리할 수 없습니다.
외부 프로세서로 전달하고 렌더링 된 컨텐츠를 다시 전송할 때 까지 기다려야 합니다. (프로세스 속도 저하)
- Apache에 비해 다양한 모듈이 없습니다.
정리
결론
Apache와 NginX는 모두 강력하고 유연한 웹서버입니다. 어떤 웹서버가 더 좋다 라는 결론은 없습니다. 어떤 것을 사용할 지는 요구사항과 우선순위에 따라 크게 좌우됩니다.
Apache는 대규모 커뮤니티가 있으며 일반적인 문제를 탐색하는 데 도움이 되는 많은 지원이 있고 안정성 또한 뛰어납니다. 하지만 NginX는 속도가 향상될 수 있습니다.
이러한 것들과 비용 등을 고려하여 적합한 웹 서버를 사용하면 됩니다.