静的ファイルはTomcatに処理させない

TeedaなどJavaEEでウェブアプリを構築する場合、バックエンドのTomcatGlassfishApacheから転送すると思います。しかし、CSSなど静的なファイルまでTomcatに処理させるのはムダなので、これらはApacheで処理を終わらせるような設定を行いましょう。
ProxyPass とか使えば簡単じゃんと思いますが、開発時もスムーズに動くようにするには結構工夫が必要です。開発時に運用時の環境を踏まえておき、デザイナ、プログラマ、デプロイヤー(?)のタスクがスムーズに回るようにしましょう。

構成

サーバアドレスのルート直下にアプリケーションが展開され、それらはTeedaで構築しているとします*1
さらに静的ファイルに関してはまとめて扱う方が便利なので、1つのディレクトリに納めてしまいます。なのでこんな感じです。

webapp
+ /media
| + css
| + js
| + img
+ index.html
+ list.html
+ detail.html

こう構成しておくと、htmlをDreamweaver等で編集するのが楽です。ただし、開発環境ではうまく動かないのでちょっと細工します(後述)。

運用時

先に運用時の設定ですが、Apacheの設定ファイルに次のように記述します。

ProxyPass /media/ !
ProxyPass / ajp://localhost:8009/

ProxyPassでajp://localhost:8009/に転送をかけていますが、あらかじめ特定のパスに関しては通さないように記述するだけです。尚、上から適用されるので順番に注意してください。これで通常のドキュメントルート(/var/www/html/media/)の下に静的ファイルを置けばよいことになります。

デプロイ時

デプロイに使用しているシェルスクリプトは自分の場合、次のようなステップです。
1. SVNからチェックアウト
2. Maven2を使ってビルドし、Warを作成する
3. Tomcatを停止する
4. 古いWarを削除し、2で作ったWarを配備する
5. /var/www/html/media/を削除し、SVNから〜/webapp/media/ をエクスポートする
6. Tomcatを起動する
本来はTomcatを再起動する必要はないのですが、貧弱なサーバですと再起動時のコストが厳しく、Tomcatが断末魔の叫びをあげることがあり、再起動かけています。

開発時

開発時、Eclipse上からTomcatを起動するかと思いますが、デフォルトのままであるとアプリケーション名がパスに含まれ、静的ファイルへアクセスできません。同時に開発するアプリが1つしかない場合は、アプリケーションのルートパスを/にすることで解決しますが、管理画面とわけて開発している場合などはそうもいきません。かといって、わけて管理するのはもっと嫌です。
そんな場合は、Tomcatに次のようなしてWebアプリの設定をします。Windowsであれば、TOMCAT_HOME\conf\Catalina\localhost\media.xml とします。

<Context path="/media" 
              docBase="D:\projects\zzzz\product\site\src\main\webapp\media" >
</Context>

これでTomcatには/mediaというウェブアプリが作成される事になり、上手い具合にパスが通るようになります。

デザイナ視点で

デザイナ*2としてはwebapp以下をサイト管理に定義すれば、通常通りのデザイン作業が可能です。Teedaではタグがデザインを破壊することはありませんのでさらに開発しやすいですね!ただし、ソースコードの管理はプログラマ側にあわせてしっかりやることを忘れないようにしてください!
尚、プログラマ側の環境(Eclipse)に合わせるように/media以下は相対パスではなく絶対パスで記述します。

プログラマ視点で

プログラマ*3としては、そんな事しなくても簡単に設定できると思わないでください。JavaEclipseで開発を行うように、HTMLはDreamweaverという開発環境で作成しています。そちらに合わせることで、コーディングを一任できるわけです。SVNからアップデートすればいいだけになりますよ!


Teeda関連のTipsは色々あるのになかなか書き留める時間がとれない・・・orz

*1:尚、Teedaではデフォルトでは/view/がつく。また、サフィックスがhtmlにしておく。これも後で書こう。

*2:Dreamweaverを使う人

*3:Eclipseを使う人