用于grails应用程序的apache ajp配置

时间:2012-05-01 16:31:23

标签: apache tomcat grails ajp

我使用ajp协议在tomcat服务器上运行多个grails应用程序。在同一台服务器上,我将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 app采取相同的方式。这解释了为什么部署ROOT是不合需要的。

我使用的服务器是RHEL6

这篇文章最好描述了我遇到的同样问题: http://grails.1312388.n4.nabble.com/Grails-context-big-problem-with-apache-mod-proxy-td1392448.html

4 个答案:

答案 0 :(得分:2)

如果您在ProxyPass中更改路径,那么您还需要考虑许多其他问题。这些是非常棘手/昂贵的,通常更容易部署应用程序如ROOT.war

鉴于您不能/不会这样做,您需要考虑以下事项:

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

这通常已足够,但可能需要一些时间来追踪您需要更改的所有内容。我真的很鼓励你将WAR重命名为ROOT.war。什么阻止你?

答案 1 :(得分:1)

因此,解决问题的唯一方法是执行rlovtang在第一个回复中建议的内容,并使用虚拟主机将应用程序部署为ROOT.war

看到我的另一个问题: connect to alternate alternate host alias with ajp protocol

的Apache

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>

Tomcat的

<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>

的/ etc /主机

主持人

,myserver.com

127.0.0.1       localhost       tomhost1     tomhost2
客户

188.555.555.555  app1.myserver.com   app2.myserver.com
如果有针对app1和app2的CNAME或ANAME设置,则您不必弄乱客户端主机文件。如果服务器和客户端是同一台计算机,请将app1和app2主机别名添加到localhost别名。对于tomcat,请确保有tomhost1和2的目录。如果要将grails应用程序部署为ROOT.war,请确保您的服务器URL看起来像

grails.serverURL = "http://app1.myserver.com/"

创建war文件,并将其放在tomhost1文件夹中。

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

我能够解决破损图像的问题。 从这里取一个例子: http://www.wthr.us/2010/01/25/improve-grails-performance-with-static-resources/

NameVirtualHost *:80

<VirtualHost *:80>
            ServerName subdom1.example.com
            ProxyPass / ajp://localhost:8082/app1/
            ProxyPassReverse / ajp://localhost:8082/app1/
            RewriteEngine on
            RewriteRule ^/app1/images/(.*) /home/tomcat/webapps/app1/images/$1
            RewriteRule ^/app1/css/(.*) /home/tomcat/webapps/app1/css/$1
            RewriteRule ^/app1/js/(.*) /home/tomcat/webapps/app1/js/$1
</VirtualHost>

这应该足够好了。