【问题标题】:link apache web server on port 80 and tomcat webapp on port 8080在端口 80 上链接 apache web 服务器和在端口 8080 上的 tomcat webapp
【发布时间】:2012-10-22 23:05:58
【问题描述】:

在端口 80 上,我有普通的 apache 网络服务器。

在端口 8080 上,我有带有客户端和服务器端内容的 tomcat。

我的目标是:

www.mydomain.com 在加载 javascript 内容时呈现静态且 SEO 友好的 index.html。

在这个 index.html 的标题中,我加载 www.mydomain.com:8080/myapp/stuff.js

stuff.js 使用 gwt 编译并调用 RootLayoutPanel.get().add(nice_panel) 将删除静态内容并显示动态小部件。它还调用 servlet(服务器端代码)。

问题:出于安全原因,浏览器不允许我加载 www.mydomain.com:8080/myapp/stuff.js,因为它位于不同的端口上。

错误的尝试:我试图创建一个从“普通”apache web 服务器目录到包含 stuff.js 的 tomcat webapp 的符号链接。我现在可以加载 stuff.js,因为它的 url 是:www.mydomain.com/mysymlink_to_tomcat/stuff.js。但是由于浏览器的安全规则(“XMLHttpRequest 无法加载 ... 来源 ...Access-Control-Allow-Origin 不允许”),stuff.js 无法再次在服务器端调用 servlet。

我想避免使用 header('location: http://mydomain.com:8080/another_index_on_tomcat.html') 从 index.html 重定向到 tomcat 的“疯狂”解决方案。此解决方案有效,但有许多缺点(SEO...)

最好的方法是什么?

谢谢。

【问题讨论】:

  • 在将 Tomcat 移动到端口 80 时提供evertyhing 服务?

标签: gwt tomcat


【解决方案1】:

你基本上有两种解决方案:

  • 使其适用于 2 个来源:在 GWT 中使用 xsiframe 链接器以允许 :80 上的页面从 :8080 加载脚本(对于读者:这与加载无关,而是关于脚本的作用)。 将以下内容添加到您的 `gwt.xml:

    <add-linker name='xsiframe' />
    

    很遗憾,这并不能解决您使用 GWT-RPC 的问题(o 无论您使用什么来与服务器通信)。为此,有CORS

  • 使用单一来源:使用 Apache 的 mod_proxy(或 mod_jk)通过您的 Apache 代理您的 Tomcat。没有人会使用:8080,一切都会通过:80。请参阅将 Tomcat 与 Apache HTTPD 和代理一起使用https://developers.google.com/web-toolkit/doc/latest/DevGuideServerCommunication#DevGuideRPCDeployment

当然,还有放弃 HTTPD 并使用 Tomcat 提供所有服务的解决方案(最近的 Java 和 Tomcat 版本已经修复了它们的缓慢问题)。

【讨论】:

  • 谢谢托马斯。我喜欢“使用单一来源”的方法。我现在正在尝试这样做,并尽快让您知道。不幸的是,我遇到了“500 内部服务器错误”,我不知道如何摆脱它。
  • 完成了! “单一来源”终于可以正常工作了。我必须考虑到:stackoverflow.com/questions/1517290/… 让一切顺利。非常感谢。
【解决方案2】:

我不确定这是否会避免安全错误,但您可以尝试使用 iframe。在 apache 上,你有 tomcat 的索引和 iframe,JS 在 iframe 中加载。不知道这是否有助于解决 SEO 问题。

【讨论】:

    【解决方案3】:

    当客户端调用请求 tomcat 应用程序时,最好的解决方案是将端口 80 调用重定向到 apache 上的 8080。

    在 apache 上安装 mod_jk 并将其配置为在您想要的路径上挂载上下文 示例:(编辑 /mods_enabled/jk.conf)

    # Configure access to jk-status and jk-manager
    # If you want to make this available in a virtual host,
    # either move this block into the virtual host
    # or copy it logically there by including "JkMountCopy On"
    # in the virtual host.
    # Add an appropriate authentication method here!
    <Location /jk-status>
        # Inside Location we can omit the URL in JkMount
        JkMount jk-status
        Order deny,allow
        Deny from all
        Allow from 127.0.0.1
    </Location>
    <Location /jk-manager>
        # Inside Location we can omit the URL in JkMount
        JkMount jk-manager
        Order deny,allow
        Deny from all
        Allow from 127.0.0.1
    </Location>
    
    JkMount /*/myAppDir/* ajp13
    

    然后在您的站点设置中添加一个虚拟主机(编辑 /apache2/sites-enabled/)

        <VirtualHost *:80>
        . Here is the rest of the
        . of the config of
        . the host
        # Tomcat jk connector settings
        JkMount /*.jsp ajp13_worker
        JkMount /myAppDir/* ajp13_worker
        JkMount /myAppDir* ajp13_worker
        JKMount /manager* ajp13_worker
        JkMount /manager/* ajp13_worker
        </VirtualHost>
    

    您还应该编辑 server.xml 文件并在标签内写入和注释之前的 Host name="localhost"

    <!-- Define an AJP 1.3 Connector on port 8009 -->
    
    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
    
    <Host name="localhost" appBase="webapps" unpackWARs="true"
       autoDeploy="true" >
    
              <Context path="/" docBase="/var/lib/tomcat7/webapps/myAppDir/"
                           debug="0" reloadable="true" />
              <!-- please notes on logs down below -->
         <Valve className="org.apache.catalina.valves.AccessLogValve"
                 directory="/var/lib/tomcat7/logs" prefix="tomcat_access_" 
                suffix=".log" pattern="common" resolveHosts="false" />
      </Host>
    

    剩下要做的就是编辑workers.properties文件并添加

    worker.myapp2.port=8009
    worker.myapp2.host=localhost
    worker.myapp2.type=ajp13
    worker.loadbalancer.type=lb
    worker.loadbalancer.balance_workers=ajp13_worker
    

    然后你应该设置为工作,当一个包含 myAppDir 的 url 出现时,apache 服务器会将调用重定向到 tomcat,答案将从 apache 返回。

    【讨论】:

    • 感谢您的详细解答。据我所知,我更喜欢像 Tomas Brower 建议的那样使用 mod_proxy,所以我不必创建任何连接器,这对于非专业人士来说不是一件容易的事。
    猜你喜欢
    • 1970-01-01
    • 2017-09-21
    • 2013-04-25
    • 2015-02-14
    • 1970-01-01
    • 2012-10-18
    • 1970-01-01
    • 2014-06-26
    • 1970-01-01
    相关资源
    最近更新 更多