본문 바로가기

Apache / Tomcat

[Apache] mod_expires를 이용한 캐시설정

반응형

우리가 인터넷을 사용할때 사용하는 브라우저는 웹페이지 접근시에 이미지, 문서 등과 같은 파일을 임시로 하드디스크에 저장한다. 이를 웹브라우저 캐시라고도 한다.


하드디스크에 저장하는 이유는 이후 동일 사이트 접속시 미리 최근에 저장해놓은 파일들을 이용하여 웹 페이지를 빠르게 로딩하기 위함이다.

하지만 캐시는 영원히 디스크에 남는것이 아니고, 주기적으로 삭제가 된다. 웹 브라우저는 단지 최근에 방문한 사이트만의 캐시만을 가지고 있을 뿐이다.

사실 개발자 입장에서는 캐시를 적절하게 사용하면 웹사이트의 성능을 높일 수 있다. 예를 들어 나같은경우 에전에 진행했던 프로젝트에서 한 화면에 노출되는 이미지의 용량이 엄청났었는데, 사용자가 웹페이지에 접속하면 이미지들을 불러오느라 꽤 많은 시간이 소요되는것을 확인하였다.

이때 제일먼저 든 생각은 "이미지 전용 서버"를 구축할까 했었지만 프로젝트 여건상 불가능 했다. 그래서 생각해낸것이
당시에 사용하던 apache2.2에 캐시 모듈을 적용하는 것이었다.

이 경우 최초 접속자는 더딘 로딩을 경험하게 되지만 이후부터는 캐시를 활용하여 빠른 속도의 로딩속도를 보였다.
(물론 당시에는 IE 성능이 구려서 로딩 속도가 느렸지만 FF나 Chrome은 빠른 로딩을 했다.)

아파치에서 제공하는 캐시모듈을 적용하면 지정한 기간동안 캐시로 보관되며, 이후 접속자는 해당 기간동안 캐시를 활용하여 로딩이 된다.


사용자가 본격적으로 캐시를 활용하게 되면 트래픽이 줄어들게 되어 서버 운영등에 있어서 많은 이점이 있다.



아파치에서는 mod_expire 모듈을 통해 Expires Http header를 지정할 수 있다.
mod_expire모듈은 http header와 Cache-Control HTTP 헤더의 캐시 부분 설정인 max-age(만기일) 설정을 조정함으로서 사용자의 캐시 유효기간을 설정할 수 있다.


그러면 아파치에서 mod_expire를 사용하는 방법을 보자.


1. mod_expires.so 모듈 확인




* ${아파치 경로}/module 에서 mod_expires.so 파일이 있는지 확인한다.



2. http.conf에 mod_expire 모듈을 로딩할 수 있게끔 추가한다.


 LoadModule expires_module     modules/mod_expires.so




3. http.conf 또는 virtual host 부분에 설정을 추가한다.


    <IfModule mod_expires.c>
        ExpiresActive On
        ExpiresByType image/gif "access plus 1 month"
        ExpiresByType image/png "access plus 1 month"
        ExpiresByType image/jpeg "access plus 1 month"
        ExpiresByType text/css "access plus 1 month"
        ExpiresByType application/javascript "access plus 1 month"
        ExpiresByType application/x-shockwave-flash "access plus 1 month"
    </IfModule>

    ErrorLog logs/t.go.kr-errors.log
    CustomLog "|/usr/local/cronlog/sbin/cronolog /usr/local/apache/logs/t.go.kr-access_%Y%m%d.log" combined env=!image-request

    JkMount /*.jsp worker1
</VirtualHost>



4. 아파치 재시작




위의 설정은 gif, png, jpeg, css, javascript 파일에 대하여 1달간 캐시 설정을 하겠다는 뜻이다.

month와 같은 기간 설정은 아래 type으로 사용이 가능하다.


years
months
weeks
days
hours
minutes
seconds

예)
ExpiresByType image/gif "access plus 1 month 10 days"
ExpiresByType image/png "access plus 1 year"





덧) 그런데 또 요즘은 인터넷 속도및 브라우저 성능이 좋아서 정말 많은 이미지를 처리하는 사이트가 아닌이상 캐시 설정이 필요할까 싶다. 웹 사이트의 속도가 느리다면 정말 이미지 등과 같은 정적 데이터때문에 느린것인지, 아니면 다른 구간에서 느린것인지 먼저 체크가 필요하다.