![将站点重定向到主机上的正确虚拟机](https://linux22.com/image/604022/%E5%B0%86%E7%AB%99%E7%82%B9%E9%87%8D%E5%AE%9A%E5%90%91%E5%88%B0%E4%B8%BB%E6%9C%BA%E4%B8%8A%E7%9A%84%E6%AD%A3%E7%A1%AE%E8%99%9A%E6%8B%9F%E6%9C%BA.png)
我想设置一些带有几个虚拟机的服务器。然后每个虚拟机将容纳不同的站点。因此,例如,我的主机有 DNS my.host.com,我将指向此 DNS,例如其他 DNS 地址,因此 my.host.com - 1.2.3.4 my.host.com - virtual1.host.com my.host.com - virtual2.host.com
现在私有网络上的 VM 的地址是:vm1 - 1.1.1.1 - 并且她拥有网站 virtual1.host.com vm1 - 2.2.2.2 - 并且她拥有网站 virtual2.host.com
所以我的问题是如何重定向到正确的 VM,我的意思是如果我点击 virtual1.host.com 我将转到我的主机并且主机应该将我重定向到该站点。
我只想使用端口 80 或 443。我可以使用哪种防火墙或代理进行这种类型的重定向?也许使用 iptables 就足够了,我也在考虑 HAproxy?
有什么建议吗?谢谢。
答案1
好的伙计们,我在主机上做了我想做的事情,我使用了 iptables,我丢弃了 80 到 8080 以及 443 到 8443 上的所有流量,用于 nginx 代理,然后从代理将其发送到正确的地址。虚拟机(代理)和虚拟机(站点)之间的通信始终在端口 80 上
我必须在有代理的 VM 上设置证书并将其签名到正确的 DNS,然后通过 proxy_pass 发送到目的地,这里有一个 confs 的示例:
iptables -t nat -A PREROUTING -d host_ip/32 -i eth0 -p tcp -m multiport --dports 80 -j DNAT --to-destination proxy_ip:8080
iptables -t nat -A PREROUTING -d host_ip/32 -i eth0 -p tcp -m multiport --dports 443 -j DNAT --to-destination proxy_ip:8443
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
然后我的 nginx 以 chroot 模式运行,并且有一个配置:
server {
listen 8080 ;
server_name site_dns;
rewrite ^ https://$server_name$request_uri? permanent;
}
server {
listen 8443 default_server;
server_name site_dns;
ssl on ;
ssl_certificate /etc/nginx/server.crt;
ssl_certificate_key /etc/nginx/server.key;
access_log /var/log/nginx/site.access.log ;
error_log /var/log/nginx/site.error.log ;
location / {
proxy_pass http://site_ip_vm;
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503;
proxy_cache one;
proxy_cache_key site$request_uri;
proxy_cache_valid 200 3h;
proxy_cache_use_stale error timeout invalid_header updating http_500 http_502 http_503 http_504;
proxy_ignore_headers Expires Cache-Control;
proxy_redirect http:// https://;
proxy_buffering on;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
并且 apache 仅在端口 80 上监听。因此,所有与证书相关的计算都在代理站点上完成,并且 apache 不会承受负担,而且缓存机制必须给我带来良好的性能,无论如何,我会在一段时间后看到结果。