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

Виртуальные хосты Apache и обратный прокси

У меня много виртуальных хостов, чьи доменные имена соответствуют одному серверу 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

Я столкнулся с той же проблемой, я нашел два решения:

  1. Отразите внешнюю иерархию на внутреннем 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, иначе вы будете смотреть в журналы, гадая, почему сеансы больше не работают ;-)

  2. Используйте универсальный виртуальный хост во внешнем интерфейсе и используйте ProxyPreserveHost on; в этом случае фронтенд сохраняет Хост: заголовок в запросе, поэтому вы можете повторно использовать исходную конфигурацию vhost в бэкэнде (т.е. бэкэнд видит запрос с внешним именем в заголовке Хост: foo.example.com)