Есть ли способ разместить несколько веб-сайтов с разными доменами на одном и том же общедоступном 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 довольно подробная, но при этом очень исчерпывающая.
J