Apache 2.4 새로운 기능
이 문서는 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 에서는 설정 파일 내에서 변수를 사용할 수 있게 되었습니다. 사용법은 다음과 같습니다.
1 2 3 |
Define servername www.example.com DocumentRoot /var/www/${servername}/htdocs |
‘Define’ 을 이용해서 변수를 정의하면 설정 파일내에서 얼마든지 반복해서 사용할 수 있습니다.
Per-module and per-directory LogLevel configuration
모듈에 대한 LogLevel 과 각 디렉토리별 LogLevel 를 지정할 수 있게 되었습니다. 모듈에 대한 LogLevel 지정은 다음과 같습니다.
1 2 3 |
LogLevel info ssl:warn LogLevel info mod_ssl.c:warn LogLevel info ssl_module:warn |
각 디렉토리별 LogLevel 은 다음과 같습니다.
1 2 3 4 |
LogLevel info <Directory "/usr/local/apache/htdocs/app"> LogLevel debug </Directory> |
그리고 debug 위로 새로운 LogLevel 인 trace1 ~ trace8 이 추가되었습니다.
Access Control
Apache 의 접근 제어는 아이피 기반, 호스트 기반, 클라이언트 요청에 대한 특이한 것들에 대해서 ‘Order’, ‘Allow’, ‘Deny’, ‘Satisfy’ 를 이용해서 했었습니다. 하지만 Apache 2.4 로 넘어오면서 인증관련 메커니즘이 조금 바뀌면서 이를 수행하는 모듈, ‘mod_authz_host’가 새롭게 만들어졌습니다. Apache 2.2 와 Apache 2.4를 비교해 예제를 보겠습니다.
모든 요청을 거부
1 2 3 4 5 6 |
#2.2 configuration: Order deny,allow Deny from all #2.4 configuration: Require all denied |
모든 요청을 허용
1 2 3 4 5 6 |
#2.2 configuration: Order allow,deny Allow from all #2.4 configuration: Require all granted |
example.org 는 허용 나머진 모두 거부
1 2 3 4 5 6 7 8 |
#2.2 configuration: Order Deny,Allow Deny from all Allow from example.org #2.4 configuration: Require host example.org Require host .net example.edu |
여기서 주의할 점은 ‘foo.example.org’ 를 ‘example.org’ 로 적는다고 해서 접근제한을 걸수 없다는 겁니다. ‘end in’ (위 예제의 .net 과 같이) 은 적용이 되지만 도메인의 일부부만을 매칭해서 전체가 적용되도록 할 수는 없습니다.
Require IP 클라이언트의 IP를 체크해서 맞으면 접속을 허용합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# A full IP address Require ip 10.1.2.3 Require ip 192.168.1.104 192.168.1.205 # A partial IP address Require ip 10.1 Require ip 10 172.20 192.168.2 # A network/netmask pair Require ip 10.1.0.0/255.255.0.0 # A network/nnn CIDR specification Require ip 10.1.0.0/16 |
변경된 이름들
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 섹션을 참조.