21

有什么方法可以使用 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,答案就是这个错误。在完全放弃Tomcat 和 Apache之前,我正在尽我所能)

4

3 回答 3

40

您正在寻找的设置是:

<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 标头需要由后端服务器评估。

这听起来和你正在做的完全一样。

于 2009-06-07T22:05:02.360 回答
5

如果您想在同一台服务器上安装多个站点,我认为最好的选择是在 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 返回的站点。

于 2009-06-05T16:01:44.957 回答
0

你仍然可以使用 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>
于 2016-08-26T18:27:38.363 回答