【问题标题】:Proxy Apache to Tomcat via a subdomain, using mod_jk, hiding the path in the url通过子域将 Apache 代理到 Tomcat,使用 mod_jk,隐藏 url 中的路径
【发布时间】:2012-06-11 11:02:59
【问题描述】:

我有一个 Apache 和一个 Tomcat 在我的 Debian 服务器上运行,Apache 使用 mod_jk 将请求代理到 Tomcat 并返回。我在 Tomcat 中安装了 Jenkins。设置工作正常,代理也工作。

现在我的重写规则有问题(我认为)。

拥有的是: ci.<mydomain>.com/jenkins

想要的是: ci.<mydomain>.com

我对 Apache 中的重写规则没有足够的经验,文档/谷歌也没有帮助我(可能我没有使用正确的关键词)。 所以任何帮助表示赞赏。

这是我的设置:
Apache 版本:Apache/2.2.16 (Debian)
Tomcat版本:Apache Tomcat/7.0.27

我的worker.properties 文件如下所示:

# Define 1 real worker using ajp13
worker.list=worker1
# Set properties for worker1 (ajp13)
worker.worker1.type=ajp13
worker.worker1.host=localhost
worker.worker1.port=8009

我的子域/虚拟主机的定义:

<VirtualHost *>
  ServerName ci.<mydomain>.com
  ServerAlias www.ci.<mydomain>.de

  ErrorLog /var/log/apache2/ci_error.log
  LogLevel warn 
  CustomLog /var/log/apache2/ci_access.log combined

  JKMount /jenkins/* worker1
  JKMount /jenkins worker1

  RewriteEngine on
  RewriteRule ^/$ /jenkins/ [R=permanent]
  RewriteRule ^/jenkins/(.*)$ ajp://localhost:8009/jenkins/$1 [P]
</VirtualHost>

Jenkins 只是我希望 Tomcat 提供的一个应用程序。大多数其他应用程序也将拥有自己的虚拟主机。据我了解 mod_jk 的东西,这个工人应该足够我所有的其他应用程序,但也许我错了。

由于我已经可以通过子域访问 Jenkins,我认为(如前所述)只是正确的重写规则的问题。

感谢任何帮助,感谢任何建议或提示:)

【问题讨论】:

    标签: apache tomcat url-rewriting subdomain mod-jk


    【解决方案1】:

    不确定这是否仍然是一个问题,但应该很容易解决。我做了一些非常相似的事情,这是你应该需要的:

    <VirtualHost *>
      ServerName ci.<mydomain>.com
      ServerAlias www.ci.<mydomain>.de
    
      ErrorLog /var/log/apache2/ci_error.log
      LogLevel warn 
      CustomLog /var/log/apache2/ci_access.log combined
    
      JKMount /jenkins/* worker1
      JKMount /jenkins worker1
    
      RewriteEngine On
      RewriteRule  ^/(.*)$   /jenkins/$1 [PT]
    </VirtualHost>
    

    【讨论】:

    • 嗨,迈克,感谢您的回答。不,现在不再是问题,但将来可能会再次出现。那我试试看,还是谢谢你的反馈:)
    【解决方案2】:

    我不相信您可以使用 mod_rewrite/RewriteRule 代理到 Tomcat。 ajp:// 形式的 URL 与 mod_proxy_ajp 一起使用,通常使用 ProxyPass 指令。

    我想你想要的是这样的:

    RewriteEngine on
    RewriteRule ^/$ /jenkins/ [R=permanent]
    
    JKMount /jenkins/* worker1
    JKMount /jenkins   worker1
    

    由于您只匹配 / 而不是更有趣的东西,您可能可以完全摆脱 mod_rewrite 而使用 mod_alias 的 Redirect 指令:

    Redirect 301 / http://yourhost/jenkins/
    

    或者:

    RedirectPermanent / http://yourhost/jenkins/
    

    请注意,在所有这些情况下,客户端最终都会在其 URL 中看到 /jenkins/。如果您想完全消除/jenkins,我相信您将不得不使用 mod_proxy 并经历一系列令人头疼的事情来重新编写您网页中的所有 URL,因为它们将被发送回客户端。

    【讨论】:

    • 嗨,克里斯托弗,非常感谢,我担心有人会提到一堆让我想要的东西感到头疼的问题。不过我会在接下来的几天里尝试一下你的建议并让你了解最新情况:)
    • 如果你想在 /(而不是 /jenkins)上运行 Jenkins,那么为什么不将 /* 映射到 worker1 并让 Jenkins 成为你的 ROOT webapp雄猫?
    • 嗨克里斯托弗,因为我想在 tomcat 中运行比 Jenkins 更多的东西。正如您猜想的那样,我想设置一个开发环境,与依赖于上下文的 url 相比,我更喜欢子域。所以会有一个 ci.domain, wiki.domain, ... 这让我想到了这个有趣的问题。拥有多个 tomcat 实例不是解决方案,因为不幸的是我的服务器资源有限:(
    • 你也可以在Tomcat中设置多个,每个都有不同的ROOT webapp。这也应该可以实现您的目标。
    • 嗨克里斯托弗,再次感谢您的回答和您的想法。您的最后一个建议也可能是一个解决方案,但遗憾的是它仍然会在我的服务器上花费太多资源。在玩了更多之后,我决定解决这个问题。我将使用一个子域进行开发,然后通过上下文解决我需要的所有单个应用程序。谢谢你的时间:)
    【解决方案3】:

    没有mod_jk,我能够解决这个问题。诀窍是配置 Tomcat 以侦听每个 Web 应用程序的不同端口并相应地调整代理。

    server.xml 文件中,我在&lt;Server&gt; 节点下添加了额外的&lt;Service&gt; 子节点,如下所示:

    <Service name="Catalina">
      <Connector port="8081" protocol="HTTP/1.1"
               connectionTimeout="20000" proxyPort="80" />
      <Engine name="Catalina" defaultHost="localhost">
        <Realm className="org.apache.catalina.realm.LockOutRealm">
          <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
               resourceName="UserDatabase"/>
        </Realm>
        <Host name="localhost" appBase="webapp-ci">
          <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="ci_access_log" suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b" />
        </Host>
      </Engine>
    </Service>
    

    这里的重要部分是这一行......

          <Connector port="8081" protocol="HTTP/1.1"
               connectionTimeout="20000" proxyPort="80" />
    

    ...因为这是新端口分配给该服务的地方

    然后我将 apache 配置文件更改为代理到该新端口:

    <VirtualHost *>
      ServerName ci.<mydomain>.com
      ServerAlias www.ci.<mydomain>.de
    
      ErrorLog /var/log/apache2/ci_error.log
      LogLevel warn 
      CustomLog /var/log/apache2/ci_access.log combined
    
        ProxyPreserveHost On
        ProxyPass / http://localhost:8081/ nocanon
        ProxyPassReverse / http://localhost:8081/
        ProxyRequests Off
        AllowEncodedSlashes NoDecode
        <Proxy http://localhost:8081/*>
                Order deny,allow
                Allow from all
        </Proxy>
    </VirtualHost>
    

    最后,我在我的 Tomcat 主目录中创建了一个webapp-ci 文件夹并将jenkins.war 文件移动到webapp-ci/ROOT.war

    【讨论】:

      猜你喜欢
      • 2010-11-15
      • 1970-01-01
      • 1970-01-01
      • 2011-02-06
      • 2015-03-28
      • 1970-01-01
      • 1970-01-01
      • 2021-04-12
      • 2016-06-16
      相关资源
      最近更新 更多