Apache HTTPD 代理程式透過本機 DNS 失敗

Apache HTTPD 代理程式透過本機 DNS 失敗

我正在 Windows 電腦上的 Ubuntu VM 中使用 Docker 運行 Apache Tomcat 和 Apache HTTP。我已將 HTTP 伺服器(在連接埠 80 上執行)配置為將代理請求反向傳送到 Tomcat(在連接埠 8080 上執行)。

/etc/主機:

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。如果我直接從瀏覽器存取 localapp.com:8080/api,Tomcat 應用程式將正常工作,因此這似乎只是 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文件中的設置,但刪除一些配置,例如對環回地址的引用。
  • 一個可能的解決方案是添加第三個運行 DNS 伺服器的 docker 容器,並將該--dns選項新增至兩個容器。但這會引入超出需求的軟體。

您可以使用/etc/hosts容器的 DNS 名稱和 IP 位址填充主機上的文件,透過 IP 位址而不是 DNS 名稱引用其他容器,或僅透過 ALIAS 引用它們並使用該--link命令。

也可以看看: -配置容器 DNS -Docker 容器網路

相關內容