我在 Ubuntu 中安装了多个 tomcat 实例。我想为每个 tomcat 实例指定不同的 URL。但如果有多个 tomcat 实例,我无法实现所需的结果。
(以下 URL 仅用于解释我正在做的事情)
Tomcat1:demo.mydomain.com/myapp:localhost:8080/myapp
Tomcat2:test.mydomain.com/myotherapp:本地主机:8081/myotherapp
进一步搜索后修改我的配置文件:我正尝试通过 AJP 端口实现它。因此,我在文件中进行了以下编辑:
Tomcat1 = 演示
Tomcat2 = 测试
演示 - server.xml
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
测试-server.xml
<Connector port="8010" protocol="AJP/1.3" redirectPort="8443" />
工人.属性
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_测试.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
找不到任何合适的方法,所以在这里问。请随意建议 - 如何从头开始。提前致谢。
答案1
您的服务器配置包含重叠的虚拟主机。您的所有主机都已命名,Demo.Server
并且都使用相同的 IP/端口定义。这样,只有第一个主机被识别,其余的则不会被识别。
此外,您的问题包括 Tomcat 服务器监听端口8080
和8081
,这建议使用 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 实例上安装的所有 webapps 都可在 上使用https://www.tomcat1.com/<app_name>
,同样,第二个 Tomcat 实例上安装的所有 webapps 都可在 上使用https://www.tomcat2.com/<app_name>
。
使用 AJP 和 mod_jk
如果您想使用 AJP 进行连接,您有两个选择。第一个是 mod_jk,您目前使用的,所以这可能是您想要的。使用这个,您可以将部署的 webapps 映射到它们相应的 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>
这样, 上的所有内容都将被代理到文件中demo.mydomain.com
指定的 Tomcat 实例, 上的所有内容都将被代理到名为 的实例。 您无需指定任何或即可使其正常工作。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 映射。