我使用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
答案 0 :(得分:2)
如果您在ProxyPass中更改路径,那么您还需要考虑许多其他问题。这些是非常棘手/昂贵的,通常更容易部署应用程序如ROOT.war
鉴于您不能/不会这样做,您需要考虑以下事项:
这通常已足够,但可能需要一些时间来追踪您需要更改的所有内容。我真的很鼓励你将WAR重命名为ROOT.war。什么阻止你?
答案 1 :(得分:1)
因此,解决问题的唯一方法是执行rlovtang在第一个回复中建议的内容,并使用虚拟主机将应用程序部署为ROOT.war
看到我的另一个问题: connect to alternate alternate host alias with ajp protocol
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>
,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>
这应该足够好了。