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

Сбои Apache / Tomcat AJP DNS при туннелировании

У меня есть ситуация, когда я могу получить доступ к частному серверу apache2.4 / tomcat7.0 railo4.2 с NAT напрямую с хоста или локальной сети, но при туннелировании через удаленный порт SSH вперед приложение прерывается с ошибкой:

The proxy server received an invalid response from an upstream server.
The proxy server could not handle the request GET /.

Reason: DNS lookup failure for: server-dev:5555

Очевидным ответом было бы то, что server-dev - неразрешимое имя хоста, но здесь этого не должно быть, потому что lynx server-dev:80 работает локально на сервере или с компьютера LAN в подсети (имя разрешается через / etc / hosts на клиенте и сервере). Также работают статические страницы, обслуживаемые apache, ошибка, по-видимому, находится на стороне Tomcat или в коннекторе AJP. Я сам скомпилировал apache из исходников 2.4.9 с помощью apr 1.5.1. Единственное, кажется, проявляется при переадресации портов.

Журнал ошибок Apache показывает:

[Tue Jun 24 22:37:06.911541 2014] [proxy:error] [pid 16858] [client 10.10.10.15:63398] AH00898: DNS lookup failure for: server-dev:5555 returned by /

Нет ничего примечательного в catalina.out или любые другие журналы, которые я вижу.

Соответствующая конфигурация apache:

<VirtualHost *:80>
    ServerName server-dev
    UseCanonicalName On

    RewriteCond %{REQUEST_FILENAME} /[^/:]+\.cfml*($|/)
    RewriteRule (.*) ajp://%{HTTP_HOST}:8009$1 [P,L]
</VirtualHost>

SSH-туннель создается третьей системой «человек посередине» (10.10.10.15) с использованием PuTTY со следующими настройками:

Remote: 5555
Local: 10.10.10.101:80

Соответствующая запись в / etc / hosts на сервере (без привязки / dnsmasq):

10.10.10.101  server-dev  # servers private ip

Похоже, что либо файл hosts игнорируется, и выполняется попытка разрешения DNS, либо номер порта 5555 как-то сбивает его с толку (как будто он думает, что это часть имени хоста), хотя я не могу придумать веской причины для того и другого произойдет.

Я нашел проблему. Это выглядит как %{HTTP_HOST} также содержит номер порта в тех случаях, когда порт не 80, поэтому правило оценивается как RewriteRule (.*) ajp://server-dev:5555:8009$1 [P,L].

Простое решение: Похоже на %{SERVER_NAME} переменная не содержит порт.

Итак, правило, которое работает

RewriteRule (.*) ajp://%{SERVER_NAME}:8009$1 [P,L]

ПРЕДОСТЕРЕЖЕНИЕ: Я забыл, что HTTP_HOST и SERVER_NAME отличаются в зависимости от того, какой домен отправляет клиентский браузер. Мне действительно нужен HTTP_HOST, но не порт, поэтому фактическое решение https://stackoverflow.com/questions/11553939/rewriterule-using-http-host-and-a-different-port

RewriteCond %{HTTP_HOST} ^([^:]+)(:[0-9]+)?$
RewriteRule ^ http://%1:12345/ [R,L]