我有一个具有以下结构的应用程序:
/application (html files)
/application/css (css files)
/application/img (images)
/application/classes -> I want this to redirect to a application server (JBoss)
我该如何配置 Apache?
为什么我这样做不起作用:
ProxyPreserveHost On
ProxyPass /application !
ProxyPass /application/css !
ProxyPass /application/img !
ProxyPass /application/classes http://jboss_server:8080/
ProxyPassReverse /application/classes http://jboss_server:8080
答案1
确保服务器具有相同的结构!
ProxyPass /application/classes http://jboss_server:8080/application/classes
ProxyPassReverse /application/classes http://jboss_server:8080/application/classes
您不必使用其他 proxypass 值,因为“类“ 在下面 ”应用“!因此,仅当您使用 时才会调用代理/application/classes
,而当您使用 时则不会调用/application/img
。
答案2
我认为你的语法有点错误。它应该是:
ProxyPass /mirror/foo/ http://foo.com/
也许是这样的:
ProxyPass / http://sso.domain.com/
ProxyPassReverse / http://sso.domain.com/
答案3
我为此使用了 mod_rewrite - 这提供了更多的功能。
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !^/server-info
RewriteCond %{REQUEST_URI} !^/server-status
RewriteRule ^/application/classes(.*) http://jboss_server:8080/$1 [P,L,NS]
第一行将使 HTTPd 为 DOCUMENT_ROOT 中找到的任何请求文件提供服务,而无需将请求转发到应用服务器。我有一组单独的静态文件,部署在 Web 服务器上。
另外两行将阻止 HTTPd server-* 页面被代理,因此它们将由 HTTPd 提供服务。您可以添加更多此类例外,以便 HTTPd 可以处理它们。
指令 ProxyPreserveHost 和 ProxyPassReverse 在这种情况下可能也很有用。
答案4
可能使用 AJP 协议而不是端口 8080 上的 TCP 会更好,使用 mod_proxy_ajp 和以下规则:
<Location />
ProxyPass ajp://jboss_server:8009/
ProxyPassReverse ajp://jboss_server:8009/
</Location>
当然,这需要您在 JBoss 中的 Tomcat 服务器上启用 AJP 协议,我认为默认情况下该协议是关闭的?
如果您所采用的方法有效,则无需进行更改。