Субдомены для 1 IP, но несколько веб-серверов

Традиционным способом размещения нескольких веб-сайтов на одном IP-адресе было использование общего хоста и использование конфигурации виртуального хоста Apache для каждого сайта. Таким образом, разные доменные имена сопоставлялись с разными сайтами на основе поиска виртуального хоста, но все они отправлялись на один и тот же IP-адрес. Однако я хотел бы знать:

Возможно иметь несколько веб-серверов в частной локальной сети, доступ ко всем которым можно получить через порт 80 через один общедоступный маршрутизатор/dns/что-то еще, использующее один общедоступный IP-адрес.

В идеале к разным серверам должны обращаться субдомены, такие как server1.my-site.com и server2.my-site.com. Это довольно легко сделать, если вашим веб-серверам разрешено обслуживать веб-сайты на разных портах с переадресацией портов, но мне нужно, чтобы внешний мир не знал, к какому порту подключаться, и мог просто ввести server1.my-domain. com в свой браузер вместо server1.my-domain.com:1234

Это проблема только из-за растущего дефицита адресов IPv4, а IPv6 еще не «готов».


person Programster    schedule 25.01.2014    source источник


Ответы (2)


Да, это так. Вы должны настроить маршрутизатор как обратный прокси-сервер и перенаправлять HTTP-запросы на один из хостов в частной сети на основе заголовка Host или URL-адреса запроса. Nginx — популярный выбор, когда речь идет об обратном проксировании.

Если вы хотите использовать прокси-серверы, отличные от серверов HTTP, SMTP или IMAP, вам нужно вместо этого использовать iptables, например

iptables -t nat -A PREROUTING -d $DOMAIN_NAME -j DNAT --to-destination $SERVER2_IP
iptables -t nat -A POSTROUTING -j MASQUERADE
person Stefano Sanfilippo    schedule 25.01.2014
comment
Спасибо. Я так понимаю, что Nginx может проксировать все типы TCP-портов, так что это относится не только к веб-серверам? Например. Могу ли я использовать такую ​​систему для запуска нескольких серверов minecraft? - person Programster; 25.01.2014
comment
Нет, Nginx поддерживает только HTTP, SMTP и IMAP. Я не знаю, какой протокол использует Minecraft, но если он основан на необработанном TCP, вам следует использовать iptables и настроить правило пересылки. - person Stefano Sanfilippo; 25.01.2014
comment
ах, поэтому я хочу что-то вроде этого: iptables -t nat -A PREROUTING -d $DOMAIN_NAME -j DNAT --to-destination $SERVER2_IP [следующая строка] iptables -t nat -A POSTROUTING -j MASQUERADE (однако это не позволит вторичному хосту использовать виртуальные хосты) - person Programster; 25.01.2014
comment
Да. Что касается vhosts, я полагаю, что в Minecraft нет концепции vhosts, так что все должно быть в порядке. Что касается HTTP, Nginx сохранит URL-адрес и заголовок узла, поэтому виртуальные хосты должны работать нормально. - person Stefano Sanfilippo; 25.01.2014
comment
Извиняюсь, я имел в виду, что если бы я использовал универсальное решение iptables для разрешения как веб-серверов, так и серверов minecraft, то vhosts не работали бы. Однако vhosts будет работать, если я буду использовать nginx в качестве обратного прокси-сервера, но будет ли работать только с проксирующими веб-серверами правильно? - person Programster; 25.01.2014
comment
@Programster: -d разрешит $DOMAIN_NAME на стороне прокси (один раз, перед отправкой адреса в ядро, чтобы процитировать справочную страницу). Подумайте об этом, как прокси-сервер узнает, какое имя хоста использовал клиент для получения общего IP-адреса? Клиент должен каким-то образом отправить его, для чего и нужен заголовок HTTP Host. Многие протоколы предоставляют такую ​​информацию (например, TLS имеет SNI), и они обычно представляют ее под общим термином vhost. Однако некоторые протоколы этого не делают (я подозреваю, что Minecraft не поддерживает, может быть ошибкой). Когда они это сделают, вам никогда не удастся обойтись только iptables, это всегда специфично. - person tne; 18.02.2014

Решение Стефано работает только в том случае, если на роутере есть возможность установить Nginx. Если это невозможно, настройте обратный прокси (Nginx/Squid/Apache и т. д.) на сервере за маршрутизатором. Порт перенаправляет трафик с маршрутизатора на обратный прокси-сервер. Настройте обратный прокси-сервер для пересылки трафика на разные серверы в сети.

person RaviH    schedule 25.01.2014
comment
Спасибо тебе за это. Да, если бы я устанавливал это дома, это то, что мне нужно было бы сделать. - person Programster; 25.01.2014