본문으로 건너뛰기

아파치 File ETag 적용 방법은 무엇인가요?

💡 요약 정리

  • ETag는 HTTP 1.1의 캐시 유효성 검증(cache validation)에 사용되는 response 헤더입니다.
  • 기본적으로 inode, size, last-modified-time을 이용하여 ETag 값을 계산합니다.
  • 클러스터 환경에서는 서버마다 다른 inode로 인해 같은 파일에 대해 다른 ETag가 생성될 수 있습니다.
  • FileETag directive를 사용하여 MTime과 Size만으로 ETag를 계산하도록 설정합니다.
  • Apache 1.3.23 버전 이상에서 사용 가능합니다.

설치환경

  • CentOS 5.x (64bit)
  • Apache 2.2.23

1. ETag란?

정의

ETag(Entity Tag)는 HTTP 1.1에 명시되어 있는 response 헤더로서 cache validation으로 사용될 수 있는 값을 나타냅니다.

동작 원리

caching을 수행하는 측에서는 if-modified-since로 validation을 수행할 때 저장되어 있던 ETag 값을 같이 이용하여 좀 더 확실한 validation을 할 수 있습니다.

ETag 계산 방식

Apache는 다음 세 가지 속성을 이용하여 ETag 값을 계산합니다:

  1. inode (파일의 inode 번호)
  2. size (파일 크기)
  3. last-modified-time (최종 수정 시간)

2. 클러스터 환경에서의 문제점

2대 이상의 웹서버들로 클러스터를 구성하게 되었을 경우, 웹서버마다 같은 파일이라도 상이한 inode 값을 가지고 있기 때문에 문제가 발생합니다.

문제 상황

Server A: 같은 파일 → ETag: "inode-1234-size-mtime"
Server B: 같은 파일 → ETag: "inode-5678-size-mtime"

위와 같이 같은 파일임에도 불구하고 서버마다 다른 ETag가 생성되어 캐시 효율성이 떨어집니다.

해결 방법

ETag 계산방식을 변경하여 웹서버가 다르더라도 같은 파일에 대하여 같은 ETag 값을 보내주도록 해야 합니다.

Apache의 FileETag directive를 사용하여 inode를 제외하고 MTime과 Size만으로 ETag를 계산하도록 설정합니다.


3. FileETag 설정 방법

httpd.conf 파일 수정

/home/APM/apache/conf/httpd.conf 파일을 수정하여, ETag 적용을 원하는 디렉토리에 다음과 같이 추가합니다:

[root@cafe24 ~]# vi /home/APM/apache/conf/httpd.conf
<Directory "/home/APM/apache/htdocs">
    #
    # Possible values for the Options directive are "None", "All",
    # or any combination of:
    #   Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
    #
    # Note that "MultiViews" must be named *explicitly* --- "Options All"
    # doesn't give it to you.
    #
    # The Options directive is both complicated and important.  Please see
    # http://httpd.apache.org/docs/2.2/mod/core.html#options
    # for more information.
    #
    Options Indexes FollowSymLinks

    #
    # AllowOverride controls what directives may be placed in .htaccess files.
    # It can be "All", "None", or any combination of the keywords:
    #   Options FileInfo AuthConfig Limit
    #
    AllowOverride None

    #
    # Controls who can get stuff from this server.
    #
    Order allow,deny
    Allow from all
    FileETag MTime Size

</Directory>

설정 설명

FileETag MTime Size

  • MTime: last-modified time (최종 수정 시간)
  • Size: 파일 크기

이렇게 설정하면 inode를 제외하고 MTime과 Size만을 사용하여 ETag를 계산합니다.


4. FileETag Directive 옵션

옵션설명
INode파일의 inode 번호 사용
MTime파일의 최종 수정 시간 사용
Size파일의 크기 사용
All모든 속성 사용 (INode + MTime + Size)
NoneETag 생성 안 함

권장 설정

단일 서버 환경:

FileETag All

클러스터 환경 (2대 이상의 웹서버):

FileETag MTime Size

5. 효과 및 장점

캐시 효율성 향상

같은 파일에 대해서는 여러 웹서버마다 동일한 ETag 값이 계산되도록 할 수 있습니다.

예시

설정 전 (클러스터 환경):

Server A → ETag: "abc123-1024-20250115"  # inode 포함
Server B → ETag: "def456-1024-20250115"  # 다른 inode
→ 브라우저가 서버를 바꿔가며 접속 시 캐시 미스 발생

설정 후 (FileETag MTime Size):

Server A → ETag: "1024-20250115"  # inode 제외
Server B → ETag: "1024-20250115"  # 동일한 ETag
→ 브라우저가 서버를 바꿔가며 접속해도 캐시 히트

6. Apache 재시작

설정 변경 후 Apache를 재시작해야 합니다.

[root@cafe24 ~]# /home/APM/apache/bin/apachectl restart

또는

[root@cafe24 ~]# service httpd restart

7. 설정 확인

curl로 ETag 확인

curl -I http://example.com/test.html

응답 예시:

HTTP/1.1 200 OK
Date: Mon, 15 Jan 2025 12:00:00 GMT
Server: Apache/2.2.23
Last-Modified: Mon, 15 Jan 2025 10:00:00 GMT
ETag: "400-20250115100000"
Accept-Ranges: bytes
Content-Length: 1024
Content-Type: text/html

8. 주의사항

버전 요구사항

FileETag directive는 Apache 1.3.23 버전 이상에서 사용할 수 있습니다.

호환성

  • Apache 1.3.23+
  • Apache 2.0+
  • Apache 2.2+
  • Apache 2.4+

성능 영향

ETag 설정 자체는 성능에 큰 영향을 주지 않으며, 오히려 적절한 캐싱으로 전체적인 성능 향상 효과가 있습니다.


9. 추가 최적화

mod_expires와 함께 사용

ETag와 함께 mod_expires를 사용하면 더욱 효과적인 캐싱이 가능합니다.

<Directory "/home/APM/apache/htdocs">
    FileETag MTime Size

    <IfModule mod_expires.c>
        ExpiresActive On
        ExpiresByType image/jpeg "access plus 1 year"
        ExpiresByType image/png "access plus 1 year"
        ExpiresByType text/css "access plus 1 month"
        ExpiresByType application/javascript "access plus 1 month"
    </IfModule>
</Directory>

참고 자료