我这里有一个机架式服务器(HOSTA,运行 ubuntu 12.04),它有两个虚拟化的 ubuntu 安装(VIRTA 和 VIRTB,通过 vboxheadless,一个是 12.04,另一个是 14.04)。一个安装了最新版本的 apache/mysql/php,另一个安装了某些旧版 Web 应用程序的旧版本。所有三个 ubuntu 安装都有自己的本地 IP 地址。我有一个外部 IP 地址,当前已映射到 example1.ddns.me(通过 no-ip)。目前,Web 流量通过我的 verizon 路由器转发到 VIRTA。现在,我需要让这个旧服务器启动并运行,让全世界都可以看到,并且我不能使用 80 以外的其他端口,否则我会将端口 8080 路由到 VIRTB 并完成它。
我希望所有传入的网络流量都转到 HOSTA,并设置反向代理(我想是吧?)以将 example1.ddns.me 拆分到 VIRTA,将 example2.ddns.me 拆分到 VIRTB。反向代理是这样工作的吗?有人可以提供演练吗?
答案1
您可以使用 HAproxy 根据主机名使用 ACL 将请求发送到不同的后端:
https://cbonte.github.io/haproxy-dconv/configuration-1.5.html#acl
例子:
acl is_host1 hdr(host) -i host1.example.com
acl is_host2 hdr(host) -i host2.example.com
use backend host1_backend if is_host1
use backend host2_backend if is_host2
这只是一个片段,而不是完整的工作配置,但它应该可以让您走上正确的轨道。
答案2
好吧,这就是我最终采用的解决方案,效果很好。为了提供全面的答案,我将简要回顾一些细节。
服务器:
ServerA-ubuntu 12.04-内部静态 IP 192.168.1.230
ServerB-ubuntu 14.04-内部静态 IP 192.168.1.235
我在每台服务器上都有一个网站,一个在 12.04 上(安装了较旧的 php),我希望 exampleA.com 指向该网站,另一个在 14.04 上,安装了新的 php,即 exampleB.com。两台服务器都运行 Apache2。
我有一个外部 IP 地址,两个域和所有子域都指向该地址。路由器上的端口转发将端口 80 上的所有传入流量传递到 ServerA。
通常,您的所有 Web 文件都将位于 /var/www/ 中,它由您的 apache2 配置日志 /etc/apache2/sites-available/default 中设置(在 ubuntu14.04 上,此文件为 /etc/apache2/sites-available/000-default)。
我保留了默认的 VirtualHost 块,以允许原始站点保持功能而无需进行更改,如下所示:
<VirtualHost *:80>
DocumentRoot /var/www
</VirtualHost>
该块中可能有其他配置,例如网站管理员电子邮件和 .htaccess 的每个目录配置等,但基本配置是来自端口 80 的任何内容都会指向您的 /var/www 文件夹并从那里提供服务。
在该 VirtualHost 块下方,我添加了一个新的 VirtualHost 块,如下所示:
<VirtualHost *:80>
ServerName exampleb.com
ProxyPreserveHost on
ProxyPass / http://192.168.1.235
ProxyPassReverse / http://192.168.1.235
</VirtualHost>
这允许从端口 80 进入的任何流量(到 192.168.1.230 地址)来自 exampleb.com然后转发到 192.168.1.235,并由该机器上的 apache 提供服务,这是由于代理部分。那里发生的事情取决于该机器的 apache 配置。
此设置需要在 apache2 中启用代理,可在 ubuntu 中通过以下命令完成:
a2enmod proxy
事实证明,这个非常简单的安排完全符合我的预期。如果这个解释不够清楚,我很抱歉,欢迎提供反馈以改进或澄清。
答案3
看一下这个 Apache 文档: mod_proxy
您可能会发现第一个主题“正向代理和反向代理/网关”及其示例很有用(也许您需要在示例中进行更多挖掘才能使其发挥作用)
有时你需要为 URL 添加一些重写规则,但这样做就可以了
无论如何,我会遵循 Jim G. 在评论中提出的建议。