静的ファイルはTomcatに処理させない
TeedaなどJavaEEでウェブアプリを構築する場合、バックエンドのTomcatやGlassfishにApacheから転送すると思います。しかし、CSSなど静的なファイルまでTomcatに処理させるのはムダなので、これらはApacheで処理を終わらせるような設定を行いましょう。
ProxyPass とか使えば簡単じゃんと思いますが、開発時もスムーズに動くようにするには結構工夫が必要です。開発時に運用時の環境を踏まえておき、デザイナ、プログラマ、デプロイヤー(?)のタスクがスムーズに回るようにしましょう。
構成
サーバアドレスのルート直下にアプリケーションが展開され、それらはTeedaで構築しているとします*1。
さらに静的ファイルに関してはまとめて扱う方が便利なので、1つのディレクトリに納めてしまいます。なのでこんな感じです。
webapp
+ /media
| + css
| + js
| + img
+ index.html
+ list.html
+ detail.html
こう構成しておくと、htmlをDreamweaver等で編集するのが楽です。ただし、開発環境ではうまく動かないのでちょっと細工します(後述)。
運用時
先に運用時の設定ですが、Apacheの設定ファイルに次のように記述します。
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というウェブアプリが作成される事になり、上手い具合にパスが通るようになります。