我们当前有一个在端口 443 上使用 SSL 运行的 Tomcat 应用程序。现在我们有一个 apache 服务器,它在端口 80 上接受 http 请求并重定向到 Tomcat 实例:
<VirtualHost *:80>
ServerName domain.com
ServerAlias domain.com
<LocationMatch "/">
Redirect permanent / https://domain.com/
</LocationMatch>
</VirtualHost>
Tomcat 正在处理 SSL,因为没有代理,只是简单地重定向到 SSL 端口:
<Connector
port="443" maxThreads="200"
scheme="https" secure="true" SSLEnabled="true"
keystoreFile="/app/ssl/domain_com.jks" keystorePass="ourpassword"
clientAuth="false" sslProtocol="TLS"/>
我们想要开始使用 apache web 服务器作为代理,此外,对特定应用进行 IP 重定向,这些应用只能由预定 IP 范围内的主机使用。我们还想将与预定列表不匹配的 IP 重定向到 apache 服务器上托管的静态 html 页面。
我的第一个问题是:我是否应该继续在 Tomcat 端处理 SSL,或者是否应该在转发到“不受保护的” tomcat 端口时使用带有 SSL 的 apache?
有没有办法根据传入 IP 重定向到不同的应用程序(以及潜在的主机)?
谢谢,del
答案1
至于 SSL 处理,这是 SSL 卸载的典型用例。由于您很可能会使用一个 SSL 证书(您的域名证书),因此您将拥有一个 apache 和 n 个 Tomcat。因此 apache 是处理 SSL 的更好地方。Apache 和 Tomcat 之间的通信应该通过 AJP 而不是 http 或 https。
我写了一份关于 SSL 卸载的分步说明,可能对你有帮助。链接如下:http://milestonenext.blogspot.de/2012/09/ssl-offloading-with-modjk-part-1.html
答案2
我们总是使用 Apache(或 Nginx)进行代理和“SSL 卸载”(有些人这样称呼它)。多年来,我们一直在各种生产系统中使用这种技术,满足各种需求。Apache 为您提供了极大的灵活性和许多您可以利用的功能,因此您可以尽可能保持应用服务器配置简单、精简和易于理解。我还建议使用 mod_jk(即 AJP)来连接 Apache 和 Tomcat。默认情况下,Tomcat 在端口 8009 上监听 AJP 请求。
至于您关于重定向的问题:这可以通过结合使用 mod_rewrite、mod_jk 以及 Apache 配置中的一些Location
/LocationMatch
指令轻松完成。取决于您到底想做什么。需要更多详细信息,或者最好单独提问。
答案3
这是可能的。我更喜欢将 Apache 作为所有后端 Web 服务器的前端,包括多个版本的 Tomcat(允许每个客户更轻松地升级)、IIS 和一些设备。
SSL 卸载的描述如下http://www.invantive.com/about-invantive/news/entryid/897/ssl-offloading-for-apache-tomcat。
关于问题2(选择性重定向):
我们通常使用两种方法:
- 可以使用虚拟主机通过一个 URL 访问应用程序的所有类似实例。例如,app1.invantive.com 或 that-other-app.invantive.com。
- 每个用户组在该虚拟主机内获得不同的 URL,以及某种形式的拆分 DTAP。例如,app1.invantive.com/acme-corporation/production、app1.invantive.com/acme-northpole-corporation/test。
如果您仅将 Apache 用于路由流量,则几乎不需要更换它。因此,它成为一个强大的组件,可让您轻松地将应用程序和站点转移到新位置,而您只需重定向 Apache 路由规则即可。您不再需要更改 DNS 和处理 TTL 问题。
答案4
我对 tomcat 应用程序或架构确实不太熟悉(我在我的组织中只运行了几个),因此可能还有其他方法可以进行大规模实施;但是,SSL 可以由 Tomcat、Apache 处理或卸载到负载平衡器,而您提到的其他内容可以使用 mod_rewrite 轻松处理。
有一些 Apache 模块可以做到这一点(网上有大量的操作方法和指南)。查看 mod_proxy、mod_proxy_ajp 或 mod_jk。您需要进行一些研究才能找到最适合您的模块。
无论如何,希望这将是一个良好的研究起点。
希望这可以帮助!