Apache虚拟主机和反向代理

我有许多虚拟主机的域名映射到一个单一的Apache服务器(我们称之为server1)。 在某些情况下,某个虚拟主机的所有URL应该由不同的服务器来服务(我们称之为server2)。

什么是最简单的方法来实现呢? 我可以简单地将server2设置为使用与server1相同的基于名称的虚拟主机设置,然后依靠server1的X-Forwarded-Host头(即server2是否只根据这些头进行正确的操作)? “同名虚拟主机设置”是指“真正的”域名(即映射到server1的IP的域名)。

你确实可以使用mod_proxy模块。 它与vhosts运行良好。 基本上,主服务器将收到所有请求,当某个url /域被调用时,mod_proxy会将这个域redirect到另一个服务器(服务器2),它在服务器1上看起来像这样

<VirtualHost *> ServerName server1.com Hosted on the server </VirtualHost *> <VirtualHost *> ServerName server2.com // mod_proxy directives in order to redirect this domain name to the other server // </VirtualHost> 

有一个很好的教程: http : //www.apachetutor.org/admin/reverseproxies

我遇到了同样的问题,我探索了两个解决scheme:

  1. 镜像内部DNS的外部层次结构(例如foo.example.com – > foo.internal.lanbar.example.com – > bar.internal.lan等); 在前端的每个VirtualHost块中添加相应的ProxyPassProxyPassReverse指令。 如果你有虚拟主机,那么你可以在前端创build一个catch-all( ServerAlias *.example.com )部分,并使用mod_rewrite( [P] )将请求代理到后端,将请求映射到内部名称。

    这是我第一次尝试:它工作正常,但需要更改后端的命名。 如果您无法触及DNS,或者后端服务器甚至没有名称,则无法使用此方法。

    噢,别忘了用ProxyPassReverseCookieDomain修复这些cookie,否则你会盯着日志,想知道为什么会话不再工作了;-)

  2. 在前端使用全面的虚拟主机,并使用ProxyPreserveHost on ; 在这种情况下,前端会保留请求中的Host:头,因此您可以在后端重新使用原始的vhostconfiguration(即,后端在头文件Host:foo.example.com中看到具有外部名称的请求)