Apache-2.2

多個 Tomcat - URL 映射

  • May 29, 2019

我在 Ubuntu 中安裝了多個 tomcat 實例。我想為每個 tomcat 實例指定不同的 URL。但是在多個 tomcat 實例的情況下,我無法達到預期的結果。

(下面的 URL 只是為了解釋我想要做什麼)

Tomcat1:demo.mydomain.com/myapp:localhost:8080/myapp

Tomcat2:test.mydomain.com/myotherapp:localhost:8081/myotherapp

進一步搜尋後修改我的配置文件:我正在嘗試通過 AJP 埠實現它。所以我在我的文件中進行了以下編輯:

Tomcat1 = 展示

Tomcat2 = 測試

展示 - server.xml

<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

test-server.xml

<Connector port="8010" protocol="AJP/1.3" redirectPort="8443" />

workers.properties

worker.list=jk-status,demo,test
# Status worker for managing load balancer
worker.jk-status.type=status # setting type of jk-status' worker.

worker.demo.port=8009
worker.demo.host=localhost
worker.demo.type=ajp13

worker.test.port=8010
worker.test.host=localhost
worker.test.type=ajp13

在 /etc/apache2/sites-enabled 中啟用的站點

1_rewritehttp.conf

<VirtualHost *:80>
   ServerName server
   RewriteEngine On
   RewriteRule (.*) http://server.mydomain.com%{REQUEST_URI}
</VirtualHost>

<VirtualHost *:80>
       ServerName server.mydomain.com
       ServerAdmin webmaster@localhost
       DocumentRoot /opt/www/

       JkMount /jolokia-demo/* demo
       JkMount /jolokia-test/* test

       <Directory /opt/www/>
               Options Indexes FollowSymLinks
               AllowOverride None
               Require all granted
       </Directory>
       ErrorLog ${APACHE_LOG_DIR}/error.log
       CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

<VirtualHost *:80>
   ServerName demo
   RewriteEngine On
   RewriteRule (.*) https://demo.mydomain.com%{REQUEST_URI}
</VirtualHost>

<VirtualHost *:80>
   ServerName demo.mydomain.com
   RewriteEngine On
   RewriteRule (.*) https://demo.mydomain.com%{REQUEST_URI}
</VirtualHost>

<VirtualHost *:80>
   ServerName test
   RewriteEngine On
   RewriteRule (.*) https://test.mydomain.com%{REQUEST_URI}
</VirtualHost>

<VirtualHost *:80>
   ServerName test.mydomain.com
   RewriteEngine On
   RewriteRule (.*) https://test.mydomain.com%{REQUEST_URI}
</VirtualHost>

3_demo.conf

<IfModule mod_ssl.c>
   <VirtualHost *:443>
       ServerAdmin webmaster@localhost
   ServerName server.mydomain.com

       DocumentRoot /opt/www/
       <Directory /opt/www/>
           Options Indexes FollowSymLinks
           AllowOverride None
           Require all granted
       </Directory>


       JkMount /myapp/* demo

       Alias /myapp/ "/opt/tomcat/demo/webapps/myapp/"
       <Directory /opt/tomcat/demo/webapps/myapp/>
           Options Indexes FollowSymLinks
           AllowOverride None
           Require all granted
       </Directory>


       JkMount /manager/* demo

       ErrorLog ${APACHE_LOG_DIR}/demo_error.log
       CustomLog ${APACHE_LOG_DIR}/demo_access.log combined

       SSLEngine on

       SSLCertificateFile /usr/local/ssl/crt/public.cer
       SSLCertificateKeyFile /usr/local/ssl/private/private.key
       SSLCertificateChainFile /usr/local/ssl/crt/intermediate.cer

       BrowserMatch "MSIE [2-6]" \
               nokeepalive ssl-unclean-shutdown \
               downgrade-1.0 force-response-1.0
       # MSIE 7 and newer should be able to use keepalive
       BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown
   </VirtualHost>
</IfModule>

4_test.conf

<IfModule mod_ssl.c>
   <VirtualHost *:443>
       ServerAdmin webmaster@localhost
   ServerName server.mydomain.com

       DocumentRoot /opt/www/
       <Directory /opt/www/>
           Options Indexes FollowSymLinks
           AllowOverride None
           Require all granted
       </Directory>


       JkMount /myotherapp/* test

       Alias /myotherapp/ "/opt/tomcat/test/webapps/myotherapp/"
       <Directory /opt/tomcat/test/webapps/myotherapp/>
           Options Indexes FollowSymLinks
           AllowOverride None
           Require all granted
       </Directory>


       JkMount /manager/* test

       ErrorLog ${APACHE_LOG_DIR}/test_error.log
       CustomLog ${APACHE_LOG_DIR}/test_access.log combined

       SSLEngine on

       SSLCertificateFile /usr/local/ssl/crt/public.cer
       SSLCertificateKeyFile /usr/local/ssl/private/private.key
       SSLCertificateChainFile /usr/local/ssl/crt/intermediate.cer

       BrowserMatch "MSIE [2-6]" \
               nokeepalive ssl-unclean-shutdown \
               downgrade-1.0 force-response-1.0
       # MSIE 7 and newer should be able to use keepalive
       BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown
   </VirtualHost>
</IfModule>

現在,問題是我可以通過 URL 訪問展示 tomcat。如果我嘗試訪問測試 tomcat URL,它會重定向到展示 tomcat URL。我嘗試訪問兩個 tomcat 的管理器,它們都指向展示 tomcat 管理器,如果我執行以下命令,那麼它會重定向到測試 tomcat 管理器。我想區分這兩個 tomcat 實例。我在這裡遺漏了一些東西。任何幫助,將不勝感激。

a2dissite 3_demo.conf

無法在任何地方找到任何合適的方法,所以在這裡問。請隨時提出建議-如何從頭開始。提前致謝。

您的伺服器配置包含重疊的虛擬主機。您的所有主機都已命名Demo.Server,並且它們都使用相同的 IP/埠定義。這樣,只有第一個被辨識,其餘的不被辨識。

此外,您的問題包括 Tomcat 伺服器偵聽埠80808081,這表明 HTTP,但您已配置 Jk,用於 AJP。

mod_jk假設您使用 HTTP,您可以使用以下 Apache 配置來實現您的目標(在這種情況下您不需要):

<VirtualHost *:443>
   ServerName www.tomcat1.com

   ProxyPass / http://localhost:8080/
   SSLCertificateFile /certfiicate/for/server1.pem
</VirtualHost>

<VirtualHost *:443>
   ServerName www.tomcat2.com

   ProxyPass / http://localhost:8081/
   SSLCertificateFile /certfiicate/for/server2.pem
</VirtualHost>

這樣,您在第一個 Tomcat 實例上安裝的所有 Web 應用程序都可以在 上使用https://www.tomcat1.com/<app_name>,同樣,您在第二個 Tomcat 實例上的所有 Web 應用程序都可以在 上使用https://www.tomcat2.com/<app_name>

使用 AJP 和 mod_jk

如果您想使用 AJP 進行連接,您有兩種選擇。第一個是mod_jk,就是你目前使用的,所以這大概就是你想要的。使用它,您可以將部署的 webapp 映射到它們相應的 URL,但不能更改 URL,即您不能進行映射,這樣http://yourserver/thefrontend/會導致 webapp 安裝在/thebackend上下文中。

使用 mod_jk,你應該使用這個 Apache 配置(你的workers.properties文件看起來不錯):

<VirtualHost *:443>
   ServerName demo.mydomain.com

   JkMount /* demo
   SSLCertificateFile /certfiicate/for/server1.pem
</VirtualHost>

<VirtualHost *:443>
   ServerName test.mydomain.com

   JkMount /* test
   SSLCertificateFile /certfiicate/for/server1.pem
</VirtualHost>

這樣,on 上的所有內容都將代理到文件中命名的 Tomcat 實例,而 on 上的所有內容都demo.mydomain.com將代理到名為. 您無需指定任何or即可使其正常工作。demo``workers.properties``test.mydomain.com``test``Directory``Alias

使用 AJP 和 proxy_ajp

您可以使用的另一個 AJP 連接器是proxy_ajp. 由於您已經配置了mod_jk,我認為您不太可能想使用它,但為了完整起見,我將其寫下來。

AJP 代理 Apache 模組不需要任何額外的屬性文件,您必須在配置中包含後端 IP(或名稱)。您的配置將如下所示:

<VirtualHost *:443>
   ServerName demo.mydomain.com

   ProxyPass / ajp://localhost:8009/
   SSLCertificateFile /certfiicate/for/server1.pem
</VirtualHost>

<VirtualHost *:443>
   ServerName test.mydomain.com

   ProxyPass / ajp://localhost:8010/
   SSLCertificateFile /certfiicate/for/server1.pem
</VirtualHost>

一個優點proxy_ajp是使用它,您可以將任何上下文映射到任何 URL。例如,要將/manager/上下文映射到/the_great_manager/,您可以使用以下配置:

ProxyPass /the_great_manager/ ajp://localhost:8009/manager/
ProxyPassReverse /the_great_manager/ /manager/
ProxyPassReverseCookiePath /the_great_manager/ /manager/

這在某些情況下會派上用場,但是,如果您使用上述重定向,請準備好迎接驚喜。除非萬不得已,否則不要更改 URL 映射通常是個好主意。

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