有没有办法在同一个公共 IP 地址上托管具有不同域名的多个网站,并且当用户输入时,例如 example1.com 会转到我专用网络 (192.168.1.20) 上的一台服务器,而 example2.com 会转到 192.168.1.21?我有一个 VM 主机,想尝试一些交钥匙 Linux 解决方案,如果我可以在决定使用它们时让这些网站公开访问,那就太棒了。我在这里遇到的许多解决方案都涉及使用重定向,但我还没有找到关于其工作原理的合理描述。用户会在浏览器中看到重定向吗?它很慢吗?我猜我必须有一个运行 apache 的“主”服务器,它将监听端口 80,然后重定向到我的其他服务器?
答案1
每次我需要这样做时,我都会回到 HAProxy,这是另一个反向代理包,允许您在单个(或多个)公共 IP 后面托管多个服务。
在这个例子中,我将在你的机器上安装具有公共地址的 HAproxy。
可以根据您选择的发行版通过 APT-GET 或 YUM 完成此操作。安装后,查看配置文件(在 Ubuntu 中,它位于 /etc/haproxy/haproxy.cfg)
HAProxy 使用 FRONTENDS 和 BACKENDS,前端绑定到 IP:PORT,然后绑定到指定服务器(一个或多个)的后端。
以下是我在单个主 IP 后面运行多个 Web 服务应用程序的配置示例。在我的例子中,我在后端的同一 IP 上使用多个端口,在您的示例中,您可能希望在端口 80 上使用不同的 IP。
#GLOBAL CONFIG
global
maxconn 1000
daemon
user haproxy
group haproxy
nbproc 1
pidfile /var/run/haproxy.pid
stats socket /var/run/haproxy.cmd mode 777 level admin
#ASSUMED DEFAULTS
defaults
log global
mode http
option httplog
option dontlognull
retries 3
maxconn 1000
contimeout 5000
clitimeout 50000
srvtimeout 50000
#STATS PAGE
listen stats 192.168.10.253:9000
mode http
stats enable
stats auth username:password
stats uri /proxy_stats
stats realm PAGE TITLE
####SABNZBD####
backend sabnzbd
server sabnzbd 192.168.10.253:8080 weight 1 maxconn 1000 check inter 10000
option redispatch
option httpclose
option forwardfor
balance roundrobin
timeout server 120000
####SICKBEARD####
backend sickbeard
server sickbeard 192.168.10.253:8081 weight 1 maxconn 1000 check inter 10000
option redispatch
option httpclose
option forwardfor
balance roundrobin
timeout server 120000
####COUCHPOTATO####
backend router
server router 192.168.10.254:80 weight 1 maxconn 1000 check inter 10000
option redispatch
option httpclose
option forwardfor
balance roundrobin
timeout server 120000
####TROLL####
backend troll
# server troll www.meatspin.com:80 weight 1 maxconn 1000 check inter 10000
server troll www.google.com:80 weight 1 maxconn 1000 check inter 10000
option redispatch
option httpclose
option forwardfor
balance roundrobin
timeout server 120000
#NAS FrontEnd
frontend nas
bind PUBLIC_IP:80
reqadd X-Forwarded-Proto:\ http
default_backend troll
acl req_couchpotato hdr_beg(host) -i film.
acl req_sickbeard hdr_beg(host) -i tv.
acl req_router hdr_beg(host) -i home.
acl req_sabnzbd hdr_beg(host) -i warez.
use_backend couchpotato if req_couchpotato
use_backend sickbeard if req_sickbeard
use_backend sabnzbd if req_sabnzbd
use_backend router if req_router
有了这个,并在前端配置了 PUBLIC_IP,myserver 就会监听端口 80,查看传入请求的 http 标头,如果它看到对 film.mypersonaldomain.com 的请求,它就会使用 couchpotato 后端,如果它看到 tv.mypersonaldomain.com,它就会使用 sickbeard 后端。
请注意我在测试时使用的“troll”设置,如果您在未指定匹配的 URL 的情况下访问我的公共 IP,则默认后端会将您的请求发送到 meatspin.com(如果您珍惜自己的眼睛,请不要访问此地址),在此示例中,我已将其替换为 google.com。
HAProxy 可以做很多事情,但本文应该能让您很好地了解基础知识。HAPRoxy 的文档非常详尽,也非常全面。
J
答案2
您需要在服务器和公共网络之间安装一个反向代理。nginx 是一个流行的选择,一旦您知道要搜索什么,就会有很多示例(http://www.howtoforge.com/how-to-set-up-nginx-as-a-reverse-proxy-for-apache2-on-ubuntu-12.04是搜索“nginx 反向代理”返回的第一个结果之一)。
对于由代理内部的不同服务器提供服务的域/目录,您可以定义每个虚拟主机或目录,就像代理机器即将从不同的本地位置为它们提供服务一样,而是使用相关选项将每个定义为代理。
nginx 不是唯一的选择:许多 Web 服务器(包括具有正确模块的 apache)都可以以这种方式运行。nginx 是一个流行的选择,因为它速度快而且轻便,但如果您还需要其他功能,那么请货比三家以做出最佳选择。
如果您在任何网站上使用 SSL,则需要使用相关证书配置代理,并且显然,如果您需要多个 SSL 站点通过代理,则需要配置 Web 服务器以处理 SNI。为了提高效率,通常让代理通过非 SSL http 与内部服务器通信如果它们之间的网络是值得信赖的。