我目前有一台硬件 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 地址的正当理由。