基于主机名的 Apache HTTP 代理

Posted

技术标签:

【中文标题】基于主机名的 Apache HTTP 代理【英文标题】:Apache HTTP Proxy Based on Hostname 【发布时间】:2013-01-24 09:02:53 【问题描述】:

以前,我正确设置了 Apache HTTP 以将端口 80 上的传入 HTTP 请求转发到端口 8080 上运行的 Tomcat 实例。但是,现在我处于需要能够代理端口上的传入请求的情况80 到 Tomcat @ 8080 或不同的进程 @ 9000,具体取决于主机名。下面是我尝试设置我的 Apache 配置来处理这种情况的 sn-p:

<VirtualHost *:80>
  ServerName hostname1
  ProxyPreserveHost On
  ProxyPass / http://hostname1:8080/
  ProxyPassReverse / http://hostname1:8080/
</VirtualHost>
<VirtualHost *:80>
  ServerName hostname2
  ProxyPreserveHost On
  ProxyPass / http://hostname2:9000/
  ProxyPassReverse / http://hostname2:9000/
</VirtualHost>

现在,当从 hostname1hostname2 请求时,我立即得到 500,显然是因为 mod_proxy 没有找到任何匹配的规则来代理请求:

[Fri Feb 08 06:41:01 2013] [warn] proxy: No protocol handler was valid for the URL /. If you are using a DSO version of mod_proxy, make sure the proxy submodules are included in the configuration using LoadModule.

请注意,Tomcat 没有接收传入的请求,因此没有日志输出

为了理智,我检查了我确实可以在它们各自的端口分别访问这两个资源,即我可以使用 hostname1:8080 和 访问 hostname1主机名2 使用主机名2:9000。

这里有什么东西可以帮助我正确配置吗?

此外,有没有更好的方法来以更理智的方式管理这个问题?

感谢您的帮助!

【问题讨论】:

您的“主机名”是否完全合格?另外,您在日志文件中看到了什么?你的 tomcat 日志中是否有任何内容? 完全限定为“name.com”(没有“www”),是的。 在上面添加了 Apache 错误日志 您是否尝试一次删除它们以确保它们彼此独立工作? 删除后一个 VirtualHost 没有效果。它之前工作的唯一方法是不使用 VirtualHost,只使用 mod_proxy 作为ProxyPass / http://hostname1:8080/ ...... ProxyPassReverse / http://hostname1:8080/ 【参考方案1】:

如果要配置基于名称的虚拟主机,请添加 NameVirtualHost 指令。

ServerNameDocumentRoot 添加到每个VirtualHost

例子:

NameVirtualHost *:80

<VirtualHost *:80>
 ServerName hostname1
 DocumentRoot /www/hostname1
 ProxyPreserveHost On
 ProxyPass / http://hostname1:8080/
 ProxyPassReverse / http://hostname1:8080/
</VirtualHost>

<VirtualHost *:80>
  ServerName hostname2
  DocumentRoot /www/hostname2
  ProxyPreserveHost On
  ProxyPass / http://hostname2:9000/
  ProxyPassReverse / http://hostname2:9000/
</VirtualHost>

【讨论】:

NameVirtualHost 已经设置为这样的值,请原谅遗漏。 ServerName 显然也用于我提供的配置中。此外,考虑到两个主机都被设置为被代理,我认为 DocumentRoot 完全没有任何意义。【参考方案2】:

答案似乎是关于单独模块的错误配置,即 mod_proxy_http。正如 Apache HTTP 错误日志中的“代理:没有协议处理程序对 URL 有效”消息所提示的那样,我得到了以下 serverfault 答案对我的帮助:https://serverfault.com/questions/242650/setting-up-a-basic-mod-proxy-virtual-host

【讨论】:

太糟糕了,链接没有找到答案,这只是sudo a2enmod proxy_http - 无论如何,谢谢! @jerluc:html 不是协议,你的意思是mod_proxy_http【参考方案3】:

如果您有错误日志:

如果您使用的是 DSO 版本的 mod_proxy,请确保代理 使用 LoadModule 将子模块包含在配置中。

执行此命令:

a2enmod proxy_http

【讨论】:

以上是关于基于主机名的 Apache HTTP 代理的主要内容,如果未能解决你的问题,请参考以下文章

apache

基于apache的虚拟主机

用于将 ip 重定向到主机名的 Apache httpd.conf

配置基于主机名的虚拟主机及HTTPD 加密SSL配置以及HTTPS强制跳转

基于域和主机名的 ASP.NET MVC 路由

Web服务器(Apache)虚拟主机的配置