Apache プロキシでクエリ文字列をキャッシュする

Apache プロキシでクエリ文字列をキャッシュする

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 キャッシュ ガイドに記載されていることがわかりました。

URL にクエリ文字列 (HTML フォームの GET メソッドなど) が含まれている場合、RFC2616 のセクション 13.9 および 13.2.1 に従って、応答に "Expires:" ヘッダーまたは "Cache-Control:" ヘッダーの max-age または s-maxage ディレクティブを含めることによって明示的な有効期限が指定されていない限り、キャッシュされません。

では、次の文を追加します(この記事) Apacheの

Header set Cache-Control "max-age=290304000"

まだ機能しません。今回はメッセージが表示されます

「... キャッシュされていません。理由: Last-Modified、Etag、または Expires ヘッダーがありません」

さて、これは別の話です。アプリケーション サーバーのコードに触れずに、これを解決するにはどうすればよいですか?

答え1

Apache にアプリケーション サーバーからの応答をキャッシュさせる唯一の方法は、Apache がログで要求したヘッダーを実際に応答に追加することでした。JAX-RS フィルターを作成することで、非常に簡単に実行できることがわかりました。

したがって、Last-Modified と Expires ヘッダーを追加した後、必要なのは Apache 設定の次の 2 行だけでした。

CacheRoot   "/var/cache/apache2/"
CacheEnable disk / 

答え2

関連情報