【问题标题】:How can I use SSL through Apache with multiple Tomcat Webapp instances?如何通过 Apache 将 SSL 与多个 Tomcat Webapp 实例一起使用?
【发布时间】:2011-06-07 04:11:32
【问题描述】:

我们目前有我们的 webapp,这是一种标准的东西,http 主页面和信息页面,但重定向到 httpS(即 SSL)以进行登录和用户操作等。

目前,我们已将所有 webapp 实例(生产、测试​​、演示等)部署到一个 Jetty 实例中,我们可以通过 www.ourapp.com/test 和 www.ourapp.com/demo 访问它们,显然还有 www. ourapp.com 用于生产。

这样做的问题是每次我们对一个实例进行更改时,我们都需要重新启动所有实例,这并不理想。此外,我并不特别喜欢使用 Jetty 进行生产,即使我们的应用目前的容量不是很大。

我正在尝试使用 Apache httpd 转发到 tomcat 的多个实例,每个实例托管我们应用程序的不同实例。这将让我单独关闭并重新启动每个 tomcat/app 实例。

我在各种不同的端口上设置了多个 tomcat 安装,因此它们不会相互冲突(例如 8081、8082、8083),将它们的 AJP 连接器端口设置为彼此不同(例如 8010、8011、8012)和 httpd目前监听 8090 端口,以免与当前运行在 80 端口上的生产实例冲突。

在 httpd.conf 我有诸如 ;

之类的设置

JkMount /test* tomcatTest

在workers.properties 中,我有如下设置;

worker.tomcatTest.port=8010
worker.tomcatTest.host=localhost
worker.tomcatTest.type=ajp13
worker.tomcatTest.lbfactor=100

httpd 可以很好地转发到初始登录页面。当我需要访问 SSL 页面进行登录等时,就会出现问题。每个 tomcat 安装的 SSL 连接器都未注释,并且端口也不同,8444、8445、8446 等。

希望您能在这里看到我想要实现的设置。我只需要一些帮助,让非 SSL 页面链接到 SSL 页面,就像它们通常都在一个 Jetty/Tomcat 实例中并且 Apache 没有进行所有转发一样。任何指针我需要在这里做什么?

【问题讨论】:

    标签: tomcat ssl apache


    【解决方案1】:

    假设您的 worker.properties 文件包含此内容。

    > worker.list=balancer,stat   worker.tomcat1.type=ajp13
    > worker.tomcat1.port=8109 worker.tomcat1.host=localhost  
    > worker.tomcat2.type=ajp13 worker.tomcat2.port=8209
    > worker.tomcat2.host=localhost   worker.tomcat3.type=ajp13
    > worker.tomcat3.port=8309 worker.tomcat3.host=localhost
    >     worker.balancer.type=lb worker.balancer.balance_workers=tomcat1,tomcat2,tomcat3  
    > worker.stat.type=status
    

    然后你必须添加 JkMount /* 平衡器

    httpd-ssl.conf

    <Virtualhost> 标记

    <VirtualHost _default_:443>
    #No change in other existing code
    JkMount  /*  balancer   
    
    > </VirtualHost>
    

    【讨论】:

      【解决方案2】:

      您实际上需要的是 ssl 卸载: 1.在jetty中配置,用ssl保护什么或with path; 2. 用 apache 前端码头,让 apache 处理码头所有的 ssl 东西。 3.配置jetty接受apache的ssl处理 4.在apache上设置多个vhosts(单个ip),配置apache为每个vhosts使用不同的SSL证书。 ...

      可在此处找到此主题的分步指南:

      http://milestonenext.blogspot.de/2012/09/ssl-offloading-with-modjk-part-1.html

      【讨论】:

        【解决方案3】:

        如果您想使用 Tomcat 的本地 SSL 连接器,那么您必须将您的应用程序重定向到主机上的 Tomcat 端口。它无法由 Apache 处理。这是因为 Apache 还必须安装每个 Tomcat 服务器的 SSL 证书 - 一次只能安装一个证书。

        最好使用 Apache 来终止您的 SSL 连接。

        使用适当的证书配置 Apache(请参阅下面的 [1]),并启用 SSL。然后在 SSL 的 VirtualHost 定义中,再次添加所有 JkMount 行。

        例如:

        <VirtualHost _default_:443>
           JkMount /test* tomcatTest
        </VirtualHost>
        

        这意味着 SSL 连接将由 Apache 处理,然后通过 AJP 转移到 Tomcat。这大大简化了配置,因为您在 Tomcat 配置中只需要 AJP 连接器。

        [1] 您需要一个包含所有可能要使用的虚拟主机的证书。创建其中一个有点超出问题的范围,但只要说您需要在证书中为您可能使用的每个主机名添加一个 subjectAltName 就足够了。如果您使用新主机名创建新应用程序,则需要重新生成证书。

        此外,我也不是特别喜欢将 Jetty 用于生产,即使我们的应用目前的销量不是很高。

        生产环境中的 Jetty 绝对适用于 99% 的用例。我经常发现 Tomcat 更像是一个反复无常的野兽,并且经常最终将其换成 Jetty。

        【讨论】:

        • 听起来不错,所以我将能够拥有类似以下的内容? 默认:443> JkMount /test* tomcatTest JkMount /demo* tomcatDemo JkMount /devp* tomcatDevp
        猜你喜欢
        • 2014-03-08
        • 2018-02-23
        • 2019-05-22
        • 2019-06-18
        • 1970-01-01
        • 2011-07-21
        • 2019-11-07
        • 1970-01-01
        • 2018-02-06
        相关资源
        最近更新 更多