Я пытаюсь обслуживать запросы к моему сайту через прокси-сервер с помощью балансировщика нагрузки. Когда я пытаюсь получить доступ к сайту, нажимая http://PROXYSERVER.com, HomePage отлично сохраняет URL-адрес адресной строки с http://PROXYSERVER.com.
Теперь, когда я пытаюсь получить доступ к внутренним ссылкам, например, http://PROXYSERVER.com/services/, тогда URL-адрес адресной строки меняется на URL-адрес APPSERVER http://APPSERVER01.com/services/
ПРИМЕЧАНИЕ. Страница открывается нормально, но URL-адрес адресной строки меняется.
Ожидаемое поведение - когда пользователь запрашивает http://PROXYSERVER.com/services/, тогда в адресной строке должен сохраняться URL-адрес прокси при обслуживании запроса.
Вот мой код для балансировки нагрузки,
ProxyRequests off
ServerName PROXYSERVER.com
# WebHead1
BalancerMember http://APPSERVER01:80/ route=node1
# WebHead2
BalancerMember http://APPSERVER02:80/ route=node2
Order Deny,Allow
Deny from none
Allow from all
ProxySet lbmethod=byrequests
#ProxySet lbmethod=bybusyness
ProxySet stickysession=BALANCEID
SetHandler balancer-manager
Order deny,allow
Allow from all
# Point of Balance
ProxyPass /balancer-manager !
ProxyPass / balancer://mycluster/
Любые предложения будут оценены.
Опубликованная вами конфигурация и описанные вами симптомы указывают на отсутствие ProxyPassReverse
директива.
Без него никакие URL-адреса в заголовках Location, Content-Location и URI в ответах на перенаправление HTTP, отправленных одним из серверов приложений, не будут изменены. Это раскрывает реальное имя / URL-адрес сервера приложений, и посетитель будет направлен на этот URL-адрес, а не на прокси-сервер.
Вы увидите такие заголовки, например, когда перейдете в каталог http://example.com/dirname
и опустите косую черту в конце /.
В этом случае активный сервер приложений отправит заголовок HTTP 301 «перемещен навсегда» и добавит косую черту в конце.
След с curl -v proxyserver.com/services
покажет что-то вроде:
> GET /services HTTP/1.1
> Host: proxyserver.com
> User-Agent: curl/7.43.0
> Accept: */*
>
< HTTP/1.1 301 Moved Permanently
< Date: Wed, 06 Jan 2016 09:27:31 GMT
< Server: Apache/2.2.15 (CentOS)
< Location: https://appserver01:/services/
< Content-Length: 328
< Connection: close
< Content-Type: text/html; charset=iso-8859-1
<
Вы решаете эту проблему, добавляя правильную директиву ProxyPassReverse, которая сообщает Apache о необходимости перезаписать такие заголовки с помощью URI прокси.
# Point of Balance
ProxyPass /balancer-manager !
ProxyPass / balancer://mycluster/
ProxyPassReverse / balancer://mycluster/
В зависимости от версии Apache, которую вы используете, вы можете столкнуться с поведением, похожим на эта старая ошибка и может попробовать явные директивы ProxyPassReverse для каждого члена пула балансировщика:
ProxyPass /balancer-manager !
ProxyPass / balancer://mycluster/
ProxyPassReverse / balancer://mycluster/
# Ensure that headers sent by application servers get corrected:
ProxyPassReverse / http://APPSERVER01:80/
ProxyPassReverse / http://APPSERVER02:80/