El proxy Apache HTTPD pasa el error de DNS local

El proxy Apache HTTPD pasa el error de DNS local

Estoy ejecutando Apache Tomcat y Apache HTTP usando Docker en una máquina virtual Ubuntu en mi máquina con Windows. He configurado mi servidor HTTP (que se ejecuta en el puerto 80) para revertir las solicitudes de proxy al Tomcat (que se ejecuta en el puerto 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>

Cuando ejecuto la aplicación HTTP o intento acceder al directorio localapp.com/api, obtengo una respuesta 502 de que falló la búsqueda de 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>

Parece que Apache HTTP, por alguna razón, no puede conectarse a localapp.com. La aplicación Tomcat funcionará si presiono localapp.com:8080/api directamente desde el navegador, por lo que parece solo un problema de que el servidor HTTP Apache no resuelve el DNS correctamente.

Como referencia, mi nsswitch.conf es:

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

Respuesta1

Como ha creado los dos contenedores con la configuración predeterminada para la red, hay algunas cosas que debe tener en cuenta.

  • De forma predeterminada, solo pueden comunicarse mediante direcciones IP.
  • Si desea resolución de nombres, debe usar la --linkopción al crear los contenedores y debe crear un enlace en cada dirección.
  • Los contenedores utilizan de forma predeterminada la configuración del /etc/hostsarchivo del host, así como su /etc/resolv.confarchivo, pero eliminan algunas configuraciones, como las referencias a la dirección de bucle invertido.
  • Una posible solución es agregar un tercer contenedor acoplable que ejecute un servidor DNS y agregar la --dnsopción a ambos contenedores. Pero esto sería introducir más software del necesario.

Puede completar el /etc/hostsarchivo en el host con los nombres DNS y las direcciones IP de los contenedores, hacer referencia al otro contenedor mediante la dirección IP en lugar del nombre DNS, o hacer referencia a ellos solo mediante ALIAS y usar el --linkcomando.

Ver también: -Configurar DNS del contenedor -Redes de contenedores Docker

información relacionada