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の作成は必ず一般ユーザで行なうようにしてください。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# 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として保存するファイルはここに置いています。 変更箇所は以下です。

1
2
3
4
5
6
7
8
9
10
$ 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で行なってください。

1
# 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ヶ月キャッシュして、 それ以外はすべてキャッシュしないようにしています。

1
2
3
4
5
6
7
8
9
10
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ことはじめ