Linux

Apache webserver & Tomcat:同時執行多個 tomcat webapps 和 apache webserver app

  • December 8, 2015

我們有一個 Debian X64 伺服器,它目前有一個 tomcat 實例,其中我們有 3 個webapps文件WAR。此外,我們有一個 Apache 網路伺服器,它執行著一個 CMS 系統。最後一個項目是Maintenancewebapp,當我們在伺服器上工作並且服務不可用時會顯示它。

我們面臨的問題是:

  1. Tomcat 或 Apache Web 伺服器中只有一個始終在埠 80 上執行。
  2. 對於 Tomcat 應用程序,必須通過它們不同的上下文路徑來訪問這些應用程序。
  3. 我們無法在多個域名下執行所有內容,而是在單個伺服器下執行。

我長期想做的事情:

  1. 使用 Tomcat(首選)或 Apache Web 伺服器作為負載平衡器,它將根據域名中繼請求。所以,如果有人在呼叫 url www.xyz.com,那麼它應該呼叫XYZ我們擁有的 webapp。相同的 webapp 名稱和域名純屬巧合。
  2. Maintenancewebapp 綁定到整個網格,當任何域不活動、沒有響應或忙時都會呼叫它。

我創建了一張圖片(一張可怕的.. :-( ),它更形像地解釋了這項任務。

在此處輸入圖像描述

正如您現在可以看到的架構,這是/是我的問題。

  1. 這是一個好方法嗎?如果沒有,請告訴我在哪里以及我可以做得更好。
  2. 我正在嘗試做的任務,它叫什麼?網格配置,負載平衡?
  3. 如何將所有 webapps、網站聯繫在一起,這些網站可以通過不同的 URL 引用,但會指向正確的 webapp 或網站。
  4. 我對 Apache tomcat 和 Linux 管理有很好的了解,而不是 Apache 網路伺服器。任何人都可以幫助我解決這個問題,一些計劃和我需要什麼,所以我可以執行它。

請注意,我們在 DNS 中為所有基於 webapps 和 webserver 的網站註冊了域名。

我希望我已經添加了足夠的資訊,如果有任何需要,請告訴我。你能幫忙的話,我會很高興。非常感謝。:-)

我終於能夠通過將其更改為以下配置來解決此問題:

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>

workers.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並重新啟動了Apache網路伺服器,它現在可以工作了。

考慮到您只有一個 IP 和一台伺服器,我會:

使用基於名稱的虛擬主機在埠 80 上放置一個 apache 實例偵聽(因為您只有一個 IP,如果您打算使用 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 個問題。

這也涵蓋了您的第一個長期計劃,第二個:

將維護 webapp 綁定到整個網格,當任何域不活動、沒有響應或忙碌時都會呼叫它。

您可以通過多種方式做到這一點。例如,使用 Apache 上的 500 / 503 錯誤的自定義錯誤頁面重定向到您的 maintenace.example.com。這可能是它自己的問題

至於你的最後一個問題:

1 這是一個好方法嗎?如果沒有,請告訴我在哪里以及我可以做得更好。

我想我也涵蓋了這個

2 我正在嘗試做的任務,它叫什麼?網格配置,負載平衡?

虛擬主機(最終負載平衡,見後文)

3 如何將所有 webapps、網站聯繫在一起,這些網站可以通過不同的 URL 引用,但會指向正確的 webapp 或網站。

這是由 Apache 虛擬主機和代理處理的。您甚至可以重寫,因此您不必在 url 中使用上下文路徑。這也可能是它自己的問題。

4 我對 Apache tomcat 和 Linux 管理有很好的了解,而不是 Apache webserver。任何人都可以幫助我解決這個問題,一些計劃和我需要什麼,所以我可以執行它。

我想我也涵蓋了這個。

旁注,我會使用至少兩個 tomcat,但更好的是,每個應用程序使用兩個 tomcat。至少有兩個,這樣你就可以在 Tomcat 當機的情況下得到保障。每個應用程序兩個,因此您可以讓您的應用程序彼此隔離(在不同的 JVM 中執行)。如果出現 ecc 問題,這非常方便指向特定的應用程序。

希望這可以幫助。

引用自:https://serverfault.com/questions/740534