我必须在备份机器上运行 Apache httpd 服务器,该机器是 CentOS。在本例中,它是一个 WordPress 多站点安装。由于它是一台备份机器,DNS 服务器没有指向正确的 IP 地址。
问题是它并不孤单,还有其他虚拟主机。该目录/etc/httpd/conf.d/
包含以下文件:、、00-default.conf
等,其中一个配置文件包含此 WordPress 多站点备份。每个虚拟主机配置文件看起来或多或少都一样:vhost1.conf
vhost2.conf
<VirtualHost *:80>
ServerName vhostX.example.org
# rest of config goes here
</VirtualHost>
<VirtualHost *:443>
ServerName vhostX.example.org
# rest of config goes here
</VirtualHost>
WordPress 备份的虚拟主机部分包含多站点的所有可能的主机名ServerAlias
。
在我的客户端上,在文件中/etc/hosts
,我添加了原始机器的 FQDN 以指向备份机器的 IP 地址。
现在,我观察到的问题如下:
- 只有 WordPress 多站点实例的主网站响应正确,尽管它也给出为
ServerAlias
,而不是ServerName
。 - 列出的所有其他域名
ServerAlias
都由配置的虚拟主机处理,00-default.conf
而不是备份的虚拟主机。这是我最不明白的烦人之处。由于 SNI 和 HTTP 标头中都给出了正确的主机名,我希望它能选择正确的虚拟主机配置,因为域名在那里列为ServerAlias
。 - 如果我用 IP 地址符号替换
*:80
和,即,那么这个 WordPress 备份可以正常工作,但其他任何功能都不起作用(我认为一切都由 WordPress 多站点实例处理,该实例配置为重定向到我们的主要网站)。*:443
192.168.1.2:80
192.168.1.2:443
我尝试过的:客户端上的命令(主机名和 IP 地址已删除):
curl -vkLo- --resolve wpsite1.example.org:80:192.168.1.2 --resolve wpsite1.example.org:443:192.168.1.2 'http://wpsite1.example.org'
该文件/etc/nsswitch.conf
设置为在查询 DNS 服务器之前解析 hosts 文件(如果这有任何相关性的话)。我还尝试将 IP 地址添加到服务器的文件中/etc/hosts
。据我所知,我假设 httpd 在启动时尝试解析 DNS 名称,但由于 DNS 服务器将名称解析为有效的 IP 地址,因此它不起作用。
我该如何解决这个问题?我是否必须为主机分配第二个 IP 地址?
答案1
第二天,我发现了最不明显的事情:
$ apachectl -S
[...]
141.201.80.66:80 is a NameVirtualHost
default server one-of-the-wp-single-sites.example.org (/etc/httpd/conf.d/00_defaults.conf:1)
[...]
出于某种原因,我立即想到这个域名是文件中列出的第一个具有此 IP 地址的域名。在文件中其他行之前/etc/hosts
插入本地主机名即可解决问题:/etc/hosts
192.168.1.2 this-host.example.org
重新加载Httpd,一切正常。