0

我有多个使用 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 方面,我已将 ${appName} 从服务器 url 中删除,看起来像: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

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

4

4 回答 4

2

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

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

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

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

于 2012-05-01T18:30:04.550 回答
1

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

请参阅我的另一个问题: 使用 ajp 协议连接到备用备用主机别名

阿帕奇

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>

/etc/hosts

在主机上,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文件夹中。

于 2012-05-10T18:10:20.783 回答
0

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

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

于 2012-05-01T18:45:58.763 回答
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>

这应该足够好了。

于 2012-05-02T15:01:51.780 回答