mod_file_cache - Apache HTTP Server

Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > 모듈

# 아파치 모듈 mod_file_cache

가능한 언어: en | ko

설명: | 메모리에 정적 파일들을 캐쉬
상태: | Experimental
모듈명: | file_cache_module
소스파일: | mod_file_cache.c

### 요약

이 모듈은 조심해서 사용해야 한다. `mod_file_cache`를 사용하여 사이트를 엉망으로 만들기 쉽기때문에 이 문서를 꼼꼼히 읽길 바란다.

거의 변하지 않고 자주 요청되는 파일을 캐쉬에 저장하여 서버 부하를 줄일 수 있다. `mod_file_cache`는 자주 요청되는 정적 파일을 두가지 방식으로 캐쉬에 저장한다. 설정 지시어를 사용하여 `mod_file_cache`가 파일을 열고(open) `mmap()`할지 아니면 파일을 열고 파일 핸들을 저장할지 결정한다. 두 방식 모두 파일을 서비스하기위해 필요한 작업의 일부를 (특히 파일 입출력 작업) 파일을 요청할 때마다 매번 하는 대신 서버가 시작할때 한번만 하여 서버 부하가 감소한다.

주의: 이 방법은 CGI 프로그램이나 특별한 내용핸들러를 통해 서비스하는 파일의 서비스 속도를 높일 수 없다. 이 방법은 보통 아파치 core 내용핸들러가 서비스하는 일반파일에만 적용된다.

이 모듈은 아파치 1.3에 있는 `mod_mmap_static` 모듈의 기능을 확장한 결과다.

### 지시어들

### 주제

- mod_file_cache 사용하기

## mod_file_cache 사용하기

`mod_file_cache`는 주서버 설정에서 `MMapFile`과 `CacheFile` 지시어를 사용하여 설정한 정적 파일들을 캐쉬에 저장한다.

모든 플래폼이 두 지시어를 모두 지원하는 것은 아니다. 예를 들어, 윈도우즈용 아파치는 현재 `MMapStatic` 지시어를 지원하지 않지만, AIX 같은 다른 플래폼은 둘 모두를 지원한다. 지원하지않는 지시어를 사용할 경우 서버 오류 로그에 오류문을 남긴다. 지원하지않는 지시어를 사용해도 서버는 동작하지만 파일을 캐쉬에 저장하지 않는다. 두 지시어를 모두 지원하는 플래폼을 사용한다면 어떤 방식이 더 좋은지 실험해보라.

### MMapFile 지시어

`mod_file_cache`의 `MMapFile` 지시어는 설정한 정적 파일들을 `mmap()` 시스템호출을 사용하여 메모리에 대응한다. 최신 유닉스류 운영체제라면 보통 이 시스템호출이 있지만, 없는 운영체제도 있다. 또, `mmap()`할 수 있는 파일 크기와 개수를 시스템이 제한할 수 있으므로 미리 실험해보는 것이 좋다.

서버는 시작할때와 재시작할때만 `mmap()`한다. 그래서 파일시스템에서 해당 파일중 하나라도 변경되면 서버를 재시작해야 한다 (중단과 재시작 문서 참고). 다시 말해서 파일이 변경되었는데 서버를 재시작하지 않으면 완전히 이상하게 요청을 서비스할지도 모른다. 이전 파일을 지우고(unlink) 그 자리에 새로운 파일을 만들는 방식으로 파일을 수정해야 한다. `rdist`나 `mv`와 같은 대다수의 도구가 이런 방식으로 동작한다. 매번 추가로 불필요한 `stat()` 검사가 필요하고 입출력 감소라는 원래 의도에 반하기때문에 이 모듈은 파일의 변화를 무시한다.

### CacheFile 지시어

`mod_file_cache`의 `CacheFile` 지시어는 설정 지시어에 열거한 파일(과 파일들)을 열어서 파일의 핸들(handle) 혹은 파일 기술자(file descriptor)를 캐쉬에 저장한다. 파일을 요청하면 서버는 캐쉬에서 핸들을 찾아서 소켓 API `sendfile()`에 (윈도우즈에서는 `TransmitFile()`) 넘긴다.

서버는 시작할때와 재시작할때만 파일 핸들을 캐쉬한다. 그래서 파일시스템에서 캐쉬한 파일중 하나라도 변경되면 서버를 재시작해야 한다 (중단과 재시작 문서 참고). 다시 말해서 파일이 변경되었는데 서버를 재시작하지 않으면 완전히 이상하게 요청을 서비스할지도 모른다. 이전 파일을 지우고(unlink) 그 자리에 새로운 파일을 만드는 방식으로 파일을 수정해야 한다. `rdist`나 `mv`와 같은 대다수의 도구가 이런 방식으로 동작한다.

### 주의

디렉토리의 모든 파일을 재귀적으로 캐쉬에 저장하는 지시어는 없다. 대신 다음과 같이 해보라... `Include` 지시어를 참고하여 다음과 같은 명령어를 실행한다:

`find /www/htdocs -type f -print \
| sed -e 's/.*/mmapfile &/' > /www/conf/mmap.conf`

## CacheFile 지시어

설명: | 시작시 여러 파일 핸들을 캐쉬한다
문법: | `CacheFile file-path [file-path] ...`
사용장소: | 주서버설정
상태: | Experimental
모듈: | mod_file_cache

`CacheFile` 지시어는 서버가 시작할때 여러 파일을 열고(open) 파일들의 핸들을 캐쉬에 저장한다. 서버 종료시 자동으로 캐쉬한 파일의 핸들을 닫는다(close). 파일시스템에서 파일이 변경되면 파일을 다시 캐쉬하기위해 서버를 재시작해야 한다.

file-path 아규먼트를 조심해라. 아규먼트는 아파치의 URL-파일명 변환 핸들러가 만든 파일시스템 경로와 정확히 일치해야 한다. 한번 더 불필요한 `stat()` 시스템호출이 필요하기때문에 inode나 심볼링크 등을 경로를 지정할 수 없다. 이 모듈은 `mod_alias`나 `mod_rewrite`로 재작성한 파일명을 다룰 수 있기도 없기도 하다.

### 예제

`CacheFile /usr/local/apache/htdocs/index.html`

## MMapFile 지시어

설명: | 시작시 여러 파일을 메모리에 대응한다
문법: | `MMapFile file-path [file-path] ...`
사용장소: | 주서버설정
상태: | Experimental
모듈: | mod_file_cache

`MMapFile` 지시어는 서버가 시작할때 (공백으로 구분한 아규먼트로 지정한) 여러 파일을 메모리에 대응한다(map). 서버 종료시 자동으로 대응을 푼다(unmap). 파일시스템에서 파일이 변경되면 파일들을 다시 `mmap()`하기위해 최소한 서버에 `HUP`이나 `USR1` 시그널을 보내야 한다.

file-path 아규먼트를 조심해라. 아규먼트는 아파치의 URL-파일명 변환 핸들러가 만든 파일시스템 경로와 정확히 일치해야 한다. 한번 더 불필요한 `stat()` 시스템호출이 필요하기때문에 inode나 심볼링크 등을 경로를 지정할 수 없다. 이 모듈은 `mod_alias`나 `mod_rewrite`로 재작성한 파일명을 다룰 수 있기도 없기도 하다.

### 예제

`MMapFile /usr/local/apache/htdocs/index.html`

가능한 언어: en | ko