【问题标题】:Apache2 Reverse Proxy, why does my solution never match the example?Apache2 反向代理,为什么我的解决方案与示例不匹配?
【发布时间】:2012-06-26 03:47:17
【问题描述】:

我需要将反向代理返回到运行 grails 应用程序的 tomcat 服务器。 我总是看到这样的反向代理示例:

ProxyRequests Off
ProxyPass / http://localhost:8080/appname/
ProxyPassReverse / http://localhost:8080/appname/
ProxyPreserveHost On

但是,在我所有的应用程序中,当我这样做时,页面会出现并且我的静态数据会像这样与上下文一起加载: /appname/static/[jsapp.js][mycss.css]

因此失去了样式和功能。所以我的解决方法是这样做:

ProxyRequests Off
ProxyPass /appname/ http://localhost:8080/appname/
ProxyPass / http://localhost:8080/appname/
ProxyPassReverse /appname/ http://localhost:8080/appname/
ProxyPassReverse / http://localhost:8080/appname/
ProxyPreserveHost On

我猜这是一个反向反向代理;无论哪种方式,它看起来都很老套,并且(我认为)有副作用;它创建带有 tomcat 上下文的 URL:http://servername.com/appname/user/username 而不是 http://servername.com/user/username。如果可能的话,我会更喜欢后者,而不会丢失样式。

注意事项:

  • 当我转到基本 URL:http://servername.com 时,它工作正常,之后我点击的任何链接都会在 URL 中添加“/appname/”名称。
  • 我相信我可以通过将 tomcat 上的应用设置为 ROOT 应用来解决此问题,但是我不希望这样做。
  • 这个例子使用的是 HTTP,我通常使用 AJP 协议,但我最后尝试 HTTP 只是为了好玩
  • 这是在 NameVirtualHost 配置中。
  • Apache 2.2.15、Tomcat 7.0.27、CentOS 版本 6.2(最终版)、java 版本“1.7.0_04”、Grails 2.0.4

有什么想法我需要做不同的事情吗?

谢谢。

【问题讨论】:

    标签: grails tomcat7 reverse-proxy apache2.2


    【解决方案1】:

    有几种方法,如何解决这种情况。我在 TomCat 中使用虚拟主机,所以我删除了 URL 中的应用程序名称。将此添加到您的 server.xml 中

    <Host name="myapp.com"  appBase="myappbase" unpackWARs="true" autoDeploy="false">
        <Alias>www.myapp.com</Alias>
    
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="myapp_access_log" suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b" />
    
        <Context path="/thumbnails" docBase="/var/www/myapp/thumbnails" reloadable="true">
    
    </Host>
    

    在您的 $TOMCAT_HOME 中创建一个目录“myappbase”,您可以在其中将应用程序 WAR 作为 ROOT.war 上传。您的申请可通过http://myapp.com:8080/ 获得。

    您的代理配置非常简单;-) 您还可以在 1 个 TomCat 中创建更多虚拟主机。

    在上述配置中也是一个目录别名(缩略图),可以通过http://myapp.com/thumbnails/访问,您可以通过以下方式在GSP中使用它:

    ${ resource( dir: 'thumbnails', file: 'image01.png' ) }
    

    最后一点可以帮助您在 UrlMappings.groovy 中设置“静态”目录。将 URL 转换为控制器时会忽略这些目录,反之亦然:

    static excludes = [
            '/css*', '/js*', '/thumbnails*'
    ]
    

    【讨论】:

    • 非常好,我稍后会试一试。但是,如果我有一台服务器在 8080 上使用 tomcat,在 80 上使用 httpd,我想我将需要编辑主机文件的额外步骤,以便反向代理知道 myapp 在哪里,因为 localhost:8080 不再工作了.我会报告我的结果,再次感谢。
    • 您可以将“主机”中的属性“名称”更改为您需要的任何内容,然后可以在 /etc/hosts 中进行配置,并且代理可以访问。
    • 所以我有 qas.1 作为名称,在 /etc/hosts 我有 127.0.0.1 qas.1 并有这样的代理配置:ProxyPass / qas.1:8080 但它没有启动 tomcat localhost我的应用程序。我首先尝试了别名,结果相同。有什么想法吗?
    • 我没有意识到它只是传递了整个名字,我想多了。我知道了,谢谢你的帮助。
    猜你喜欢
    • 2019-07-22
    • 2020-02-21
    • 1970-01-01
    • 1970-01-01
    • 2017-08-14
    • 1970-01-01
    • 2015-02-13
    • 2018-07-12
    • 1970-01-01
    相关资源
    最近更新 更多