我开始拔我的头发。
我们使用 Redhat/Apache 设置了三台虚拟主机来为三个基于 Drupal 的域提供服务,并且设置了第四台虚拟主机来通过乘客从一台机器为 Redmine 提供服务。
此设置适用于所有流量,所有网络地址都可以解析所有四个域。由于网络基础设施的原因,所讨论的盒子使用代理来查看外部世界。
我尝试从本地计算机上的脚本访问 Redmine API,但响应是错误:
While trying to retrieve the URL: http://projects/users.xml
The following error was encountered:
Unable to determine IP address from host name for projects
The dnsserver returned:
Name Error: The domain name does not exist.
This means that:
The cache was not able to resolve the hostname presented in the URL.
Check if the address is correct.
从外部机器访问 API 提供了预期的响应,因此 API 是可访问的 - 这使我相信这只是 Apache 或/和 PHP 从自身解析虚拟主机域的问题。
我猜测这可能是代理问题,所使用的代理不知道本地网络 DNS,但我不知道如何关闭代理以便 Apache 检查,因为我没有设置此服务器并且不熟悉代理要求。
如果我可以确认这是否是代理问题,我该如何对某些域进行例外处理?我假设我需要使用 NO_PROXY 环境变量,但同样,我不知道如何为 Apache 用户执行此操作,更重要的是,为 Apache 用户转储 ENV 变量根本不会显示 HTTP_PROXY 值,所以我假设 Apache 在其他地方使用代理配置。
我是否遗漏了一些显而易见的东西?
编辑: 根据请求,域的 nslookup 返回:
$ nslookup projects
Server: 10.11.6.31
Address: 10.11.6.31#53
Name: projects.INNSERVE.LOCAL
Address: 10.11.6.48
编辑2: 根据要求,使用 wget 获取相关 URL 的结果:
$ wget projects/users.xml
--2012-12-22 19:12:51-- http://projects/users.xml
Resolving projects... 10.11.6.48
Connecting to projects|10.11.6.48|:80... connected.
HTTP request sent, awaiting response... 401 Authorization Required
Authorization failed.
答案1
我会尝试以下方法之一:
添加
domain example.com
search example.com
到 /etc/resolv.conf
或者添加
11.22.33.44 projects.example.com projects
到 /etc/hosts
其中任何一个都可能解决 DNS 问题。
答案2
出于绝望,我们设法通过重新定义 Apache Web 服务器主机文件来解决问题。以前我们使用 Webmin 来设置这些文件(大多数情况下,我手动创建项目主机条目,以便通过 Passenger 为 Redmine 安装提供服务)。
问题如下:
项目被定义为具有以下端口号的虚拟主机:
<VirtualHost our.ip.address:80>
DocumentRoot /opt/redmine-2.1.2/public
ServerName projects
...
而所有其他虚拟主机的定义都没有明确标记端口号:
<VirtualHost our.ip.address>
DocumentRoot /var/www
ServerName address.domain.local
ServerAlias address
除了 Apache 解析其自己的虚拟主机之外,其他方面都运行良好。
更改剩余的虚拟主机以包含端口号似乎已经纠正了这个问题(端口号很重要,因为我们出于各种与此无关的原因使用多个端口号)。