Apache HTTPD proxy передает локальный сбой DNS

Apache HTTPD proxy передает локальный сбой DNS

Я запускаю Apache Tomcat и Apache HTTP с использованием Docker в виртуальной машине Ubuntu на моей машине Windows. Я настроил свой HTTP-сервер (работающий на порту 80) для обратного прокси-запроса к Tomcat (работающий на порту 8080).

/etc/hosts:

127.0.0.1 localapp.com localhost

HTTP /conf/httpd.conf

<IfModule mod_proxy.c>

    ProxyRequests Off

    ProxyPass /app/api/ http://localapp.com:8080/api/

    ProxyPassReverse /app/api/ http://localapp.com:8080/api/

</IfModule>

HTTP /conf/extra/httpd-vhosts.conf

<VirtualHost *:80> 
    DocumentRoot "/usr/local/apache2/htdocs/app" 
    ServerName localapp.com
    <Directory "/usr/local/apache2/htdocs/app"> 
            Require all granted 
    </Directory>
</VirtualHost> 

<VirtualHost *:80> 
    DocumentRoot "/usr/local/apache2/htdocs" 
    ServerName localhost 
    <Directory "/usr/local/apache2/htdocs"> 
            Require all granted 
    </Directory> 
</VirtualHost>

Когда я запускаю HTTP-приложение или пытаюсь обратиться к каталогу localapp.com/api, я получаю ответ 502 о том, что поиск DNS не удался.

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>502 Proxy Error</title>
</head><body>
<h1>Proxy Error</h1>
<p>The proxy server received an invalid
response from an upstream server.<br />
The proxy server could not handle the request <em><a href="/api">GET&nbsp;/api</a></em>.<p>
Reason: <strong>DNS lookup failure for: localapp.com</strong></p></p>
</body></html>

Похоже, что Apache HTTP по какой-то причине не может проксировать себя на localapp.com. Приложение Tomcat будет работать, если я зайду на localapp.com:8080/api напрямую из браузера, так что, похоже, проблема в том, что сервер Apache HTTP не разрешает DNS правильно.

Для справки, мой nsswitch.conf выглядит так:

passwd:         compat
group:          compat
shadow:         compat
gshadow:        files

hosts:          files dns
networks:       files

protocols:      db files
services:       db files
ethers:         db files
rpc:            db files

netgroup:       nis

решение1

Поскольку вы создали два контейнера с настройками сети по умолчанию, необходимо учесть некоторые моменты.

  • По умолчанию они могут общаться только с использованием IP-адресов.
  • Если вам необходимо разрешение имен, вам следует использовать эту --linkопцию при создании контейнеров, а также вам необходимо создать ссылку в каждом направлении.
  • Контейнеры по умолчанию используют настройки из файла хоста /etc/hosts, а также из своего /etc/resolv.confфайла, но удаляют некоторые конфигурации, такие как ссылки на адрес обратной связи.
  • Одним из возможных решений является добавление третьего контейнера Docker, на котором запущен DNS-сервер, и добавление опции --dnsв оба контейнера. Но это приведет к внедрению большего количества программного обеспечения, чем необходимо.

Вы можете заполнить /etc/hostsфайл на хосте DNS-именами и IP-адресами контейнеров, ссылаться на другой контейнер по IP-адресу вместо DNS-имени или ссылаться на них только по ПСЕВДОНИМУ и использовать команду --link.

Смотрите также: -Настройка DNS контейнера -Сетевое взаимодействие контейнеров Docker

Связанный контент