Tagged: Apache 2.4 New Features

Apache 2.4 새로운 기능

Apache Logo

이 문서는 Apache 2.4  새로운 기능에 대해 기술한 문서 입니다.

 

 

1. 개요

Apache 2.2 는 2005년 후반기에 발표되고 지금까지 큰 버전의 변화가 없이 사용되고 있습니다. 그러다 최근 고용량의 정적 파일 및 큰 규모의 싸이트가 많아짐에 따라서 대량 접속에도 적은 리소스를 사용하면서 빠르게 서비스 할 수 있는 웹서버가 절실해졌습니다. 이에 러시아에 한 업체가 자사 싸이트 운영을 위해서 웹 서버를 제작했고 이것을 공개했는데 그것이 바로 Nginx 입니다. Nginx 의 빠른 응답속도와 적은 리소스 사용은 그동안 Apache 서버에 답답해했던 많은 사용자들을 붙 잡았으며 현재 Nginx 의 시장점유율은 날이 갈수록 높아지는 추세 입니다.

이에 Apache 재단에서도 빠른 응답속도와 적은 리소스등 기존의 Apache 에 큰 변화를 주어야겠다고 생각했는지 거의 7년이 다 되어가던 2012년 2월달즘에 Apache 2.4를 릴리즈 합니다. Apache 2.4는 기존 Apache 2.2와 비교했을때에 프로세스 모델에 있어서 큰 변화를 준 만큼 웹서버 시장에서, 더군다나 Nginx 와의 경쟁이 더욱 치열해질 것으로 전망 됩니다.

2.새로운 기능

먼저, Apache 2.4의 새로운 기능에 대해서 정리해 보겠습니다.

(Run-time) Loadable MPMs

Multi MPMs는 이제 컴파일 타임에 Loadable 모듈로 빌트 인 될수 있습니다. Multi-Processing Modules (MPMs) 네트워크 포트를 바인등(Binding)하고 클라이언트로부터 요청을 받고 자식 혹은 쓰레드에 핸들링(Handling) 요청을 보냅니다. Apache 2.2까지는 이것을 정적 컴파일(static compile) 해야만 했습니다. 이는 Apache 를 컴파일 설치할때에 결정되어지는 것으로 이를 사용하지 않거나 사용하기 위해서는 컴파일 시에 결정을 해야 했습니다. 하지만 Apache 2.4 에서는 이를 실행 타임(Run-time)에서 결정할 수 있도록 ‘Loadable Module’ 로 기능을 제공합니다. 컴파일 설치시에 하게되는 Configuration 에서 ‘–enable-mpms-shared’ 를 사용하면 됩니다.

Event MPM

Nginx 는 ‘Event Driven’ 방식의 웹 서버로 유명합니다. 하지만 Apache 는 그동안에 ‘Event Driven’ 방식을 지원하지 않았습니다. 대신 한개의 동접 클라이언트당 한개의 쓰레드 (혹은 프로세스) 구조였고 이 때문에 한 클라이언트가 맺은 접속이 완전히 끝나지 않는한 쓰레드 혹은 프로세스가 죽지않는 방법을 사용했습니다. 이는 ‘Keep Alive’ 설정으로 존재합니다. 하지만 이 ‘Keep Alive’ 때문에 대량접속에서는 효율이 급격하게 떨어지는 문제점도 안고 있었습니다.

‘Event MPM’은 이러한 문제를 해결할 수 있습니다. ‘Event MPM’을 사용하기 위해서는 Kqueue 나 Epoll 과 호환되는 시스템이 필요합니다.

Asynchronous support

비동기 읽고/쓰기에 대한 기능을 지원합니다. (따로 설정하거나 하는건 없고 내부 구조적으로 저런걸 지원한다는 모양입니다.)

NameVirtualHost Deprecated

Apache 2.4 에서는 NameVirtualHost 가 앞으로 사용되지 않는 옵션으로 변경되었습니다. 가까운 미래에 이 옵션을 사라질 것입니다.

Config file variables

Apache 2.4 에서는 설정 파일 내에서 변수를 사용할 수 있게 되었습니다. 사용법은 다음과 같습니다.

‘Define’ 을 이용해서 변수를 정의하면 설정 파일내에서 얼마든지 반복해서 사용할 수 있습니다.

Per-module and per-directory LogLevel configuration

모듈에 대한 LogLevel 과 각 디렉토리별 LogLevel 를 지정할 수 있게 되었습니다. 모듈에 대한 LogLevel 지정은 다음과 같습니다.

각 디렉토리별 LogLevel 은 다음과 같습니다.

그리고 debug 위로 새로운 LogLevel 인 trace1 ~ trace8 이 추가되었습니다.

Access Control

Apache 의 접근 제어는 아이피 기반, 호스트 기반, 클라이언트 요청에 대한 특이한 것들에 대해서 ‘Order’, ‘Allow’, ‘Deny’, ‘Satisfy’ 를 이용해서 했었습니다. 하지만 Apache 2.4 로 넘어오면서 인증관련 메커니즘이 조금 바뀌면서 이를 수행하는 모듈, ‘mod_authz_host’가 새롭게 만들어졌습니다. Apache 2.2 와 Apache 2.4를 비교해 예제를 보겠습니다.

모든 요청을 거부

모든 요청을 허용

example.org 는 허용 나머진 모두 거부

여기서 주의할 점은 ‘foo.example.org’ 를 ‘example.org’ 로 적는다고 해서 접근제한을 걸수 없다는 겁니다. ‘end in’ (위 예제의 .net 과 같이) 은 적용이 되지만 도메인의 일부부만을 매칭해서 전체가 적용되도록 할 수는 없습니다.

Require IP 클라이언트의 IP를 체크해서 맞으면 접속을 허용합니다.

변경된 이름들

Apache 2.4 로 넘어오면서 변경된 이름들이 존재합니다. 다음과 같습니다.

  • mod_disk_cache -> mod_cache_disk
  • MaxClients -> MaxRequestWorkers
  • MaxRequestsPerChild -> MaxConnectionsPerChild

기타 변경된 것들

이외에도 변경된 사항들이 있는데 다음과 같습니다.

  • AllowOverride 의 기본값은 None 이다.
  • EnableSendfile 의 기본값은 Off 이다.
  • KeepAlive 는 오직 On 이나 Off 두개의 값만 가질 수 있다. 예전에는 Off나 0 이 아닌값이면 On 이였다.
  • AcceptMutex, LockFile, RewriteLock, SSLMutex, SSLStaplingMutex, WatchdogMutexPath 디렉티브는 단일 Mutex 디렉티브로 교체되었다.
  • mod_reqtimeout: 만약 이 모듈을 사용한다면 기본값이 자동으로 세팅 된다.
  • mod_autoindex: 이전에 무시됬던, .xhtml 파일의 타이틀을 추출하고 설명을 표시할 수 있게됐다.
  • NameVritualHost 디렉티브는 더 이상 어떤 영향도 없으며 대신 경고를 보여줄 것이다. 어떤 주소/포트를 조합해 가상호스트를 표시하는 것은 네임기반 가상 호스트처럼 묵시적으로 다루어진다.
  • mod_deflate: 압축으로 인해서 데이터보다 압축한 것이 더 커지는, 크기 오버헤드가 있다는걸 알게된다면 압축을 건너뛴다.
  • RewriteLog, RewriteLogLevel 디렉티브는 제거되었다. 이 기능은 이제 mod_rewrite 모듈의 LogLevel 디렉티브의 적절한 로깅 레벨을 설정하는 것으로 대체되었다.  보다 자세한 사항은 mode_rewrite_logging 섹션을 참조.