web-dev-qa-db-ja.com

Apache WebサーバーとTomcat:複数のTomcatWebアプリとApacheWebサーバーアプリを同時に実行する

現在、Tomcatインスタンスがあり、webappsファイルに3つのWARがあるDebianX64サーバーがあります。また、1つのCMSシステムが実行されているApacheWebサーバーがあります。そして最後のプロジェクトの1つはMaintenance webappです。これは、サーバーで作業していてサービスが利用できないときに表示されます。

私たちが直面している問題は次のとおりです。

  1. TomcatまたはApacheWebサーバーのうち1つだけが、常にPort-80でアクティブに実行されています。
  2. Tomcatアプリの場合、アプリには異なるコンテキストパスでアクセスする必要があります。
  3. 複数のドメイン名ですべてを実行することはできませんが、単一のサーバーで実行できます。

私が長期的にやろうとしていること:

  1. ドメイン名に基づいてリクエストを中継するロードバランサーとして、Tomcat(推奨)またはApacheWebサーバーを使用します。したがって、誰かがurl www.xyz.comを呼び出している場合は、私たちが持っているXYZwebappを呼び出す必要があります。同じwebapp名とドメイン名はまったく偶然です。
  2. Maintenance webappをグリッド全体に結び付けます。これは、ドメインが稼働していないか、応答していないか、ビジー状態のときに呼び出されます。

私は写真(恐ろしいもの.. : )を作成しました。これはタスクをもう少し説明的に説明しています。

---(enter image description here

アーキテクチャがわかるように、ここに私の質問があります。

  1. これは良いアプローチですか?そうでない場合は、どこで何を改善できるかを教えてください。
  2. 私がやろうとしているタスク、それは何と呼ばれていますか?グリッド構成、負荷分散?
  3. すべてのWebアプリ、異なるURLを介して参照できるが、正しいWebアプリまたはWebサイトを指すWebサイトを結び付ける方法。
  4. 私はApacheTomcatとLinuxの管理についてよく理解していますが、ApacheWebサーバーについてはあまり理解していません。誰かがこの問題をどのように進めるか、いくつかの計画と私が必要とするものについて私を助けてくれるので、私はそれを実行することができます。

すべてのウェブアプリとウェブサーバーベースのウェブサイトのDNSにドメイン名が登録されていることに注意してください。

十分な情報を追加したと思います。何か必要なことがあれば、教えてください。どんな助けでもいいでしょう。どうもありがとう。 :-)

3
We are Borg

私は最終的にこの問題を次の設定に変更することで解決することができました:

Tomcatのserver.xml:

 <Connector port="8080" proxyPort="80" redirectPort="443" protocol="HTTP/1.1" compression="force" compressionMinSize="1024" 
               connectionTimeout="20000"  maxPostSize="5242880"
               URIEncoding="utf-8"
 compressableMimeType="text/html,text/xml,text/plain,text/css,text/ javascript,application/x-javascript,application/javascript"/>


 <Connector port="443" protocol="org.Apache.coyote.http11.Http11NioProtocol"  maxPostSize="5242880" SSLEnabled="true" maxThreads="200" compr$
              compressionMinSize="1024" scheme="https" secure="true" clientAuth="false"  sslProtocol="TLS"
               keystoreFile="keystore.jks" keystorePass="PASSWORD" URIEncoding="utf-8"
 compressableMimeType="text/html,text/xml,text/plain,text/css,text/ javascript,application/x-javascript,application/javascript"/>

  <Connector port="8010" protocol="AJP/1.3" redirectPort="80" URIEncoding="utf-8"
 compressableMimeType="text/html,text/xml,text/plain,text/css,text/ javascript,application/x-javascript,application/javascript"
/>
    <Engine name="Catalina" defaultHost="localhost" jvmRoute="Tomcat">
   // Multiple webapps hosted
    </Engine>

Jk.confにこれを追加しました:

<IfModule jk_module>
        JkWorkersFile   /PATH/to/workers.properties
        JkLogFile       /var/log/Apache2/mod_jk.log
        JkLogLevel      notice
        JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "
        JkOptions       +ForwardURIProxy
        JkMountFile     /path/to/uriworkermap.properties
</IfModule>

worker.properties:

 worker.list = worker_app1
worker.worker_app1.type = lb
worker.worker_app1.balance_workers = app1_instance1
worker.worker_app1.sticky_session = true
worker.worker_app1.sticky_session_force = false
worker.worker_app1.method = busyness

worker.app1_instance1.type = ajp13
worker.app1_instance1.Host = 127.0.0.1
worker.app1_instance1.port = 8010
worker.app1_instance1.Host = localhost
worker.app1_instance1.lbfactor = 1
worker.app1_instance1.socket_timeout = 40
worker.app1_instance1.socket_keepalive = true
worker.app1_instance1.reply_timeout = 30000

uriworkermap.properties:

/|/* = worker_app1;

これを000-defaultsites-enabledに追加しました

// This is the Tomcat domain. 
<VirtualHost *:80>
ServerName www.domain_Tomcat_webapp.de
ServerAlias domain_Tomcat_webapp.de
ProxyRequests on
ProxyPreserveHost On
<Proxy *>
Order deny,allow
Allow from all
</Proxy>

ProxyPass / http://localhost:8080/
ProxyPassReverse / http://localhost:8080/

<Location / >
Order allow,deny
Allow from all
</Location>
</VirtualHost>

以上です。次に、Tomcatを起動し、ApacheWebサーバーを再起動しました。これで動作します。

2
We are Borg

IPとサーバーが1つしかないことを考えると、次のようになります。

名前ベースの仮想ホスティングを使用してポート80にApacheリスニングのインスタンスを1つ配置します(IPは1つしかないため、HTTPSを使用する場合は、最終的なSSLの問題に注意してください。ここを確認してください: https://wiki.Apache.org/httpd/NameBasedSSLVHosts

したがって、サブドメインごとに仮想ホストがあります。たとえば、ドメインがexample.comであるとすると、次のようになります。

www.app1.com
[...]
www.appN.com

cms.example.com
maintenance.example.com

アプリのサブドメインを管理する仮想ホストでは、必要に応じて、mod_jk、mod_proxy_ajp、またはmod_proxy_httpのいずれかを使用してリバースプロキシを構成できます。 Tomcatにはmod_jkを選択します。

これで、3つの問題をカバーできます。

これはあなたの最初の長期計画もカバーします、2番目のために:

メンテナンスWebアプリをグリッド全体に結び付けます。これは、ドメインが稼働していないか、応答していないか、ビジー状態のときに呼び出されます。

これはさまざまな方法で実行できます。たとえば、maintenace.example.comにリダイレクトするApache for 500/503errosのカスタムエラーページを使用します。これはそれ自身の問題である可能性があります

あなたの最後の質問に関して:

1これは良いアプローチですか?そうでない場合は、どこで何を改善できるかを教えてください。

私もこれをカバーしたと思います

2私がやろうとしているタスク、それは何と呼ばれていますか?グリッド構成、負荷分散?

仮想ホスティング(最終的な負荷分散を使用、後述)

3すべてのWebアプリ、異なるURLを介して参照できるが、正しいWebアプリまたはWebサイトを指すWebサイトを結び付ける方法。

これは、Apache仮想ホストとプロキシから処理されます。 URLでコンテキストパスを使用する必要がないように書き換えることもできます。これもそれ自体の問題である可能性があります。

4 Apache TomcatとLinuxの管理についてはよく理解していますが、ApacheWebサーバーについてはあまり理解していません。誰かがこの問題をどのように進めるか、いくつかの計画と私が必要とするものについて私を助けてくれるので、私はそれを実行することができます。

私もこれをカバーしたと思います。

ちなみに、私は少なくとも2つのトムキャットを使用しますが、アプリごとに2つのトムキャットを使用する方がよいでしょう。 Tomcatが死んだ場合に備えて、少なくとも2つはカバーされます。アプリごとに2つあるため、アプリを互いに分離することができます(異なるJVMで実行)。これは、問題が発生した場合に特定のアプリを指すのに非常に便利です。

お役に立てれば。

3
Fredi