Apache HTTPD-Proxy-Pass, lokaler DNS-Fehler

Apache HTTPD-Proxy-Pass, lokaler DNS-Fehler

Ich führe einen Apache Tomcat und Apache HTTP mit Docker in einer Ubuntu-VM auf meinem Windows-Rechner aus. Ich habe meinen HTTP-Server (der auf Port 80 läuft) so konfiguriert, dass er Proxy-Anfragen an den Tomcat (der auf Port 8080 läuft) umkehrt.

/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>

Wenn ich die HTTP-Anwendung ausführe oder versuche, das Verzeichnis localapp.com/api aufzurufen, erhalte ich eine 502-Antwort, dass die DNS-Suche fehlgeschlagen ist.

<!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>

Es scheint, als ob Apache HTTP sich aus irgendeinem Grund nicht als Proxy an localapp.com wenden kann. Die Tomcat-Anwendung funktioniert, wenn ich localapp.com:8080/api direkt vom Browser aus aufrufe. Es scheint also nur ein Problem des Apache HTTP-Servers zu sein, der den DNS nicht richtig auflöst.

Zur Referenz, meine nsswitch.conf lautet:

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

Antwort1

Da Sie die beiden Container mit Standardeinstellungen für die Vernetzung erstellt haben, gibt es einige Dinge zu beachten.

  • Standardmäßig können sie nur über IP-Adressen kommunizieren.
  • Wenn Sie eine Namensauflösung wünschen, sollten Sie die --linkOption beim Erstellen der Container verwenden und in jede Richtung einen Link erstellen.
  • Die Container verwenden standardmäßig die Einstellungen aus der /etc/hostsDatei des Hosts sowie aus dessen /etc/resolv.confDatei, entfernen jedoch einige Konfigurationen wie Verweise auf die Loopback-Adresse.
  • Eine mögliche Lösung besteht darin, einen dritten Docker-Container hinzuzufügen, der einen DNS-Server ausführt, und die --dnsOption beiden Containern hinzuzufügen. Dies würde jedoch mehr Software einführen als nötig.

Sie können die /etc/hostsDatei auf dem Host mit den DNS-Namen und IP-Adressen der Container füllen, die anderen Container über die IP-Adresse statt über den DNS-Namen referenzieren oder sie nur über ALIAS referenzieren und den --linkBefehl verwenden.

Siehe auch: -Container-DNS konfigurieren -Docker-Container-Netzwerk

verwandte Informationen