如何使用Apache虚拟主机将特定端口链接到特定域?

我们有一个运行Apache HTTP服务器的前向Linux框,它充当了几个后端服务器的反向代理。 服务器通过特定的域名和端口进行访问,并在Apache中作为虚拟主机进行设置:

Listen 8001 Listen 8002 <Virtualhost *:8001> ServerName service.one.mycompany.com ProxyPass / http://internal.one.mycompany.com:8001/ ProxyPassReverse / http://internal.one.mycompany.com:8001/ RewriteEngine On RewriteCond %{REQUEST_METHOD} ^(TRACE|TRACK) RewriteRule .* - [F] </Virtualhost> <Virtualhost *:8002> ServerName service.two.mycompany.com ProxyPass / http://internal.two.mycompany.com:8002/ ProxyPassReverse / http://internal.two.mycompany.com:8002/ RewriteEngine On RewriteCond %{REQUEST_METHOD} ^(TRACE|TRACK) RewriteRule .* - [F] </Virtualhost> 

代理服务器只有一个IP地址,两个域都指向它。 通过service.one访问internal.one可以正常工作,就像通过service.two访问internal.two一样。

现在的问题是Apache访问虚拟主机时不考虑请求域。 我的意思是这两个域都适用于两个端口:service.one:8002代理服务器对internal.two:8002的请求,以及service.two:8001代理服务器对internal.one:8001的请求,理想情况下这两个请求都应该是否认。

我可以通过创build更多显式拒绝这些请求的虚拟主机来解决这个问题:

 NameVirtualHost *:8001 NameVirtualHost *:8002 <Virtualhost *:8001> ServerName service.two.mycompany.com Redirect permanent / http://errorpage.mycompany.com/ </Virtualhost> <Virtualhost *:8002> ServerName service.one.mycompany.com Redirect permanent / http://errorpage.mycompany.com/ </Virtualhost> 

但是这不是一个理想的解决scheme,因为我们打算向代理添加更多的服务,并且每个新端口都需要在所有其他域上被明确拒绝,并且每个新域都需要在所有端口被明确拒绝不利用。 随着我们添加更多的服务,虚拟主机的数量可能会很快失去控制。

那么我的问题是,是否有更好的办法呢? 我们是否可以将特定端口与虚拟主机中的特定域绑定,以便仅处理该域 – 端口组合,而其他所有组合都不是?

我试过的东西:

  • 添加NameVirtualHost *:8001等没有额外的虚拟主机。
  • 设置ProxyRequests开启和closures,以及ProxyPreserveHost开启和closures
  • 将服务器名称或IP地址添加到虚拟主机标题,例如<VirtualHost service.one.mycompany.com:8001>
  • 在虚拟主机指令中使用<proxy>指令。
  • 很多很多的谷歌search。

代理服务器运行CentOS 6.2 64位,Apache HTTPD服务器2.2.15。 如前所述,代理服务器只有一个IP地址,我们使用的所有域都指向它。

Apache总是希望给定端口的默认回退,这就是你现在看到的。 所以,即使servername不匹配,这是它的最后/唯一的手段。 这就是为什么有一个000默认的通用作为标准。

您可以在vhostconfiguration中使用mod_rewrite来显式阻止/redirect任何不匹配的域。

 RewriteCond %{SERVER_NAME} !my.domain.com RewriteRule (.*)$ http://my.domain.com$1 [L,R=301]