使用mod_proxy_ajp在Apache后面正确设置Tomcat

时间:2011-03-30 13:09:39

标签: apache tomcat mod-proxy

我一直在修补Apache + Tomcat,这样我就可以通过apache(干净和清晰的网址摇滚)为多个tomcat应用程序(在不同的机器中)提供服务。我已成功配置mod_proxy_ajp& mod_rewrite我可以在不同的机器上为两个tomcat应用程序提供服务,几乎没有麻烦。

我发现的唯一问题是其中一个应用程序(我在Struts2中开发)有很多链接和表单,这些链接和表单是使用<s:a /><s:url />和{生成的{1}}标签。这些标签生成的网址通常如下:

<s:form />

感谢ModRewrite的神奇之处,这通常不是 big 问题,而且这些网址的超链接很快就被重写了。重定向到/WebApp/path/to/some.action(虽然我收到了大量的/app/path/to/some.action回复)。

执行POST请求时会出现真正的问题。正如大家可能知道的那样,我无法使用mod_rewrite重定向302个请求...所以最后...我的所有POST请求都不起作用,因为mod_rewrite重定向到正确的url但是作为POST请求。

我已经阅读了一些关于GET的内容以及它如何帮助我重写Tomcat Web应用程序返回的URL ...但是感觉很麻烦。

这是我目前的apache配置:

mod_proxy_html

我的## HACKING BEGINS RIGHT HERE # cookies ProxyPassReverseCookiePath /WebApp /app # this is for CSS, IMGs, JS and redirecting urls with /WebApp* RewriteRule ^/WebApp(.*)$ /app$1 [R,L] <Location /app> ProxyPass ajp://localhost:8009/WebApp ProxyPassReverse ajp://localhost:8009/WebApp Order allow,deny Allow from all </Location> # the other app ProxyPassReverseCookiePath /WebApp2 /other <Location /other> ProxyPass ajp://200.9.4.6:8009/WebApp2 ProxyPassReverse ajp://200.9.4.6:8009/WebApp2 Order allow,deny Allow from all </Location> 请求问题必须有解决方案......任何想法?我能以某种方式配置一些允许Struts2输出正确URL的东西吗?

感谢您的帮助。

3 个答案:

答案 0 :(得分:0)

可能有几种方法可以解决这个问题。

如果您能够使用与URL中使用的名称相同的名称将应用程序部署到Tomcat,那将是最简单的。因此,您的应用app将是/webapps/app[.war]而不是/webapps/WebApp,这样可以完全避免重写。

否则,以下内容应该有效,并且应该在当前的重写规则之前进行。 [PT] 应该允许Apache仍然代理请求(这在使用mod_jk时有效,不确定我是否使用mod_proxy_ajp进行了测试:< / p>

RewriteCond %{REQUEST_METHOD} POST
RewriteRule ^/WebApp(.*)$ /app$1 [PT,L]

一旦您的bean处理了POST请求,您就可以将请求发送到将被重定向的URL。最后,POST URL对用户无关紧要,因此它不必是漂亮的URL。

以下编辑:

我在Apache mod_proxy上看到,ProxyPassReverse应该与[PT]标志一起使用。我能够复制你所拥有的问题,并且下面的配置为我提供了一个基本的JSP页面,其中包含一个发布到另一个JSP页面的表单。

<VirtualHost *:80>
    ServerName localhost
    RewriteEngine On

    RewriteCond %{REQUEST_METHOD} !POST
    RewriteRule /WebApp/(.*) /app/$1 [R,L] 

    RewriteCond %{REQUEST_METHOD} POST
    RewriteRule /WebApp/(.*) /app/$1 [PT,L]

    <Location /app>
        ProxyPass ajp://localhost:8109/WebApp
        ProxyPassReverse ajp://localhost:8109/WebApp
    </Location>
</VirtualHost>

答案 1 :(得分:0)

这是webapp设置的问题;可能有一种方法可以在httpd配置中解决它,但修复原始的不一致与黑客攻击更加清晰。

另外值得一提的是,Struts正试图通过为您提供上下文感知的非相对URL来帮助您;如果你只是让路径匹配,你可以依靠它(而不是与它战斗......)。

因此,只需将Struts webapp部署到/ app和/ other,而不是/ WebApp和/ WebApp2。 (可能有一些原因这是不可能的 - 比如如果你实际上没有控制其他服务器 - 但听起来不适用)。

答案 2 :(得分:-1)

我会避免重写网址。它只是打开这样的蠕虫,让你看看mod_proxy_html等,这当然只是更多的蠕虫。相反,只需在Tomcat中部署您的应用程序,即可在外部看到您可以使用的真实URL。