我正在 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
答案3
错误信息是一个线索。
“无法解决...”
意味着billingtest.example.org
的 DNS 中不存在主机名example.org
,或至少您所引用的机器server001.example.org
无法确定 的 IP 号码billingtest.example.org
。
至于解决方案,鉴于名称暗示测试站点,它可能billingtest.example.org
尚未存在于公共 DNS 中,正是因为它是一个测试站点,并且名称不应发布(尚未)。太好了。将其添加到/etc/hosts
。server001
如果它的 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。