通过子域代理Apache到Tomcat,使用mod_jk,隐藏url中的路径

时间:2012-06-07 11:34:13

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

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

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

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

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

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

这是我的设置:
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,我认为(如前所述)只是正确的重写规则。

感谢任何帮助,我很感谢任何建议或暗示:)

3 个答案:

答案 0 :(得分:6)

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

<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>

答案 1 :(得分:1)

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

我认为你想要的是:

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/

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

答案 2 :(得分:0)

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

server.xml文件中,我在<Service>节点下添加了其他<Server>个孩子,如下所示:

<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