我在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,我认为(如前所述)只是正确的重写规则。
感谢任何帮助,我很感谢任何建议或暗示:)
答案 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 "%r" %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