如何配置多个域以指向具有单个 IP 的单独虚拟机?

如何配置多个域以指向具有单个 IP 的单独虚拟机?

假设我们有 2 个域名

http://www.foo.co.uk
http://www.bar.co.uk

1 个用于 Ubuntu 16.04 LTS 服务器的公共静态 IP 80.12.34.56192.168.0.11本地)

192.168.0.17以及在同一台机器上运行的 2 个 KVM Ubuntu 16.04 LTS 服务器实例192.168.0.18

如何才能将流量从 重定向foo.co.uk到,同时保持从到 的192.168.0.17流量不变?bar.co.uk192.167.0.18

编辑:这是我现在的 /sites-available/proxy_server.conf 文件

<VirtualHost *:80>

   ProxyRequests Off
   ProxyPreserveHost On

   <Proxy *>
      Order deny,allow
      Allow from all
   </Proxy>

   ProxyPass / http://192.168.0.18:8080/
   ProxyPassReverse / http://192.168.0.18:8080/
   ServerName syphonx.localhost

   CustomLog /var/log/apache2/access.log combined
   ErrorLog /var/log/apache2/error.log

</VirtualHost>

这会在我的 error.log 文件中产生如下错误

[proxy:error] [pid 7701:tid 139952398472960] (113)No route to host: AH00957:     HTTP: attempt to connect to 192.168.0.18:8080 (192.168.0.18) failed

[proxy:error] [pid 7701:tid 139952398472960] AH00959: ap_proxy_connect_backend disabling worker for (192.168.0.18) for 60

[proxy_http:error] [pid 7701:tid 139952398472960] [client ##.#.##.##:55331] AH01114: HTTP: failed to make connection to backend: 192.168.0.18

我试图在它们之间进行 ping 操作,但似乎 *.17 和 *.18 上的 2 个 KVM 实例的网络配置使得我无法访问它们。

答案1

这听起来有点像我在网络上的设置。我的家庭服务器上有多个面向 Web 的服务,但位于不同的系统 IP 上。

我在一个系统上有一个专用nginx服务器,它处理通过端口 80 和 443 的公共 IP 上的所有入站流量,并反向代理到我网络上的后端服务器(它们是 Apache、nginx 和 lighttpd,因此它不一定特定于后端)。我目前为不同 IP 地址上的 GitLab 实例和 OwnCloud 实例以及当前处于关闭状态的服务器执行此操作(之前运行了 MediaWiki 的测试实例)。

注意:此答案的编写理念是,执行下面定义的反向代理的系统是一个单独的系统,而不是您现有的服务器配置之一。如果它是您现有的服务器之一,则不要更改现有配置,除非添加新的一个用于单个站点不是在该服务器上,而不是为每个服务器设置新的配置。我还建议使用nginx;您可以在任何您想要的 Web 服务器上执行此操作,我只是知道如何在中快速执行此操作nginx


(1)nginx在其中一台服务器上安装,或设置另一台服务器

我使用nginxnginx-core变体,但您可以使用 Apache 或任何您熟悉并知道如何配置的 Web 服务器(但由于我使用nginx,因此我nginx在此处使用说明)。我还使用ssl-cert创建垃圾自签名证书以供默认捕获全部使用。

sudo apt-get install nginx nginx-core ssl-cert

(2)将该 nginx 服务器配置为“默认”捕获无效域名。

首先,让我们对默认的 catch-all 站点做一些更改。

sudo rm /etc/nginx/sites-enabled/default
sudo touch /etc/nginx/sites-available/catch-all

将其放入/etc/nginx/sites-available/catch-all文件中:

server {
    listen 80 default_server;
    listen 443 ssl default_server;

    server_name _;

    include snippets/snakeoil.conf;

    return 404;
}

对于我们未在实例上配置nginx监听连接的域的 IP 地址,这是默认的“全部捕获”功能。这样,我们可以为指向此处的任何无效域提供“未找到”信息。我们将在单独的配置文件中明确定义我们认为可以接受的所有域。不过,现在让我们启用这个全部捕获功能,然后开始设置单独的域。

sudo ln -s /etc/nginx/sites-available/catch-all /etc/nginx/sites-enabled/

(3)为各个允许的站点及其反向代理配置 nginx

对于这个例子,我将按照你的帖子www.foo.co.uk使用。www.bar.co.uk

基本上,我将为您提供一个示例文件,您可以将其用于反向代理配置。这应该适用于大多数反向代理设置,尽管您正在运行的个别网站可能会有细微差别,我无法在这里提供帮助。

对于每个要反向代理的站点,首先创建包含域名的文件。我将使用您所述的两个域名作为示例。

sudo touch /etc/nginx/sites-available/{www.foo.co.uk,www.bar.co.uk}

在创建的两个文件中,您都可以将其放置到位。只需在我的评论所在的位置(以 开头#)相应地更新信息即可:

server {
    listen 80;

    server_name DOMAINNAME;  # Replace DOMAINNAME with the actual domain

    location / {
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;

        # Replace this INTERNALIPADDRESS:PORT with the IP and port
        # combination for the server on your network handling the
        # above-specified domain name.
        proxy_pass http://INTERNALIPADDRESS:PORT/;
    }
}

一旦创建,我们需要再次激活它们。

sudo ln -s /etc/nginx/sites-available/www.foo.co.uk /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/www.bar.co.uk /etc/nginx/sites-enabled/

现在我们已经激活了网站,让我们确保这里没有配置错误。如果此命令输出除“配置文件语法正常”和“配置文件测试成功”之外的任何内容,则需要解决这些错误:

sudo nginx -t

如果没有错误通知,并且您收到“OK”和“成功”消息,则重新启动该nginx过程以使所有配置真正生效。

Ubuntu 14.04 及更早版本:

sudo service nginx restart

Ubuntu 16.04:

sudo systemctl restart nginx

(4)在您的网络上配置端口转发,将端口 80 和 443 转发到您刚刚设置此反向代理服务器的服务器。

在我刚刚写的例子中,假设我放置的服务器nginx是 192.168.100.200。在您的路由器上,设置端口 80 和端口 443 以路由到该 IP 地址。 如果您不打算使用 HTTPS,则仅转发端口 80。


(5)将您域名的 DNS 指向您家里的公共 IP 地址。

这是很容易理解的,但请确保 DNS记录指向路由器在公共互联网上为您提供的 IP 地址。(如果您不知道 IP 地址,A请转到或类似网站获取)ipchicken.com


(6)DNS 传播后,您就大功告成了。从任何系统进行测试不是在您的家庭网络上(例如咖啡店或其他地方的公共 Wi-Fi 上的计算机)。

答案2

我认为您的虚拟主机正在使用桥接网络,这意味着它们无法连接到主机,或者主机无法连接到它们。

例如:尝试浏览或 ping http://192.168.0.18通过 192.168.0.11,由于桥接网络,您将无法访问。

如果是这种情况,则使用 NAT 连接到您的 VM 而不是网桥,然后 ping 新获得的 IP,我觉得它应该可以工作。

相关内容