Apache HTTPD 代理传递本地 DNS 失败

Apache HTTPD 代理传递本地 DNS 失败

我在 Windows 机器上的 Ubuntu VM 中使用 Docker 运行 Apache Tomcat 和 Apache HTTP。我已将 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。如果我直接从浏览器访问 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 容器网络

相关内容