Apache + Tomcat:使用 mod_proxy 代替 AJP

Posted

技术标签:

【中文标题】Apache + Tomcat:使用 mod_proxy 代替 AJP【英文标题】:Apache + Tomcat: Using mod_proxy instead of 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 之前,我正在尽我所能尝试)

【问题讨论】:

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

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

【讨论】:

如何处理静态文件? IE。你将如何告诉 Apache 将来自/static 请求的所有内容都提供给服务器,你将如何为此设置文档根目录? @Luke - ProxyPassMatch 应该可以帮助您:httpd.apache.org/docs/current/mod/mod_proxy.html#proxypassmatch【参考方案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。使用适当的域是可以接受的,但不是很完美 - 它会覆盖请求进入的域,然后使用该信息。

以上是关于Apache + Tomcat:使用 mod_proxy 代替 AJP的主要内容,如果未能解决你的问题,请参考以下文章

apache/Tomcat:apache 使用 mod_jk 无法访问后端的 Tomcat

理解 Apache与Tomcat

Apache与Tomcat有什么关系和区别

tomcat与apache区别

Apache + Tomcat:使用 mod_proxy 代替 AJP

Apache TomCat 安装和使用