grails应用程序的apache ajp配置

grails应用程序的apache ajp配置,apache,tomcat,grails,ajp,Apache,Tomcat,Grails,Ajp,我有多个grails应用程序使用ajp协议在tomcat服务器上运行。在同一台服务器上,我让apache作为这些tomcat应用程序的前端运行。apache配置如下: ProxyPass /example1/ ajp://localhost:8082/example1/ ProxyPassReverse /example1/ ajp://localhost:8082/example1/ ProxyPass /example2/ ajp://localhost:8082/example1/ Pro

我有多个grails应用程序使用ajp协议在tomcat服务器上运行。在同一台服务器上,我让apache作为这些tomcat应用程序的前端运行。apache配置如下:

ProxyPass /example1/ ajp://localhost:8082/example1/
ProxyPassReverse /example1/ ajp://localhost:8082/example1/
ProxyPass /example2/ ajp://localhost:8082/example1/
ProxyPassReverse /example2/ ajp://localhost:8082/example2/
我希望example1作为根上下文运行

ProxyPass / ajp://localhost:8082/example1/
这是行不通的。所有静态内容都已损坏。通过图像呈现的网页文本将指向:/example1/images/myimage.jpg 如果转到:/images/myimage.jpg,图像将得到解析

我尝试了很多方法来避免将example1部署为ROOT.war。但这似乎是解决这个问题的唯一途径。这不足以满足我的需要

在grails方面,我将从服务器url中删除${appName}绑定为: grails.serverURL=”http://apacheajp.example.com/"

我已经将grails.app.context=/添加到application.properties,这也不起作用

这里的最终目标是将此apache服务器用于多个子域。我希望example1.example.com(apacheajp.example.com的别名)解析为example1应用程序。类似地,我希望example2.example.com与example2应用程序的操作方式相同。这就解释了为什么部署为ROOT是不可取的

我使用的服务器是RHEL6

这篇文章最好地描述了我面临的同样问题:

如果您更改ProxyPass中的路径,那么您还需要考虑其他一些问题。这些都非常复杂/昂贵,因此通常更容易将应用程序部署为ROOT.war

如果你不能/不这样做,你需要考虑以下事项:

  • 添加ProxyPassReverse指令以修复某些HTTP响应头
  • 添加ProxyPassReverseCookiePath指令以修复任何cookie
  • 使用mod_头修改包含错误路径引用的任何其他头
  • 使用mod_substitute更正任何响应主体中的上下文路径

这通常就足够了,但要找出所有需要改变的事情可能需要一些时间。我真的鼓励你把战争改名为ROOT.WAR。什么阻止了您?

如果您在ProxyPass中更改路径,那么您还需要考虑其他一些问题。这些都非常复杂/昂贵,因此通常更容易将应用程序部署为ROOT.war

如果你不能/不这样做,你需要考虑以下事项:

  • 添加ProxyPassReverse指令以修复某些HTTP响应头
  • 添加ProxyPassReverseCookiePath指令以修复任何cookie
  • 使用mod_头修改包含错误路径引用的任何其他头
  • 使用mod_substitute更正任何响应主体中的上下文路径

这通常就足够了,但要找出所有需要改变的事情可能需要一些时间。我真的鼓励你把战争改名为ROOT.WAR。什么在阻止你呢?

正如Mark Thomas所建议的,在Tomcat上部署应用程序时,使用与Apache上相同的上下文根是最容易的。因此,对于上下文根“/”而言,这意味着在Tomcat上部署为root.war。要使多个应用程序具有上下文根“/”但子域不同,最简单的解决方案可能是运行多个Tomcat实例,每个应用程序一个,并将它们全部部署为root.war。我们就是这样做的。这也意味着在不关闭所有应用程序的情况下更容易进行升级


每个Tomcat实例都需要在conf/server.xml中有自己的关闭端口、http端口和ajp端口。

正如Mark Thomas所建议的,在Tomcat上部署应用程序最简单的方法是使用与Apache上相同的上下文根。因此,对于上下文根“/”而言,这意味着在Tomcat上部署为root.war。要使多个应用程序具有上下文根“/”但子域不同,最简单的解决方案可能是运行多个Tomcat实例,每个应用程序一个,并将它们全部部署为root.war。我们就是这样做的。这也意味着在不关闭所有应用程序的情况下更容易进行升级


每个Tomcat实例在conf/server.xml中都需要自己的关闭端口、http端口和ajp端口。

我能够解决图像损坏的问题。 下面举一个例子:

NameVirtualHost*:80
ServerName subdom1.example.com
ProxyPass/ajp://localhost:8082/app1/
ProxyPassReverse/ajp://localhost:8082/app1/
重新启动发动机
重写规则^/app1/images/(.*)/home/tomcat/webapps/app1/images/$1
重写规则^/app1/css/(.*)/home/tomcat/webapps/app1/css/$1
重写规则^/app1/js/(.*)/home/tomcat/webapps/app1/js/$1

这应该足够好了。

我能够解决我的图像损坏问题。 下面举一个例子:

NameVirtualHost*:80
ServerName subdom1.example.com
ProxyPass/ajp://localhost:8082/app1/
ProxyPassReverse/ajp://localhost:8082/app1/
重新启动发动机
重写规则^/app1/images/(.*)/home/tomcat/webapps/app1/images/$1
重写规则^/app1/css/(.*)/home/tomcat/webapps/app1/css/$1
重写规则^/app1/js/(.*)/home/tomcat/webapps/app1/js/$1

这应该足够好了。

因此解决问题的唯一方法是按照rlovtang在第一次答复中的建议,使用虚拟主机将应用程序部署为ROOT.war

见我的另一个问题:

阿帕奇 在客户端上

188.555.555.555  app1.myserver.com   app2.myserver.com
如果app1和app2有CNAME或ANAME设置,您就不必处理客户端主机文件。如果服务器和客户端是同一台计算机,请将app1和app2主机别名添加到本地主机别名。对于tomcat,确保有tomhost1和2的目录。如果您将grails应用程序部署为ROOT.war,请确保您的服务器url
NameVirtualHost *:80


<VirtualHost *:80>
    ServerName app1.myserver.com
    ProxyPass / ajp://tomhost1:8009/
    ProxyPassReverse / ajp://tomhost1:8009/
</VirtualHost>

<VirtualHost *:80>
    ServerName app2.myserver.com
    ProxyPass / ajp://tomhost2:8009/
    ProxyPassReverse / ajp://tomhost2:8009/
</VirtualHost>
<Host name="tomhost1" appBase="tomhost1" unpackWARs="true"
autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false" >
    <Alias>app1.myserver.com</Alias>
</Host>

<Host name="tomhost2" appBase="tomhost2" unpackWARs="true"
autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false" >
    <Alias>app2.myserver.com</Alias>
</host>
127.0.0.1       localhost       tomhost1     tomhost2
188.555.555.555  app1.myserver.com   app2.myserver.com
grails.serverURL = "http://app1.myserver.com/"