Apache 2.4 虚拟主机被忽略

Posted

技术标签:

【中文标题】Apache 2.4 虚拟主机被忽略【英文标题】:Apache 2.4 virtual host ignored 【发布时间】:2014-11-10 05:27:16 【问题描述】:

我正在使用 Ubuntu 14.0 设置新的 Web 服务器,遵循 the instructions here 创建虚拟主机,但是我的单个附加虚拟主机始终加载默认站点 (/var/www/html)。

这是我的虚拟主机配置(我已将我的域替换为 example.com,但其他方面相同):

<VirtualHost *:80>
  ServerName example.com
  ServerAlias www.example.com

  ServerAdmin webmaster@localhost
  DocumentRoot /var/www/example/app

  ErrorLog $APACHE_LOG_DIR/error.log
  CustomLog $APACHE_LOG_DIR/access.log combined
</VirtualHost>

我没有对安装在 Ubuntu 14 中的 Apache 2.4 配置进行任何其他更改。

编辑:在更改此虚拟主机后,我正确启用了站点并重新启动了 apache。

当我在浏览器中访问 example.com 时,我得到了默认站点。我究竟做错了什么?如何让这个虚拟主机加载正确的目录?

编辑:解决方案是重新启动命令 (https://***.com/a/23713299/225682) 中缺少“sudo”。

【问题讨论】:

【参考方案1】:

尝试使用 -t 选项运行 apachectl 命令,这将检查所有配置是否正确。这个虚拟主机是哪个文件。您是否重新启动了 apache 以获取这些更改?

apachectl restart

【讨论】:

感谢您的建议。一切都检查完毕。 尝试在 /etc/hosts 文件中添加一个条目,例如:127.0.0.1 www.example.com,这有什么不同吗,看起来请求不包含主机头信息! 试过了。没有改变任何东西。但是,Chrome 检查器建议正在发送主机标头信息。【参考方案2】:

编辑 vhost 后需要重启 apache we server,还需要添加 enable vhost。 启用:

sudo a2ensite example.conf (name of config file inside sites-available directory)

重启服务器:

sudo service apache2 restart

还要检查 www 目录的权限,也许 apache 的用户无法读取该目录。

【讨论】:

【参考方案3】:

您是否在配置中的某处启用了虚拟主机?

NameVirtualHost *:80

【讨论】:

"AH00548: NameVirtualHost 无效,将在下一个版本中删除" - 我认为它可能有效,但显然现在这是自动的。 Ubuntu 上的 Apache 调试起来有点麻烦,因为他们试图让它防白痴。我面前没有 Ubuntu,但从我记得它的 Apache 2 发行版中,没有可用的站点和启用站点的目录,并且您的 vhosts 文件应该启用站点吗?我认为这就是 a2ensite 命令的作用,但您可能需要检查该文件是否已实际复制。 NameVirtualHost 指令在 Apache 2.4 中无效。【参考方案4】:

终于在https://***.com/a/23713299/225682找到答案了。

Apache 必须使用 sudo 重新启动,否则更改实际上无效。

【讨论】:

【参考方案5】:

这就是我的故事。我有全新安装:

webmaster@ubuntuserver:/srv$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 16.04.3 LTS
Release:        16.04
Codename:       xenial
webmaster@ubuntuserver:/srv$
webmaster@ubuntuserver:/srv$ apache2 -v
Server version: Apache/2.4.18 (Ubuntu)
Server built:   2017-09-18T15:09:02
webmaster@ubuntuserver:/srv$

我使用了非常简单的虚拟主机配置:

<VirtualHost *:80>
ServerAdmin admin@testsite.com
ServerName testsite.com
ServerAlias www.testsite.com
DocumentRoot /var/www/testsite
ErrorLog $APACHE_LOG_DIR/error.log
CustomLog $APACHE_LOG_DIR/access.log combined
</VirtualHost>

尝试了许多建议,例如:

目录权限设置; 目录内容chmod到774; 防火墙设置;

最后通过添加解决:

Listen 80

到虚拟主机配置的顶部,所以它看起来像:

Listen 80
<VirtualHost *:80>
ServerAdmin admin@example.com
ServerName testsite.com
ServerAlias www.testsite.com
DocumentRoot /var/www/testsite
ErrorLog $APACHE_LOG_DIR/error.log
CustomLog $APACHE_LOG_DIR/access.log combined
</VirtualHost>

最终虚拟主机开始响应并按预期运行。

不过有趣的是,我后来尝试重新创建问题,即使没有设置 Listen 80,虚拟主机也能正常工作。但是我确信使虚拟主机响应的触发器是Listen 80 设置。

不管怎样,你也可以参考 Apache 文档:

https://httpd.apache.org/docs/2.4/bind.html

【讨论】:

我没有找到任何说明您可以将listen...添加到vhost文件的资料。这样做时出现错误 @Gerfried,根据我的示例,我没有在“VirtualHost”指令中添加“Listen 80”,而是在顶部添加。连基本配置示例都自带“Listen 80”:httpd.apache.org/docs/2.4/vhosts/examples.html【参考方案6】:

6 年太晚了,但也许这会对某人有所帮助。在调试此类问题时,首先检查 apache 是否可以看到您的虚拟主机配置:apachectl -S

您应该在输出中看到您的虚拟主机配置:

*:80                   example.com (/etc/httpd/conf.d/example.com.conf:2)

如果看不到,可能是配置文件路径未包含在主配置文件中,或者文件本身缺少 .conf 扩展名。

如果您在输出中看到您的 VirtualHost,但您仍然获得默认的 VirtualHost,请检查主配置文件中的全局 ServerName 指令。它不应与您的 VirtualHost ServerName 匹配。

注意 - 如果您的全局 ServerName 未设置,apache 将使用 rDNS 获取一个。因此,如果您的 IP 地址的反向 DNS 记录匹配 example.com(与您的 VirtualHost 相同),您的 VirtualHost 可能会被忽略。我相信这是一个非常常见的问题来源,我还没有在论坛上找到它。如果您遇到此问题,请使用 host 命令检查您 IP 的 rDNS 记录。

【讨论】:

以上是关于Apache 2.4 虚拟主机被忽略的主要内容,如果未能解决你的问题,请参考以下文章

无法访问此站点 - XAMPP 忽略自定义域虚拟主机

Apache 2.4 VirtualHost ServerName 被忽略

无法使用 Apache 2.4 创建虚拟主机

Apache 2.4 在同一端口上的多个虚拟主机

apache2.2 和 2.4 虚拟主机配置文件

限制对 Apache 2.4 虚拟主机 (WAMP) 的访问