Apache 虚拟主机和反向代理

Apache 虚拟主机和反向代理

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

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

答案1

您确实可以使用 mod_proxy 模块。它与 vhost 配合使用效果很好。基本上,主服务器将接收所有请求,当调用某个 url/域时,mod_proxy 会将此域重定向到另一台服务器(服务器 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

答案2

我刚刚遇到了同样的问题,我探索了两种解决方案:

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

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

    哦,不要忘记用 修复 cookie ProxyPassReverseCookieDomain,否则您将盯着日志想知道为什么会话不再起作用 ;-)

  2. 在前端使用一个 catch-all vhost,并使用ProxyPreserveHost on;在这种情况下,前端保留主持人:请求中的标头,这样你就可以在后端重用原来的 vhost 配置(即后端在标头中看到带有外部名称的请求主机:foo.example.com

相关内容