09. 6. 18.

아파치 ETag를 이용한 정적파일 최적화

ETag는 HTTP 1.1에서 새롭게 나온 HEADER Directive 입니다. 이는 브라우져의 Cache에 저장된 파일과 웹서버의 파일이 서로 일치하는지를 식별하기 위한 방법 중에 하나로 사용 됩니다.

일반적으로 ETag는 파일을 구분하기 위해 inode 값을 사용하는데 만약 여러 대의 웹서버를 운영하는 환경에서는 접근하는 서버에 따라 inode 값이 다르기 때문에 ETag 값도 달라집니다.

브라우져는 Cache된 파일의 갱신 여부를 확인하기 위해서 수정일자와 ETag 값을 사용하는데 우선 순위는 ETag 값을 먼저 비교한 후 수정일자를 이후에 확인하는 과정을 거친다. 만약 여러 대의 웹서버를 사용하는 환경에서는 ETag 값이 다르게 인식되어 다른 서버에 접근할 경우 기존의 Cache를 지우고 갱신하게되어 Cache의 효율성이 많이 떨어지게 된다.

Cache의 효율성이 떨어지면 사용자의 입장에서는 모든 Contents를 새롭게 갱신하는 과정을 거치게 됨으로 응답 속도의 저하를 초래할 수도 있다.

그래서 보통 운영 환경에서는 ETag 값을 제거하거나 inode 값을 빼는 방식을 사용하는 일반적으로는 ETag 값을 제거하는 방식을 사용한다.

제거하는 방법은 아래와 같다. 이때 주의할 점은 Apache의 Option에서 Indexes 설정이 추가되면 ETag 설정이 지워지지 않기 때문에 반드시 Indexes 속성을 함께 제거해 주어야 한다.


...
FileETag None
...
#
# Options FollowSymLinks MultiViews # Indexes 삭제해야 함
# AllowOvrride None
# Order deny, allow
# DirectoryIndex index.php
#


# Expire 설정
#
# ExpiresActive On
# ExpireDefault "access plus 1 years"
#

#Contents Compression 설정
#
# AddOutPutFilterByType DEFLATE text/html text/css application/x-javascript
#

...


Apache 웹서버의 기본 ETag 값은 inode, mtime, size 이며, 한대의 웹서버로 운영할 경우 문제가 발생하지 않지만, L4 등의 로드밸런스를 통해 서비스할 경우 각각의 서버별로 inode 값이 다르기 때문에 다른 웹서버로 요청할 때는 기존의 cache 정보가 다른기 때문에 서버에 재 요청을 하게 된다.

참조 : http://httpd.apache.org/doc/2.0/mod/core.html#fileetag

댓글 없음:

댓글 쓰기