【问题标题】:Apache + Tomcat: Using mod_proxy instead of AJPApache + Tomcat:使用 mod_proxy 代替 AJP
【发布时间】:2010-10-31 16:17:29
【问题描述】:

我有什么方法可以使用 HTTP 代理将 Apache 连接到 Tomcat,以便 Tomcat 获得正确的传入主机名而不是 localhost?我在 apache 中使用这个指令:

ProxyPass /path http://localhost:8080/path

但它是作为 localhost 来的,当我们在同一台服务器上有一堆站点时,它是无用的。我可以在服务器配置中手动设置主机:

<Connector port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
           proxyName="pretend.host" proxyPort="80" />

但这又一次不能服务于一个以上的网站。而且我不喜欢为每个站点使用不同的内部端口的想法,这听起来很丑陋。

代理时有没有办法传输端口?

(如果你问我为什么不只使用 AJP,答案是 this error。在放弃 Tomcat and Apache entirely 之前,我正在尽我所能尝试)

【问题讨论】:

    标签: apache tomcat mod-proxy ajp


    【解决方案1】:

    您仍然可以使用 AJP,而且您应该使用它,因为它比 HTTP 更快。只需确保在 http.conf 中启用它:

    LoadModule proxy_module modules/mod_proxy.so
    LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
    

    在这种情况下,这个配置对我有用:

    <VirtualHost *:80>
      ServerName public.server.name
    
      ProxyRequests Off
      ProxyPreserveHost On
    
      <Proxy *>
        Order deny,allow
        Allow from all
      </Proxy>
    
      ProxyPass / ajp://localhost:8080/
    # ProxyPassReverse might not be needed,
    # it's only for redirecting from inside.
    #  ProxyPassReverse / ajp://localhost:8080/
    </VirtualHost>
    

    【讨论】:

      【解决方案2】:

      您要查找的设置是:

      <VirtualHost *:80>
        ServerName public.server.name
      
        ProxyRequests Off
        ProxyPreserveHost On
      
        <Proxy *>
          Order deny,allow
          Allow from all
        </Proxy>
      
        ProxyPass / http://localhost:8080/
        ProxyPassReverse / http://localhost:8080/
      </VirtualHost>
      

      请注意,我们使用 localhost 作为代理目标。我们可以这样做,因为我们启用了ProxyPreserveHost。文档指出

      它主要用于特殊配置,例如基于代理的海量名称的虚拟主机,其中原始 Host 标头需要由后端服务器评估。

      听起来和你正在做的一模一样。

      【讨论】:

      【解决方案3】:

      如果您想在同一台服务器上拥有多个站点,我认为最好的选择是在您的 Apache 配置中使用虚拟主机。这是一个例子:

      <VirtualHost *:80>
      ServerName server.domain.com
      
      ProxyRequests Off
      <Proxy *>
          Order deny,allow
          Allow from all
      </Proxy>
      
      ProxyPass / http://server.domain.com:8080/
      ProxyPassReverse / http://server.domain.com:8080/
      <Location />
          Order allow,deny
          Allow from all
      </Location>
      

      只要您在外部 DNS 中注册了 server.domain.com,传入的主机名就会显示在客户端 URL 中。我正在使用这种方法运行一个托管 6 个独立站点的服务器,其中包括 3 个由 Tomcat 返回的站点。

      【讨论】:

      • 我们当然在 Apache 中使用虚拟主机,但我在 ProxyPass 指令中使用了 localhost。使用适当的域是可以接受的,但不是很完美 - 它会覆盖请求进入的域,然后使用该信息。
      猜你喜欢
      • 2013-05-17
      • 2013-05-27
      • 2014-01-11
      • 2018-03-31
      • 2022-08-22
      • 2012-11-01
      • 1970-01-01
      • 2016-02-01
      • 1970-01-01
      相关资源
      最近更新 更多