Назад | Перейти на главную страницу

Размещение нескольких доменов на разных серверах, но только один общедоступный IP-адрес

Есть ли способ разместить несколько веб-сайтов с разными доменами на одном и том же общедоступном IP-адресе, и когда пользователь входит, скажем, example1.com, который переходит на один сервер в моей частной сети (192.168.1.20), а example2.com переходит на 192.168 .1.21? У меня есть виртуальная машина, и я хочу поэкспериментировать с некоторыми готовыми решениями для Linux, и было бы здорово, если бы я мог сделать эти сайты общедоступными, когда я решу их использовать. Многие решения, с которыми я здесь столкнулся, включают использование перенаправления, но я не нашел достойного описания того, как это работает. Увидит ли пользователь перенаправление в своем браузере? Это медленно? Я предполагаю, что у меня должен быть один «главный» сервер, на котором запущен apache, который будет прослушивать порт 80, а затем перенаправлять на другие мои серверы?

Вам нужен обратный прокси-сервер, расположенный между серверами и общедоступной сетью. nginx - популярный выбор для этого, и есть много примеров, если вы знаете, что искать (http://www.howtoforge.com/how-to-set-up-nginx-as-a-reverse-proxy-for-apache2-on-ubuntu-12.04 является одним из первых, что вернул поиск по запросу "обратный прокси nginx").

Для доменов / каталогов, обслуживаемых разными серверами внутри прокси, вы определяете каждый виртуальный хост или каталог, как если бы прокси-машина собиралась обслуживать их из разных локальных местоположений, но вместо этого определяете каждый как прокси, используя соответствующий параметры.

nginx - не единственный вариант: многие веб-серверы (включая apache с правильным модулем (модулями)) могут работать таким образом. nginx - популярный выбор, потому что он быстрый и легкий, но если вам нужны и другие функции, сделайте лучший выбор в магазинах.

Если вы используете SSL на любом из сайтов, вам необходимо настроить прокси с соответствующими сертификатами, и, очевидно, вам потребуется настроить веб-сервер для работы с SNI, если вам нужно более одного сайта SSL для прохождения через procy. Для эффективности обычно прокси-сервер общается с внутренними серверами не по протоколу ssl http. если сеть между ними является надежной.

Каждый раз, когда мне нужно это делать, я возвращаюсь к HAProxy, это еще один пакет обратного прокси, который позволяет размещать несколько служб за одним (или несколькими) общедоступными IP-адресами.

В этом примере я бы установил HAproxy на вашем компьютере с публичным адресом.

Это можно сделать с помощью APT-GET или YUM, в зависимости от вашего выбора. После установки взгляните на файл конфигурации (в Ubuntu он находится в /etc/haproxy/haproxy.cfg)

HAProxy использует FRONTENDS и BACKENDS, Frontends для привязки к IP: PORT, а затем к бэкэнду, в котором вы указываете серверы (один или несколько).

Вот пример моей конфигурации для запуска нескольких приложений веб-сервисов за моим единственным домашним IP. В моем случае я использую несколько портов на одном IP-адресе в своих бэкэндах, в ваших примерах вы хотели бы использовать разные IP-адреса на порту 80.

#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, настроенный во Frontend, myserver прослушивает порт 80, просматривает заголовок http на входящих запросах и, если он видит запрос для film.mypersonaldomain.com, он использовал бэкэнд couchpotato, если он видит tv.mypersonaldomain .com он использует бэкэнд Silentbeard.

Обратите внимание на настройки «тролля», которые я использовал при тестировании, бэкэнд по умолчанию, если вы переходите на мой общедоступный IP-адрес без указания совпадающего URL-адреса, должен был отправить ваш запрос на meatspin.com (НИКОГДА НЕ ПЕРЕХОДИТЕ ПО ЭТОМ АДРЕСУ, ЕСЛИ ВЫ ЦЕНИТЕ СВОИ ГЛАЗА), в этом примере я заменил это на google.com.

С HAProxy можно сделать гораздо больше, но это должно дать вам хорошее представление об основах. Документация для HAPRoxy довольно подробная, но при этом очень исчерпывающая.

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

J