У меня много виртуальных хостов, чьи доменные имена соответствуют одному серверу Apache (назовем его server1). При определенных обстоятельствах все URL-адреса для определенного виртуального хоста должны обслуживаться другим сервером (назовем его server2).
Как проще всего этого добиться? Могу ли я просто настроить server2 для использования той же настройки виртуального хоста на основе имени, что и server1, а затем полагаться на заголовки server1 X-Forwarded-Host (т.е. будет ли server2 делать правильные вещи на основе только этих заголовков)? Под «настройкой виртуального хоста на основе одного и того же имени» я подразумеваю «настоящие» доменные имена (то есть доменные имена, которые соответствуют IP-адресу server1).
вы действительно можете использовать модуль mod_proxy. Он отлично работает с vhosts. По сути, главный сервер будет получать все запросы, и когда вызывается определенный URL / домен, mod_proxy перенаправляет этот домен на другой сервер (сервер 2), это выглядит так на сервере 1
<VirtualHost *>
ServerName server1.com
Hosted on the server
</VirtualHost *>
<VirtualHost *>
ServerName server2.com
// mod_proxy directives in order to redirect this domain name to the other server //
</VirtualHost>
И есть хороший учебник: http://www.apachetutor.org/admin/reverseproxies
Я столкнулся с той же проблемой, я нашел два решения:
Отразите внешнюю иерархию на внутреннем DNS (например, foo.example.com -> foo.internal.lan, bar.example.com -> bar.internal.lan, и т.д.); в каждом VirtualHost
блок во внешнем интерфейсе вы добавляете соответствующий ProxyPass
и ProxyPassReverse
директивы. Если у вас есть vhosts, вы можете создать универсальный (ServerAlias *.example.com
) в интерфейсе и используйте mod_rewrite ([P]
) для проксирования запроса на бэкэнд, сопоставляя запросы с внутренними именами.
Это первый подход, который я пробовал: он работает нормально, но требует изменения названия серверной части. Если вы не можете коснуться DNS или если у внутреннего сервера даже нет имени, вы не можете использовать этот подход.
О, не забудьте исправить куки с помощью ProxyPassReverseCookieDomain
, иначе вы будете смотреть в журналы, гадая, почему сеансы больше не работают ;-)
Используйте универсальный виртуальный хост во внешнем интерфейсе и используйте ProxyPreserveHost on
; в этом случае фронтенд сохраняет Хост: заголовок в запросе, поэтому вы можете повторно использовать исходную конфигурацию vhost в бэкэнде (т.е. бэкэнд видит запрос с внешним именем в заголовке Хост: foo.example.com)