서버 설정 · 4 min read · Dec 28, 2025

Debian Lenny에서 Apache의 mod_cache로 캐싱하기

Debian Lenny에서 Apache의 mod_cache로 캐싱하기

버전 1.0
저자: Falko Timme
Twitter에서 나를 팔로우하세요

이 문서에서는 Debian Lenny에서 Apache의 mod_cache를 사용하여 웹 사이트 콘텐츠를 캐싱하는 방법을 설명합니다. 요청마다 많은 데이터베이스 쿼리를 생성하는 고트래픽 동적 웹 사이트가 있는 경우, 콘텐츠를 몇 분 이상 캐싱하여 서버 부하를 크게 줄일 수 있습니다(이는 콘텐츠를 얼마나 자주 업데이트하는지에 따라 다릅니다).

이 방법이 당신에게 효과가 있을 것이라는 보장은 하지 않습니다!

1 사전 참고

Apache2 설정이 제대로 작동한다고 가정합니다(Apache 2.2.x - 그 이전 버전에서는 mod_cache가 실험적입니다) Debian 저장소에서 - Debian Lenny 저장소의 Apache 버전은 2.2.9이므로 잘 작동할 것입니다.

테스트 가상 호스트를 위해 여기서 문서 루트 /var/www를 사용하고 있습니다 - 문서 루트가 다르다면 조정해야 합니다.

2 mod_cache 활성화

mod_cache에는 캐시 저장소를 관리하는 두 개의 하위 모듈이 있습니다: mod_disk_cache(하드 드라이브에 콘텐츠 저장용)와 mod_mem_cache(메모리에 콘텐츠 저장용, 디스크 캐싱보다 빠릅니다). 사용할 모듈을 결정하고 2.1장(mod_disk_cache) 또는 2.2장(mod_mem_cache) 중 하나를 계속 진행하세요.

2.1 mod_disk_cache

mod_disk_cache 구성은 /etc/apache2/mods-available/disk_cache.conf에 저장되므로 해당 파일을 편집합시다:

vi /etc/apache2/mods-available/disk_cache.conf

CacheEnable disk / 줄의 주석을 제거하여 최소 구성은 다음과 같아야 합니다:

| # 캐시 청소는 htcacheclean에 의해 수행되며, 이는 # /etc/default/apache2에서 구성할 수 있습니다. # # 추가 정보는 해당 파일의 주석, # /usr/share/doc/apache2.2-common/README.Debian 및 htcacheclean(8) # 매뉴얼 페이지를 참조하세요. # 이 경로는 /etc/default/apache2의 경로와 같아야 합니다. CacheRoot /var/cache/apache2/mod_disk_cache # 이것은 로컬 문서도 캐시합니다. 일반적으로 # 단일 가상 호스트의 구성에 넣는 것이 더 의미가 있습니다. CacheEnable disk / CacheDirLevels 5 CacheDirLength 3 |

이 구성 옵션에 대한 설명과 추가 구성 옵션은 http://httpd.apache.org/docs/2.2/mod/mod_disk_cache.html에서 확인할 수 있습니다.

이제 mod_cache와 mod_disk_cache를 활성화할 수 있습니다:

a2enmod cache
a2enmod disk_cache

/etc/init.d/apache2 restart 

캐시 디렉토리 /var/cache/apache2/mod_disk_cache가 시간이 지남에 따라 가득 차지 않도록 htcacheclean 명령으로 청소해야 합니다. 해당 명령은 apache2-utils 패키지의 일부로, 다음과 같이 설치합니다:

aptitude install apache2-utils 

그 후, 다음과 같이 htcacheclean을 데몬으로 시작할 수 있습니다:

htcacheclean -d30 -n -t -p /var/cache/apache2/mod_disk_cache -l 100M -i

이 명령은 30분마다 캐시 디렉토리를 청소하고 100MB를 초과하지 않도록 합니다. htcacheclean에 대해 더 알고 싶다면 다음을 참조하세요:

man htcacheclean

물론 서버를 재부팅할 때마다 htcacheclean을 수동으로 시작하고 싶지는 않을 것입니다 - 따라서 /etc/rc.local을 편집합니다…

vi /etc/rc.local

… 그리고 exit 0 줄 바로 앞에 다음 줄을 추가합니다:

| [...] /usr/sbin/htcacheclean -d30 -n -t -p /var/cache/apache2/mod_disk_cache -l 100M -i [...] |

이렇게 하면 서버를 시작할 때마다 htcacheclean이 자동으로 시작됩니다.

2.2 mod_mem_cache

mod_mem_cache 구성은 /etc/apache2/mods-available/mem_cache.conf에 있습니다:

vi /etc/apache2/mods-available/mem_cache.conf   

| CacheEnable mem / MCacheSize 4096 MCacheMaxObjectCount 100 MCacheMinObjectSize 1 MCacheMaxObjectSize 2048 |

이것은 기본 구성입니다 - 원하시면 수정할 수 있습니다. mod_mem_cache에 대한 구성 지시어 목록은 여기에서 확인할 수 있습니다: http://httpd.apache.org/docs/2.2/mod/mod_mem_cache.html

이제 mod_cache와 mod_mem_cache를 다음과 같이 활성화합시다:

a2enmod cache
a2enmod mem_cache

/etc/init.d/apache2 restart

이것으로 끝입니다! mod_mem_cache를 사용하면 캐시 디렉토리를 청소할 필요가 없습니다.

3 테스트

불행히도 mod_cache는 로깅 기능을 제공하지 않기 때문에 로깅이 작동하는지 알고 싶다면 불편합니다. 따라서 저는 작은 PHP 테스트 파일인 /var/www/cachetest.php를 생성하여 mod_cache에 300초 동안 파일을 캐시하라고 지시하는 HTTP 헤더를 보내고, 단순히 타임스탬프를 출력합니다:

vi /var/www/cachetest.php

| "; ?> |

이제 브라우저에서 해당 파일을 호출하세요 - 현재 타임스탬프가 표시되어야 합니다. 그런 다음 브라우저의 주소 표시줄을 클릭하고 ENTER를 눌러 페이지를 다시 로드하세요(새로 고침 버튼이나 F5를 누르지 마세요 - 이는 항상 서버에서 새 복사본을 가져옵니다!). 모든 것이 잘 진행되면 여전히 이전의 캐시된 타임스탬프가 표시되어야 합니다. 300초를 기다리면 캐시 대신 서버에서 새 복사본을 가져와야 합니다.

4 HTTP 헤더

캐싱은 기본적으로 작동하지 않습니다 - 캐싱이 작동하도록 웹 애플리케이션을 수정해야 합니다(귀하의 웹 애플리케이션이 이미 캐싱을 지원할 수 있습니다 - 이를 확인하려면 애플리케이션 문서를 참조하세요). mod_cache는 웹 애플리케이션에서 전송된 HTTP 헤더가 캐시하도록 지시할 때만 웹 페이지를 캐시합니다.

다음은 mod_cache에 캐시하지 말라고 지시하는 헤더의 몇 가지 예입니다:

  • 과거 날짜가 있는 Expires 헤더: “Expires: Sun, 19 Nov 1978 05:00:00 GMT”
  • 특정 Cache-Control 헤더: “Cache-Control: no-store, no-cache, must-revalidate” 또는 “Cache-Control: must-revalidate, max-age=0”
  • Set-Cookie 헤더: 쿠키가 설정되면 페이지는 캐시되지 않습니다.

따라서 mod_cache가 페이지를 캐시하도록 하려면 애플리케이션을 수정하여 이러한 헤더를 전송하지 않도록 해야 합니다.

mod_cache가 페이지를 캐시하도록 하려면 미래의 날짜로 Expires 헤더를 설정할 수 있지만, 권장되는 방법은 max-age를 사용하는 것입니다:

"Cache-Control: must-revalidate, max-age=300"

이것은 mod_cache에 페이지를 300초 동안 캐시하라고 지시합니다( max-age) - 불행히도 mod_cache는 s-maxage 옵션을 알지 못합니다(자세한 내용은 http://www.mnot.net/cache_docs/#CACHE-CONTROL 참조), 그래서 max-age 옵션을 사용해야 합니다(이는 브라우저에게도 캐시하라고 지시합니다 - 예기치 않은 결과가 발생할 경우 이를 염두에 두세요!). mod_cache가 s-maxage 옵션을 알았다면 “Cache-Control: must-revalidate, max-age=0, s-maxage=300”를 사용할 수 있었을 것입니다. 이는 mod_cache에 페이지를 캐시하라고 지시하지만 브라우저에는 그렇지 않도록 합니다.

물론, 이 헤더는 위에서 언급한 비캐싱 헤더(과거의 Expires, Set-Cookie 등)를 동시에 전송하면 무용지물입니다!

캐싱에 매우 중요한 또 다른 헤더는 다음과 같습니다:

"Vary: Accept-Encoding"

이것은 mod_cache가 각 캐시된 페이지의 두 개 복사본을 유지하게 하며, 하나는 압축된(gzip) 버전이고 다른 하나는 압축되지 않은 버전입니다. 이는 사용자 에이전트/브라우저의 기능에 따라 올바른 버전을 제공할 수 있습니다. 일부 사용자 에이전트는 gzip 압축을 이해하지 못하므로 압축되지 않은 버전을 받아야 합니다.

따라서 요약하자면, mod_cache가 캐시하도록 하려면 다음 두 헤더를 사용하세요:

“Cache-Control: must-revalidate, max-age=300”
“Vary: Accept-Encoding”

그리고 과거 날짜의 Expires, 쿠키 등이 전송되지 않도록 하세요.

애플리케이션이 PHP로 작성된 경우, PHP의 header() 함수를 사용하여 HTTP 헤더를 전송할 수 있습니다, 예를 들어 다음과 같이:

header(“Cache-Control: must-revalidate, max-age=300”);
header(“Vary: Accept-Encoding”);

HTTP 헤더와 캐싱에 대해 더 알고 싶다면 이 페이지를 꼭 읽어보세요: http://www.mnot.net/cache_docs/

5 링크

Share: X/Twitter LinkedIn

새 게시물을 받은 편지함에서 받기

스팸은 없습니다. 언제든지 구독 해지 가능합니다.