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ファイルからモジュールファイルを取り出して差し替えました。

  1. 依存パッケージをインストール
  2. 作業ディレクトリを作成
  3. SRPMをダウンロード
  4. mod_expiresのパッチファイルを作成
  5. specファイルを修正
  6. .rpmmacrosファイルを作成
  7. RPMファイルをビルド
  8. RPMファイルを解凍して、モジュールファイル「mod_expires.so」を取り出す
  9. モジュールファイルを差し替え

SRPMの作成は必ず一般ユーザで行なうようにしてください。

{% codeblock %}

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 {% endcodeblock %}

 

~/rpmbuild/SPECS/httpd.specとして保存するファイルはここに置いています。 変更箇所は以下です。 {% codeblock %} $ 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 < {% endcodeblock %}

 

モジュールのコピーはrootかsudoで行なってください。 {% codeblock %}

cp -i ~rpmbuilder/rpmbuild/RPMS/x86_64/usr/lib64/httpd/modules/mod_expires.so /usr/lib64/httpd/modules/mod_expires.so

{% endcodeblock %}

 

あとは、httpd.confに以下のような設定をすればOKです。 この例では、画像のみ1ヶ月キャッシュして、 それ以外はすべてキャッシュしないようにしています。

{% codeblock %} 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> {% endcodeblock %}

 

以下のブログエントリを参考にさせて頂きました。
ありがとうございます。

@kazeburoさん 
mod_expiresでExpiresとCache-Controlを上書きする
mod_expiresのパッチファイルは@kazeburoさんのそのまま使わせて頂いてます><

@tnmtさん 
いまさら聞けないrpmbuildことはじめ

 
comments powered by Disqus