disk_cache를 작동시키는 데 문제가 있었고 그 이유를 알 수 없었습니다. 이것은 내 구성의 관련 섹션이었습니다.
# Caching
CacheRoot "/var/cache/apache2/"
CacheEnable disk /
다음과 같은 요청 타이밍을 잡고 있었는데, 무슨 일이 있어도 응답이 7초를 소비했기 때문에 캐싱이 적용되지 않는 것 같았습니다.
time curl -k https://customer1.myhosts.com/appserver/slow_request?param1=fooBar
디버그 로깅을 활성화한 후 로그에서 캐싱이 수행되지 않은 이유를 설명하는 다음 명령문을 발견했습니다.
[2012년 8월 24일 금요일 17:22:01] [디버그] mod_cache.c(552): 캐시: 캐시되지 않았습니다. 이유: 쿼리 문자열이 있지만 명시적인 만료 시간이 없습니다.
이는 Apache Caching Guide에 언급되어 있습니다.
URL에 쿼리 문자열(예: HTML 양식 GET 메소드)이 포함된 경우 응답이 "Expires:" 헤더 또는 "Cache의 max-age 또는 s-maxage 지시어를 포함하여 명시적인 만료를 지정하지 않는 한 캐시되지 않습니다. -Control:" 헤더(RFC2616 섹션 13.9 및 13.2.1에 따름)
좋아요, 그래서 다음을 추가합니다.이 기사) 아파치에서
Header set Cache-Control "max-age=290304000"
여전히 작동하지 않습니다. 이번에는 메시지가 나타납니다.
"... 캐시되지 않았습니다. 이유: 마지막 수정, Etag 또는 Expires 헤더가 없습니다."
이제 이것은 다른 이야기입니다. 애플리케이션 서버 코드를 건드리지 않고 어떻게 이 문제를 해결할 수 있나요?
답변1
Apache가 애플리케이션 서버의 응답을 캐시하도록 할 수 있는 유일한 방법은 실제로 Apache가 로그에서 요청한 헤더를 응답에 추가하는 것이었습니다. JAX-RS 필터를 생성하면 매우 쉬운 것으로 나타났습니다.
따라서 Last-Modified 및 Expires 헤더를 추가한 후 필요한 유일한 것은 내 Apache 구성에 다음 두 줄뿐이었습니다.
CacheRoot "/var/cache/apache2/"
CacheEnable disk /
답변2
비슷하다
만료 없이 mod_cache를 사용하여 쿼리 문자열이 있는 파일을 Apache 2.4에서 캐시하도록 강제
Cache-Control:s-maxage=1200
이 문제를 해결했습니다