web-dev-qa-db-ja.com

Glassfish / JBoss / TomcatのフロントエンドとしてApacheを実行することが本当に必要ですか?

私は主にJava=開発者です。開発者とシステム管理者の間の隔たりにまたがる質問をします。

数年前、Tomcatをアプリケーションサーバーとして実行するのが斬新だったとき、Apacheを前面に配置するのが慣習でした。私が理解しているように、これは次の理由で行われました。

  1. Javaは「遅い」と考えられており、Apacheが静的コンテンツを直接提供するようにすると役立ちました。
  2. Tomcatはrootとして実行しないとポート80/443をリッスンできず、危険でした。

Javaはもはや遅いと考えられていません。私はApacheをミックスに追加することで実際にスピードアップに役立つとは思えません。

ポートの問題については、最近、アプリサーバーをポート80/443に接続する簡単な方法があるでしょう。

だから私の質問は-最近、Java ApacheでWebアプリケーションを前面に配置することには本当にメリットがあるのでしょうか?そうであれば、Apacheはまだ先ですか?Tomcatの代わりにNginxを見る必要がありますか? m必要に応じてGlassfishを使用します。

14
Caffeine Coma

静的ファイルのため、ほとんどの人はあなたが前に何かが必要だと言うでしょう。

次の理由により、これは多少ばかげています。

  • Tomcatを構成して、APRでApacheと同じIOを使用することができます。
  • とにかく、CDN(コンテンツ配信ネットワーク)を使用する必要があります。

負荷分散してフェイルオーバーを処理するためにTomcat/jetty/jbossの前に何かが必要な本当の理由

... Tomcatエンジンはエコスフィア全体のアキレス腱...」は聞かないことをお勧めします。真実ではない...あなたのデータベースとその接続プーリングはそれです。

8
Adam Gent

それはあなたのアプリの周りのエコシステムに依存します。イントラネット環境では、おそらくTomcatの前には何も必要ありません。

公共向けサービスとしてインターネット上で一人である場合、それは依存します。 Apacheは、mod_securityのようにモジュールを提供するので便利です。しかし、Apache(またはngix)の構成に精通していない場合は、構成の誤りにより、さらに多くの攻撃や障害点にさらされる可能性があります。

前のApacheは、Webアプリケーションをアップグレードして再起動を待つ必要がある場合に、停止ページを提供するのに役立ちます。ただし、再起動がまれであるか、正しく再起動される場合は、Tomcatをスタンドアロンにするもう1つの理由です。

Tomcat FAQは、これについてもいくつかの追加の点に言及しています) http://wiki.Apache.org/Tomcat/FAQ/Connectors#Q

5
Tim Funk

Apacheは、マルチプロセスの性質上、静的コンテンツを提供するのに適した候補ではありません。 Nginxは非同期I/Oを使用してリクエストを処理するため、より適しています。最新のTomcatは非同期I/O(Java用語)のNIO)も使用できます。たとえば、Todoraで非同期I/Oを使用するには、FedoraにTomcat-nativeパッケージをインストールする必要があります。

1
Alex

すばらしい、これらの答えのいくつか-あなたの誰かが実際に高性能の多層マルチサーバーTomcatでサポートされたWebサイトを実行していますか? OP、Tomcatが「遅い」ではないというあなたの元々の仮定...すごい。 Tomcatエンジンは、エコスフィア全体のアキレス腱です。

はい、Apacheを前面に置きます。これにより、何よりもまずmod_rewrite(TomcatにUrlRewriteFilterを実装済みですか?)と、Webサーバーの保護を非常に重要にするhtaccessファイルが提供されます。 Apacheを使用すると、Tomcatノードの負荷を分散し、静的コンテンツをより迅速に提供し、Tomcatからbetterパフォーマンスを得ることができます。非Java(js/css/html/jpg/etc。)のパイプをリクエストします。 ApacheでSSLをオフロードでき(ハードウェアLBでオフロードしない場合)、Java Keystoreと呼ばれるそのような厄介なことに対処する必要さえありません。非常に多くの勝利があります。 mod_jkをバックエンドノードに合わせて調整することで、Javaの貧弱な頭脳をオーバーランさせないようにします。これは、通常、平均Javaコーダーのクラスでは大量のトラフィックを処理できないためです。

Apache(またはnginxなど-ただし、ApacheのパフォーマンスはTomcatよりも優れているため、問題ではない)は、Tomcatの前ではお勧めできません。

1
user15590

Tomcatを使用するときにrootにならずに特権ポートをバインドするだけの問題であれば、Apache httpdを前に置く必要はありません。 Tomcatにはデフォルトでjsvcが付属しており、コンパイルする必要があります。

jsvcは、Tomcatをサービスとして起動するためのJavaサービスラッパーです。このサービスはrootとして起動しますが、Tomcatを通常のユーザーとして起動します。したがって、Tomcatを特権ポートにバインドできます。

Glassfishについては知りませんが、ソリューションが存在することを確認してください。存在しない場合は、確実にポート転送技術(iptablesなど)を使用できます。

アプリケーションサーバーをWebサーバー(Apache httpdなど)の前に置くという選択は、負荷分散、クラスタリング、またはWebサーバーでのみ静的リソースを提供し、アプリケーションサーバーで動的リソースを提供するためのものだと思います。

0
Laurent T