Apache
-
Apache 서버는 요청 하나 당 프로세스(또는 쓰레드)가 처리하는 구조이다.
-
즉 요청이 많을수록 CPU와 메모리 사용이 증가하기 때문에 성능 저하가 있을 수 있다.
-
또한 Apache 서버의 프로세스가 블록킹(Blocking)이 되면 요청을 처리하지 못하고
처리가 완료 될 때까지 계속 대기하는 일이 발생한다. -
이와 같은 문제들은 Keep Alive를 활성화 함으로써 해결이 가능하지만
대량 접속 시 Keep Alive 때문에 효율이 급격하게 떨어지는 또 다른 문제점이 발생하게 된다. -
Keep Alive와 관련된 개념은 HTTP Keep Alive 기능을 참고하자.
-
이에 따라 Apache 2.4 버전부터 Keep Alive에 대한 고민을 해결하는 새로운 MPM 방식인 Event MPM 방식을 지원하게 된다.
-
이 밖에 Apache 2.4 버전에서는 캐시, 프록시 모듈, 세션 제어, 비동기 읽기 및 쓰기 지원 기능과 같은 성능 개선을 최우선으로 삼았다.
-
Apache가 향상을 최우선 과제로 삼은 이유는 최근 웹 서버를 정적 데이터 처리를 통한 속도 향상을
노리는 프록시나 캐싱 처리용 서버로 사용하는 경향이 늘면서 속도에 매우 민감해졌기 때문이다. -
대표적으로 Nginx가 성장하게 된 계기가 바로 Apache보다 성능상의 장점을 갖고 있기 때문이다.
Apache 2.4
(RUN-TIME) Loadable MPMS
-
Apaceh 2.2까지는 Multi-Processing Modules(MPMS)를 사용하기 위해서 컴파일 설치를 할 때 결정해야 했다.
-
그러나 Apache 2.4부터는 런타임에서 결정할 수 있도록 Loadable Module 기능을 제공한다.
-
Apache 2.4 컴파일 설치할 때 수행하는 Configure에서 –enable-mpms-shared 옵션으로 설정이 가능하다.
Event MPM
-
Apache 2.2까지는 Event Driven 방식을 지원하지 않았다.
-
Evnet MPM 방식은 Keep Alive에 대한 고민에서 출발한 새로운 MPM 방식이다.
-
이 방식은 사용자 요청과 Keep Alive한 Apache의 요청을 그대로 맺어주는 것이 아니라
요청을 처리하는 쓰레드를 따로 두어 분산된 처리를 하는데 그 목적을 두고 있다.
Asynchronous Support
-
비동기 읽고/쓰기에 대한 기능을 지원한다.
-
따로 설정하거나 하는 것은 없고 내부 구조적으로 지원한다.
NameVirtualHost Deprecated
-
Apache 2.4 에서는 NameVirtualHost가 앞으로 사용되지 않는 옵션으로 변경되었다.
-
NameVritualHost 디렉티브는 더 이상 어떠한 영향을 주지 않으며 작성 시 경고 메시지를 출력한다.
Config File Variables
-
Apache 2.4 에서는 설정 파일 내에서 변수를 사용할 수 있게 되었다.
-
Define 키워드로 이용해서 변수를 정의한다.
-
ex) Define servername www.example.com
DocumentRoot /var/www/${servername}/htdoc
Nginx
-
Nginx는 보안과 속도를 최적화 시키려는 노력에서 탄생한 웹 서버이다.
-
사용이 매우 심플하고 규모가 작은 서비스이면서 정적 데이터 처리가 많은 서비스에 적합하다.
-
Apache에서 지원하는 수많은 기능이 필요 없고 알려진 보안 문제들은 특별한 업데이트 없이 Nginx 자체에서 처리해주고 있다.
-
Nginx는 프로그램의 흐름이 이벤트에 의해 결정이 되는 Event Driven방식의 웹 서버이다.
-
즉 요청에 대한 각 상태(State)를 정해서 Event가 발생할 때마다 Event를 처리한다.
-
적은 수의 쓰레드로 효율적인 일 처리를 하며
쓰레드를 적게 사용 하기 때문에 쓰레드당 할당되는 메모리도 적게 사용하는 구조이다. -
또한 쓰레드를 많이 사용하지 않기 때문에 문맥 교환(Context switching)비용이 적고 따라서 CPU 소모도 적다.
-
그러나 모듈 개발이 어려우며 다양한 모듈이 없다는 것이 단점이다.
Apache와 Nginx 비교
-
Nginx는 비동기 이벤트 기반으로 요청을 처리하고
-
Apache 서버는 요청 당 쓰레드 또는 프로세스가 처리하는 구조이다.
-
최근 대용량의 정적 파일 및 큰 규모의 사이트가 많아짐에 따라
대량 접속에도 적은 리소스를 사용하며 빠르게 서비스를 할 수 있는 웹 사이트가 대세가 되었다. -
이런 흐름속에서 Nginx가 관심을 받기 시작했다.
-
성능 면에서 Apache 2.2는 Nginx에 뒤쳐졌기 때문에 Nginx가 성장하게 되었다.
-
이에 대응하기 위해 2012년 빠른 응답 속도와 적은 리소스 사용 부분을 개선한 Apache 2.4를 발표하였다.
-
그럼에도 Nginx가 성능 면에서는 Apahce 2.4 보다 미비하지만 좋다고 한다.
-
즉 안정성과 확장성, 호환성에서 Apache가 우세
-
성능 면에서는 Nginx가 우세하다고 볼 수 있다.