Apache webserver & Tomcat:同時執行多個 tomcat webapps 和 apache webserver app
我們有一個 Debian X64 伺服器,它目前有一個 tomcat 實例,其中我們有 3 個
webapps
文件WAR
。此外,我們有一個 Apache 網路伺服器,它執行著一個 CMS 系統。最後一個項目是Maintenance
webapp,當我們在伺服器上工作並且服務不可用時會顯示它。我們面臨的問題是:
- Tomcat 或 Apache Web 伺服器中只有一個始終在埠 80 上執行。
- 對於 Tomcat 應用程序,必須通過它們不同的上下文路徑來訪問這些應用程序。
- 我們無法在多個域名下執行所有內容,而是在單個伺服器下執行。
我長期想做的事情:
- 使用 Tomcat(首選)或 Apache Web 伺服器作為負載平衡器,它將根據域名中繼請求。所以,如果有人在呼叫 url
www.xyz.com
,那麼它應該呼叫XYZ
我們擁有的 webapp。相同的 webapp 名稱和域名純屬巧合。- 將
Maintenance
webapp 綁定到整個網格,當任何域不活動、沒有響應或忙時都會呼叫它。我創建了一張圖片(一張可怕的.. :-( ),它更形像地解釋了這項任務。
正如您現在可以看到的架構,這是/是我的問題。
- 這是一個好方法嗎?如果沒有,請告訴我在哪里以及我可以做得更好。
- 我正在嘗試做的任務,它叫什麼?網格配置,負載平衡?
- 如何將所有 webapps、網站聯繫在一起,這些網站可以通過不同的 URL 引用,但會指向正確的 webapp 或網站。
- 我對 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-default
到sites-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 問題,這非常方便指向特定的應用程序。
希望這可以幫助。