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

Могу ли я заставить apache mod_proxy подключаться к удаленному серверу по имени хоста, а не по IP?

Я настраиваю Apache2 как обратный прокси для удаленного сайта. Предположим, удаленный сайт http://app.remotesite.com. Вот фрагмент конфигурации моего виртуального хоста:

ProxyPass /pxy/ http://app.remotesite.com/

Таким образом, это должно принять запрос вроде http://app.mysite.com/pxy/search?q=abc, и передать его как http://app.remotesite.com/search?q=abc.

Когда я пытаюсь это сделать, я получаю "неверный запрос". Судя по выходным данным в /var/log/apache2/error.log, прокси работает правильно, но похоже, что при подключении к удаленному сайту он делает это со своим IP-адресом. Если я возьму этот IP-адрес (напечатанный в error.log) и сделаю с ним запрос, например http: // [IP адрес] / search? q = abc, я получаю ту же ошибку «Неверный запрос». Моя гипотеза заключается в том, что удаленный сайт полагается на имя хоста для правильного обслуживания запроса, но mod_proxy не отправляет его. Я знаю о параметре ProxyPreserveHost, но он предназначен для сохранения исходного имени хоста в запросе прокси (в данном случае app.mysite.com), чего я не хочу.

Может ли кто-нибудь предложить мне способ заставить mod_proxy использовать имя хоста удаленного сайта в своем запросе? Или, если моя гипотеза не имеет смысла, укажите, что еще может пойти не так?

Ваша гипотеза, вероятно, неверна. mod_proxy подключается, используя имя хоста, указанное в URL-адресе прокси.

Если вы запросите http://app.remotesite.com/search?q=abc в командной строке с помощью curl, вы получите ожидаемый ответ? Если это так, то лучше всего начать с рассмотрения разницы между запросом, который производит curl, и запросом, который mod_proxy пересылает.

Чтобы увидеть, что curl делает, вы можете использовать --trace-ascii <file> вариант, например:

curl --trace-ascii trace.out http://app.remotesite.com/search?q=abc

Это даст результат в trace.out это выглядит примерно так:

== Info: About to connect() to google.com port 80 (#0)
== Info:   Trying 74.125.228.8... == Info: connected
== Info: Connected to google.com (74.125.228.8) port 80 (#0)
=> Send header, 165 bytes (0xa5)
0000: GET / HTTP/1.1
0010: User-Agent: curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7
0050:  NSS/3.13.1.0 zlib/1.2.3 libidn/1.18 libssh2/1.2.2
0084: Host: google.com
0096: Accept: */*
00a3: 

Получить ту же информацию из Apache немного сложнее; я хотел бы использовать tcpdump, который является инструментом захвата пакетов. Начните захват пакетов следующим образом:

tcpdump -w packets -s 1500 port 80 and host app.remotesite.com

Пока tcpdump запущен, сделайте запрос из браузера (или curl, или что-то еще), остановите tcpdump с участием ^C, а затем просмотрите файл следующим образом:

strings packets

Что даст вам что-то вроде:

{GET / HTTP/1.1
User-Agent: curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.13.1.0 zlib/1.2.3 libidn/1.18 libssh2/1.2.2
Host: google.com
Accept: */*

Это покажет запрашиваемый URL, Host: заголовок и другая полезная информация. Посмотрите, как это выглядит, и возвращайтесь сюда, если не заметили чего-то очевидного.