一个IP:虚拟主机的虚拟机?

一个IP:虚拟主机的虚拟机?

我目前有一台硬件 Linux 服务器,该服务器具有一个 IP 地址,运行三个网站(通过 apache 的虚拟主机)。我想将每个网站推送到其自己的虚拟机中,以提高隔离/安全性,并在需要时更轻松地迁移到不同的硬件。(为此,我开始研究 coreos。)

但我对这个简单的问题感到困惑。如何将不同的虚拟主机 httpd(或 ssh 或...)请求推送到同一 IP 硬件上的不同虚拟机?这不是 DNS 级别的问题---我认为我的 DNS 提供商只会将我的访问者推送到主 IP。

谢谢您的建议。

问候,

/iaw

答案1

您可以设置一个代理服务器,根据 vhost 规则将流量重定向到虚拟服务器。Apache 有 mod_proxy 来实现这一点,您可以设置一个反向代理/网关,根据 vhost 匹配将 HTTP 流量重定向到正确的虚拟机。

答案2

您需要在主机上安装反向代理。有几个不错的选择。例如带有 mod_proxy 的 Apache:

<VirtualHost external_IP:80>
 ServerName cust1.dev.domain.com
 ServerAdmin [email protected]
 ProxyRequests off
 ProxyPreserveHost on
 ProxyPass / http://192.168.0.100/
 ProxyPassReverse / http://192.168.0.100/
 <Proxy *>
      Order allow,deny
      Allow from all
 </Proxy>
 ErrorLog /var/log/apache2/cust1.dev.domain.com.log
 CustomLog /var/log/apache2/cust1.dev.domain.com.err.log combined
</VirtualHost>

<VirtualHost external_IP:80>
     ServerName cust2.dev.domain.com
     ServerAdmin [email protected]
     ProxyRequests off
     ProxyPreserveHost on
     ProxyPass / http://192.168.0.101/
     ProxyPassReverse / http://192.168.0.101/
     <Proxy *>
          Order allow,deny
          Allow from all
     </Proxy>
     ErrorLog /var/log/apache2/cust2.dev.domain.com.log
     CustomLog /var/log/apache2/cust2.dev.domain.com.err.log combined
</VirtualHost>

或者你可以用 nginx 来做:

upstream vm1  {
      server 192.168.1.100:80; #VM1
}

upstream vm2  {
      server 192.168.1.101:80; #VM2
}

## Start VM1 ##
server {
    listen       external_IP:80;
    server_name  www.example.com;

    access_log  /var/log/nginx/log/www.example.access.log  main;
    error_log  /var/log/nginx/log/www.example.error.log;
    root   /usr/share/nginx/html;
    index  index.html index.htm;

    ## send request back to apache1 ##
    location / {
     proxy_pass  http://vm1;
     proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
     proxy_redirect off;
     proxy_buffering off;
     proxy_set_header        Host            $host;
     proxy_set_header        X-Real-IP       $remote_addr;
     proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
   }
}

## START VM2 ##
server {
   listen      external_IP:80;
   server_name static.example.com;
   access_log  /var/log/nginx/log/static.example.com.access.log  main;
   error_log   /var/log/nginx/log/static.example.com.error.log;
   root        /usr/local/nginx/html;
   index       index.html;

   location / {
        proxy_pass  http://vm2;
        proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
        proxy_redirect off;
        proxy_buffering off;
        proxy_set_header        Host            static.example.com;
        proxy_set_header        X-Real-IP       $remote_addr;
        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

答案3

不同的主机需要有不同的 IP 地址。您可能能够将 NAT 和网站的代理服务器结合起来。SSH 必须在每个服务器上使用不同的端口。

最好为每台服务器分配适当的 IP 地址。在单独的服务器上托管网站是请求更多 IP 地址的正当理由。

相关内容