아파치 ( Apache )

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

즉 요청이 많을수록 CPU와 메모리 사용이 증가하기 때문에 성능 저하가 있을 수 있습니다.

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


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



이를 이해하기 위해서는 Keep Alive에 대한 개념이 필요하므로 잠시 언급하도록 하겠습니다.


Keep Alive

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

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

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


정적 자원( html파일, 이미지 파일 등 )으로만 구성된 웹 서버에 KeepAlive On으로 설정할 경우 약 50%의 성능 향상을 보인다고 합니다.

단 이와 같은 성능 향상을 보이려면 서버가 바쁘지 않아야 하는데, 바쁜 서버 환경에서 KeepAlive On으로 설정해 놓을 경우,

모든 요청 마다 연결을 유지해야 하기 때문에 프로세스 수가 기하급수적으로 늘어나 MaxClient값을 초과하게 됩니다.

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




이에 따라 Apache 2.4 버전부터 Keep Alive에 대한 고민을 해결하는 새로운 MPM 방식인, Event MPM 방식을 지원합니다.

이 밖에 Apache 2.4 버전에서는 성능 개선을 최우선 과제로 삼고, 더불어서 캐시, 프록시 모듈, 세션 제어, 비동기 읽기 및 쓰기 지원 기능을 개선 했다고 합니다. 

Apache가 성능 향상에 투자를 한 이유는, 최근 웹 서버가 정적 데이터 처리를 통한 속도 향상을 노리는 프록시나 캐싱 처리용 서버로 사용하는 경향이 늘면서 속도에 매우 민감해졌기 때문입니다.

조금 뒤에 살펴 볼 Nginx가 성장하게 된 계기가 바로 Apache보다 성능상의 장점을 갖고 있기 때문이죠.


먼저 Apache 2.4버전에서 어떤 변화가 있었는지 살펴보도록 하겠습니다.


아파치 2.4의 새로운 기능 ( 공식 사이트 - 링크 )

1) ( RUN-TIME ) Loadable MPMS

Apaceh 2.2까지는 Multi-Processing Modules ( MPMS )를 사용하기 위해서 컴파일 설치를 할 때 결정지어야 했습니다.

그러나 Apache 2.4부터는 런타임에서 결정할 수 있도록 Loadable Module 기능을 제공합니다.

Apache 2.4 컴파일 설치할 때 수행하는 Configure에서 –enable-mpms-shared 옵션으로 설정이 가능합니다.



2) Event MPM

Apache 2.2까지는 Event Driven 방식을 지원하지 않았습니다.

Evnet MPM 방식은 Keep Alive에 대한 고민에서 출발한 새로운 MPM 방식입니다.

이 방식은 사용자 요청과 Keep Alive한 Apache의 요청을 그대로 맺어주는 것이 아니라, 요청을 처리하는 쓰레드를 따로 두어 분산된 처리를 하는데 그 목적을 두고 있습니다.



3) Asynchronous Support

비동기 읽고/쓰기에 대한 기능을 지원합니다

 (따로 설정하거나 하는 것은 없고 내부 구조적으로 지원한다고 합니다. )



4) NameVirtualHost Deprecated

Apache 2.4 에서는 NameVirtualHost가 앞으로 사용되지 않는 옵션으로 변경되었습니다.

NameVritualHost 디렉티브는 더 이상 어떠한 영향을 주지 않으며, 작성 시 경고 메시지를 출력합니다.

대신 묵시적으로 다루어진다고 하는데, 이는 httpd.conf 파일에서 아래의 코드를 작성하지 않아도 묵시적으로 인식한다는 의미입니다.

NameVirtualHost *:80



5) 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에 대응하기 시작 했습니다.



그럼에도 Nginx가 성능 면에서는 Apahce 2.4 보다 좋다고 합니다. ( 엄청 큰 차이는 아닙니다. )

하지만 PHP 모듈 등을 직접 적재할 수 있는 Apache가 구조상 이점이 있기에 복잡한 웹 사이트의 경우 Apache가 적합합니다.


세션 클러스터링 같은 특별한 목적을 추가적으로 수행하는 세팅을 할 경우에는 별도의 과정을 거쳐야 하기 때문에,

이러한 별도의 작업이 많이 필요한 서비스의 경우에도 유지 보수 측면에서 Apache가 유용합니다.


즉 안정성과 확장성, 호환성에서 Apache가 우세, 성능 면에서는 Nginx가 우세하다는 것이 결론입니다.




[ 참고 ]

http://linux.systemv.pe.kr/apache-2-4-new-features/        - 아파치 2.4

https://prezi.com/romcehawisgh/nginx/                               - nginx 특징

https://prezi.com/ymg_mme4iq8m/apache-mpm-event/    - 아파치 MPM event 방식 , nginx