質問
Tomcat 6では、openbluedragonを実行しているサーブレットがあり、画像を除いてすべてがコンパイルされ、サーバーがすぐに起動しますが、実際には大幅に遅れます。画像配信の最適化に関する提案はありますか?
これが私のserver.xmlです。
<Service name="Catalina">
<Connector port="8009" protocol="AJP/1.3" />
<Connector port="8080" maxThreads="100" protocol="HTTP/1.1" connectionTimeout="20000" />
<Engine name="Standalone" defaultHost="hostname.whatever" jvmRoute="ajp13">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/>
<Host name="hostname.whatever" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
...context
</Host>
</Engine>
</Service>
解決
もう 1 つのオプションは、Apache をフロントエンドとして使用し、Tomcat を mod_jk に接続することです。このようにして、Apache に静的コンテンツ (例:画像、CSS、JavaScript) を使用して、Tomcat に動的コンテンツを生成させます。静的コンテンツを動的コンテンツから分離するために少し作業が残るかもしれませんが、私にとってはうまくいきました。
Unix では、ポート 80 にバインドされると root として実行する必要が生じることが多いため、Apache をフロントエンドとして使用するのは良い選択肢です。Apache はポートをバインドした後に root 権限を削除する方法を知っていますが、Tomcat は知りません。一般公開されているサーバーを root として実行することは望ましくありません。
(これはリバース プロキシの回答に似ていますが、プロキシではなく mod_jk が関係します)
他のヒント
同じ画像セットを何度も提供していませんか?その場合、適切な Expires ヘッダーを追加するサーブレット フィルターを追加すると、Tomcat の作業が大幅に節約される可能性があります。提供される画像の速度は向上しませんが、処理しなければならないリクエストの数が減るだけです。この例はウェブ上にたくさんあります。
オプションがある場合は、アプリケーションの前にリバース プロキシを追加できます。職場では、すべての受信 HTTP 接続を受信する Apache Web サーバーを使用しています。URL に基づいて、リクエストを別のサーバーに転送するか、コンテンツ自体を提供します。私はこのアプローチを使用して、Trac サイトの静的コンテンツの提供を高速化しました。この方法を使用する場合は、ProxyPass ディレクティブと ProxyPassReverse ディレクティブから検討を始めるとよいでしょう。
簡単な例として、/images という仮想ディレクトリがある場合、Apache はそのディレクトリ内の何かに対するあらゆるリクエストを処理し、他のすべてを Tomcat インスタンスに転送できます。構文は非常に包括的です。静的コンテンツを識別する方法が少しでもあれば、これは有効なアプローチです。
ここでの選択肢は Apache だけではありません。最近のすべての Web サーバーには同様の機能が含まれていると思います。もし私が今日から始めるとしたら、おそらく代わりに LigHTTPd を検討するでしょう。それは単に機能が少ないからです。
これを自動的に判断するキャッシュ リバース プロキシも存在する場合があります。しかし、私はそれらのどれにも精通していません。