一个公共 IP 后面有多个 Web 服务器

一个公共 IP 后面有多个 Web 服务器

长期读者第一次发帖(呵呵)。所以这是我的困境。我在家里为一些朋友托管了 3 个网站,都不是大型网站,都是 wordpress 网站。在 VMWare Workstation 中运行它们。有大量的内存可用,而且很乱,所以不用担心资源问题。当我构建站点 #2 时,我意识到,“糟糕!... 我要如何通过路由器路由这些站点?”现在,在你们中的一些人说 vhost 之前,我正在将站点隔离在不同的 VM 上。3 个中的 1 个不是很重要的网站,但如果发生什么事情,我宁愿不要让所有站点同时关闭。所以...

我有一个通用的 Linksys 路由器(带有糟糕的新 Smart Wifi)。天哪,我需要将固件更改为好东西,但那是另一天的事了。因此,一个公共 IP,3 个 VM 都具有唯一的内部 IP,即 192..1/2/3。路由器不允许使用同一端口 (80) 将端口转发到多个 IP。

如果要做的事情太多,我会硬着头皮将它们移到同一个虚拟机中,并虚拟主机不同的站点,但我的想法是使用另一个虚拟机。虚拟路由器。我可以想到一些路由器/防火墙虚拟机,如 pfSense、m0n0wall,但我只是在寻找一些简单易用的东西,但我假设它需要像虚拟主机一样工作,从路由器接收端口 80 请求,然后使用主机头将流量分散到拥有 Web 服务器的 3 个虚拟机(我认为)。

有人有建议、更好的方法等吗?非常感谢,尽管将它们全部放在一个 VM 下可以立即解决这个问题,但就我而言,VM 的分离有点胜过它。

但非常乐意接受各种想法。干杯。

答案1

设置另一个虚拟机作为代理,它将使用域名将流量引导到适当的虚拟机。

答案2

我尝试过各种解决方案,最终成功使用 Apache2。它带有虚拟主机功能。

您需要对 Apache2 进行一些“连接”,但我将我的 conf 作为指南提供给您。工作原理:apache2 在“基于名称的域”功能上运行,它可以运行任意数量的站点,但只在一个公共 IP 上运行。[我是一名开发人员,这解释了为什么有这么多站点]。

   $ sudo apt-get install -y apache2 apache2-dev apache2-threaded-dev

通过在配置文件末尾添加以下三行来连接你的 apache2.conf

   include httpd.conf
   <VirtualHost *>
   </VirtualHost>

按照本指南配置您的 httpd.conf;根据您的情况进行相应调整。默认情况下,作为新安装,您将看不到 httpd.conf,但如果 Apache2 发现 httpd.conf 位于 /etc/apache2 目录中,它将做出响应。

    $ sudo touch /etc/apache2/httpd.conf

并将其添加到 httpd.conf。重点是:80 未受影响。当您看到'## 编辑此内容*';您可以在这里根据自己的喜好进行编辑,同时保持其他内容不变。

   <Directory "/var/www">  ***## EDIT THIS***
      Options Indexes FollowSymLinks
      AllowOverride All
   </Directory>

    <location /cgi-bin>
    AddHandler cgi-script .cgi .pl
    Options -Indexes +FollowSymlinks +ExecCGI
    </location>


  <VirtualHost *:80>
    ServerName example.ca  ***## EDIT THIS***
    ServerAlias www.example.ca ***## EDIT THIS***
    DocumentRoot /var/www/example_ca/html ***## EDIT THIS***
    <Location "/">
            Order Deny,Allow
            Deny from all
            Allow from all
    </Location>
      CustomLog /path/to/your/preferred/log-folder/access.log common ***## EDIT THIS***
      ErrorLog /path/to/your/preferred/log-folder/error.log ***## EDIT THIS***
   </VirtualHost>

  <VirtualHost *:80>
    ServerName sample.ca ***## EDIT THIS***
    ServerAlias www.sample.ca ***## EDIT THIS***
    DocumentRoot /var/www/sample_ca/html ***## EDIT THIS***
    <Location "/">
            Order Deny,Allow
            Deny from all
            Allow from all
    </Location>
      CustomLog /path/to/your/preferred/log-folder/access.log common ***## EDIT THIS***
      ErrorLog /path/to/your/preferred/log-folder/error.log ***## EDIT THIS***
   </VirtualHost>

然后...

   $ sudo service apache2 restart

瞧!祝你好运!

编辑:请记住 - 在设置站点并测试在您的本地网络上运行后,您需要使用您的 DNS 服务提供商(您注册这些域的地方)更新 DNS 并更新您的 IP 地址(您在这些多站点上托管您的机器的地方)。

答案3

路由器不允许使用同一端口 (80) 转发到多个 IP。

顺便说一句,这在标准 TCP/IP 中是不可能实现的。您需要一个程序(即代理),在端口上接受请求,查看请求,然后相应地分流请求。


Apache 和其他 Web 服务器具有“反向代理”功能,可用于“拆分”传入流量。反向代理会告诉 Apache,对某个 Web 路径(即“yourdomain/directory1”)的请求应发送到另一个 Web 服务器,而该 Web 服务器的响应则返回到原始客户端。

但是请注意,如果您在此 Web 服务器上运行应用程序(PHP 等),则可能需要更改它们的设置,因为它们面向外部的 URL 会有所不同。您可能必须告诉 PHP 应用程序它位于“yourdomain/directory1”而不是“yourdomain”,以便它能够正确生成链接。可以告诉 Apache 在将后端服务器的流量返回给客户端之前重写它,但这很困难,如果可能的话,您希望避免这样做。使用 Javascript 生成链接的应用程序尤其成问题,因此并非所有 Web 应用程序都易于“反向代理”。

因此,请在第四台“前端”虚拟机上安装 Apache - 将传入的 TCP 80 转发到此虚拟机。您还需要确保此虚拟机可以访问“虚拟网络”上的其他虚拟机。然后,在“前端”虚拟机上,您可以为每个网站设置单独的反向代理。

这里是相关的 Apache 配置详细信息,使用ProxyPassProxyPassReverse指令。

您还可以详细说明并实现缓存,这将有助于提高性能。

相关内容