在单独的服务器上托管多个域,但只有一个公共 IP 地址

在单独的服务器上托管多个域,但只有一个公共 IP 地址

有没有办法在同一个公共 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 的文档非常详尽,也非常全面。

http://haproxy.1wt.eu/#docs

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 与内部服务器通信如果它们之间的网络是值得信赖的。

相关内容