GlassFishが付加したExpiresヘッダを上書きする
Apache + GlassFishの環境で稼働中のアプリで、
アプリ内のjsファイルを修正しても、内容がクライアントに反映されなかった件の対応メモ。
GlassFishが静的ファイルにExpiresヘッダを付加するのが原因だったので、
(webapp/resourcesに配置したファイルだけ?)
今回はその前段に配置しているApacheのmod_expiresモジュールで対応しました。
GlassFishで設定出来そうな気がしますが、設定項目を見つけきれませんでした。
ご存知の方がいらっしゃれば教えて下さい><
■バージョン
OS: Scientific Linux 6.3 x86_64
Apache: 2.2.15
GlassFish: 3.1.2.2
■手順
Apacheはyumでインストール済なので、
ビルドしたRPMファイルからモジュールファイルを取り出して差し替えました。
- 依存パッケージをインストール
- 作業ディレクトリを作成
- SRPMをダウンロード
- mod_expiresのパッチファイルを作成
- specファイルを修正
- .rpmmacrosファイルを作成
- RPMファイルをビルド
- RPMファイルを解凍して、モジュールファイル「mod_expires.so」を取り出す
- モジュールファイルを差し替え
SRPMの作成は必ず一般ユーザで行なうようにしてください。
# yum install rpm-build apr-devel apr-util-devel pcre-devel
$ mkdir -p ~/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}
$ cd ~/rpmbuild/SRPMS
$ yumdownloader --source httpd
$ rpm -ivh httpd-2.2.15-28.sl6.src.rpm
$ cat << EOF > ~/rpmbuild/SOURCES/httpd-2.2.15-mod_expires.patch
--- httpd-2.2.17.orig/modules/metadata/mod_expires.c 2008-11-12 04:59:22.000000000 +0900
+++ httpd-2.2.17/modules/metadata/mod_expires.c 2011-01-20 11:47:03.000000000 +0900
@@ -472,6 +472,11 @@
expiry = apr_table_get(r->headers_out, "Expires");
t = r->headers_out;
}
+ if ( apr_table_get(r->subprocess_env, "override_expires") ) {
+ expiry = NULL;
+ apr_table_unset(t,"Expires");
+ apr_table_unset(t,"Cache-Control");
+ }
if (expiry == NULL) {
/*
* No expiration has been set, so we can apply any managed by
EOF
$ emacs ~/rpmbuild/SPECS/httpd.spec
$ cat << EOF > ~/.rpmmacros
%_topdir %(echo $HOME)/rpmbuild
%_builddir %{_topdir}/BUILD
%_rpmdir %{_topdir}/RPMS
%_sourcedir %{_topdir}/SOURCES
%_specdir %{_topdir}/SPECS
%_srcrpmdir %{_topdir}/SRPMS
%debug_package %{nil}
EOF
$ rpmbuild -ba ~/rpmbuild/SPECS/httpd.spec
$ cd ~/rpmbuild/RPMS/x86_64/
$ rpm2cpio httpd-2.2.15-28.sl6.x86_64.rpm | cpio -id
~/rpmbuild/SPECS/httpd.specとして保存するファイルはここに置いています。 変更箇所は以下です。
$ diff ~/rpmbuild/SPECS/httpd.spec{,.org}
105,108d104
<
< # my patch
< Patch212: httpd-2.2.15-mod_expires.patch
<
261,263d256
< # my patch
< %patch212 -p1 -b .mod_expires
<
モジュールのコピーはrootかsudoで行なってください。
# cp -i ~rpmbuilder/rpmbuild/RPMS/x86_64/usr/lib64/httpd/modules/mod_expires.so /usr/lib64/httpd/modules/mod_expires.so
あとは、httpd.confに以下のような設定をすればOKです。 この例では、画像のみ1ヶ月キャッシュして、 それ以外はすべてキャッシュしないようにしています。
SetEnv override_expires 1
<IfModule mod_expires.c>
ExpiresActive on
ExpiresByType image/png "access plus 1 months"
ExpiresByType image/jpeg "access plus 1 months"
ExpiresByType image/jpg "access plus 1 months"
ExpiresByType image/gif "access plus 1 months"
ExpiresDefault A0
</IfModule>
以下のブログエントリを参考にさせて頂きました。
ありがとうございます。
@kazeburoさん
mod_expiresでExpiresとCache-Controlを上書きする
mod_expiresのパッチファイルは@kazeburoさんのそのまま使わせて頂いてます><
@tnmtさん
いまさら聞けないrpmbuildことはじめ