apache2.4无法解析虚拟主机配置

apache2.4无法解析虚拟主机配置

我正在 example.org 上设置 apache2.4,并且我们配置了 2 个站点。

站点 1:

<IfModule mod_ssl.c>
        <VirtualHost billingtest.example.org:443>
                ServerAdmin [email protected]
                ServerName billingtest.example.org

                ErrorLog ${APACHE_LOG_DIR}/error.log
                CustomLog ${APACHE_LOG_DIR}/access.log combined

                SSLEngine on

                SSLCertificateFile /etc/ssl/certs/example.org.crt
                SSLCertificateKeyFile /etc/ssl/private/example.org.key
                SSLCertificateChainFile /etc/ssl/certs/letsencrypt_sff_bundle.crt

                DocumentRoot /var/www/php/billing
        </VirtualHost>
</IfModule>
<VirtualHost billingtest.example.org:80>
        [email protected]
        ServerName billingtest.example.org

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

#       DocumentRoot /usr/local/apache2/htdocs
        Redirect permanent / https://billingtest.example.org
</VirtualHost>

# vim: syntax=apache ts=4 sw=4 sts=4 sr noet

站点 2:

<IfModule mod_ssl.c>
        <VirtualHost example.org:443>
                ServerAdmin [email protected]
                ServerName example.org

                ErrorLog ${APACHE_LOG_DIR}/error.log
                CustomLog ${APACHE_LOG_DIR}/access.log combined

                SSLEngine on

                SSLCertificateFile /etc/ssl/certs/example.org.crt
                SSLCertificateKeyFile /etc/ssl/private/example.org.key
                SSLCertificateChainFile /etc/ssl/certs/letsencrypt_sff_bundle.crt

                DocumentRoot /var/www/html/main
        </VirtualHost>
</IfModule>
<VirtualHost example.org:80>
        ServerAdmin [email protected]
        ServerName example.org

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

#       DocumentRoot /usr/local/apache2/htdocs
        Redirect permanent / https://example.org
</VirtualHost>

# vim: syntax=apache ts=4 sw=4 sts=4 sr noet

当访问其中任何一个站点时,我都会看到目录的索引/var/www/html,如果切换到 URL,server001.example.org我会得到相同的结果。 example.org并且billingtest.example.org是托管 Apache 服务器CNAME的记录。server001.example.org

example.org(站点 2) 应该加载一个普通的 HTML 网站,而billingtest.example.org(站点 1) 应该加载一个 PHP 网站。

我不确定发生了什么。我可以提供我的 apache2.conf 和日志。另外引起我注意的一个错误是:

(EAI 2)Name or service not known: AH00547: Could not resolve host name billingtest.example.org -- ignoring!


提前感谢您提供的任何支持。

答案1

将依赖项移至 ServerName 而不是 vhost 名称。将其换回_default_。这仅在使用 AWS 时发生,而不是 Linode,我认为这是因为机器不使用公共 IP,而是通过防火墙运行。这可以通过修改 /etc/hosts 来解决,而我想避免这种情况。

我只会使用_default_,感谢 Jim L. 的帮助!

答案2

我知道这是一个老问题,但这可能会对处于与我类似情况的其他人有所帮助。

我在服务器启动过程中遇到了与您相同的错误(Name or service not known: AH00547: Could not resolve host name… -- ignoring!) 。/var/log/messages/

启动后,Apache 立即忽略虚拟主机配置 - 所有内容都指向后备域(因此 SSL 证书无效)。奇怪的是,重新启动 Apache 解决了systemctl restart httpd这个问题。

因此,这只是服务器重启后立即出现的问题。配置很好,只需重新启动 Apache 即可!但我不能冒险在我不在场的情况下重启。

经过大量搜索,我发现 Apache 在网络准备好之前就启动了,因此无法解析域名,因此在设置虚拟主机时忽略了它。

因此我进行了一些搜索,很容易告诉 systemd,Apache 应该在启动期间等到网络启动。

因此,systemctl edit httpd.service会出现一个文本编辑器,我在其中输入:

[Unit]
After=network-online.target

保存它,现在 Apache 等待网络正常启动后再启动。

有关设置 systemd 启动顺序的详细说明:

https://www.freedesktop.org/wiki/Software/systemd/NetworkTarget/

https://unix.stackexchange.com/questions/398540/how-to-override-systemd-unit-file-settings

https://unix.stackexchange.com/questions/165270/centos-7-boots-too-fast-and-network-is-not-ready-when-executing-cron-scripts

答案3

错误信息是一个线索。

“无法解决...”

意味着billingtest.example.org的 DNS 中不存在主机名example.org,或至少您所引用的机器server001.example.org无法确定 的 IP 号码billingtest.example.org

至于解决方案,鉴于名称暗示测试站点,它可能billingtest.example.org尚未存在于公共 DNS 中,正是因为它是一个测试站点,并且名称不应发布(尚未)。太好了。将其添加到/etc/hostsserver001如果它的 IP 号码是,10.11.12.13则将其添加到/etc/hosts

10.11.12.13 billingtest.example.org

然后重新启动 Apache 并查看该错误消息是否消失。

这看起来像是一种 hack,但在我看来,这是一种很好的做法,因为只要你在测试,这个 URL 就是一个“秘密”名称,不会属于在 DNS 中。将其添加到/etc/hosts服务器上,然后也将其添加/etc/hosts你的机器,然后您可以整天使用该名称访问该服务器,并且没有其他人知道该名称是否正在使用(无需 DNS 查找,假设您的主机/etc/hosts在 DNS 之前进行咨询)。

但如果你相信一群同事会保守秘密,你添加billingtest.example.org到您的公共 DNS,然后任何拥有该 URL 的人都可以访问该网站。完成测试后,您可以更改 DNS 记录和 Apache 配置以仅使用billing而不是billingtest

将名称添加到您的公共 DNS 也应该可以解决问题,但您必须等待 DNS 传播,并验证是否server001可以解析billingtest,然后像使用其他方法一样重新启动 Apache。

相关内容