0

我有一个 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,我认为这(如前所述)只是正确的重写规则的问题。

任何帮助表示赞赏,我很感谢任何建议或提示:)

4

3 回答 3

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>
于 2012-12-06T15:01:41.830 回答
1

我不相信您可以使用 mod_rewrite/RewriteRule 代理到 Tomcat。表单的 URLajp://与 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/

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

于 2012-06-07T14:51:04.180 回答
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>

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

于 2018-09-04T19:13:28.740 回答