Apache + Tomcat:使用mod_proxy代替AJP

21

有没有办法使用HTTP代理将Apache连接到Tomcat,以便Tomcat获取正确的传入主机名而不是本地主机名?我在Apache中使用了这个指令:

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

但是它以本地主机的形式出现,当我们在同一台服务器上有一堆网站时就没用了。我可以在服务器配置中手动设置主机:

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

但这种方法只适用于一个站点。而且我不喜欢为每个站点使用不同的内部端口,听起来很丑陋。

在代理时是否有办法传输端口?

(如果你问为什么我不直接使用AJP,答案是这个错误。在彻底放弃Tomcat和Apache之前,我正在尝试一切可能的方法)

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。文档说明了:

它在特殊配置中非常有用,例如代理的基于名称的虚拟托管,其中原始主机头需要被后端服务器评估。

听起来正是你正在做的事情。

你如何处理静态文件?也就是说,你如何告诉Apache服务器从/static请求的所有内容,你如何设置文档根目录? - Luke
@Luke - ProxyPassMatch应该能帮到你:http://httpd.apache.org/docs/current/mod/mod_proxy.html#proxypassmatch - Robert Munteanu

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支持的站点,使用这种方法。

我们当然在Apache中使用虚拟主机,但我在ProxyPass指令中使用的是localhost。使用适当的域名代替是可以接受的,但并不完美 - 它会覆盖请求所在的域名,这个信息在后续处理中会被使用到。 - Marcus Downing

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>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接