VirtualHost 始终在 Ubuntu 14.04 上使用 Apache 返回默认主机

Posted

技术标签:

【中文标题】VirtualHost 始终在 Ubuntu 14.04 上使用 Apache 返回默认主机【英文标题】:VirtualHost always returns default host with Apache on Ubuntu 14.04 【发布时间】:2014-07-05 22:56:59 【问题描述】:

我尝试在默认的localhost 之外设置一个虚拟主机。 每当我尝试调用我的虚拟主机http://test 时,我都会得到位于http://localhost 目录中的默认Apache2 索引文件。此外,在禁用 (a2dissite) 两个 VirtualHost 文件和重新加载 apache (service apache2 reload) 后,apache 仍会返回此页面。

虚拟主机不工作会出什么问题?

配置:

我的目录结构如下:

/var/www/html                  # Default localhost dir
/var/www/html7index.html       # Apache2 default index

/var/www/test                  # HTML dir for the virtual host
/var/www/test/index.html       # My "website" 

/etc/hosts的内容:

127.0.0.1       localhost
127.0.1.1       Laptop
127.0.0.1       test

/etc/apache2/sites-available的目录内容:

000-default.conf
default-ssl.conf
test.conf

文件000-default.conf

<VirtualHost localhost:80>
        ServerName localhost
        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/html
        ErrorLog $APACHE_LOG_DIR/error.log
        CustomLog $APACHE_LOG_DIR/access.log combined
</VirtualHost>

文件test.conf

<VirtualHost test:80>
        ServerAdmin test@localhost
        ServerName test
        NameVirtualHost test
        ServerAlias test
        DocumentRoot /var/www/test
        ErrorLog $APACHE_LOG_DIR/error.log
        CustomLog $APACHE_LOG_DIR/access.log combined
</VirtualHost>

【问题讨论】:

所以你已经做了a2ensite test 是的,当然。抱歉,忘记了。 您的 vHost 文件和主机文件对我来说看起来不错。您在进行 a2ensite test 时是否获得了 apache 默认页面?你能从日志中找到任何东西吗? 日志中没有任何内容。但我想通了。看我自己的答案。谢谢。 【参考方案1】:

我遇到了这个问题,结果我不得不禁用默认虚拟主机。

sudo a2dissite 000-default.conf

可能的扩展:

根据apache文档An In-Depth Discussion of Virtual Host Matching:

[...] 如果此时主服务器没有 ServerName,则使用运行 httpd 的机器的主机名。

这意味着如果默认 vhost(通常为 000-default.conf)没有设置 ServerName - 这是默认设置 - Apache 将回退到操作系统的主机名。

因此,Apache 会从默认虚拟主机 (000-default.conf) 中选择并提供服务,即使配置了另一个用户创建的虚拟主机,其服务器名称与机器的主机名相同。

原因是 Apache 按文件名的字母顺序对虚拟主机进行排序,并选择与请求的 HTTP 主机标头匹配的第一个虚拟主机配置。因此,在用户定义的虚拟主机之前检查 000-default.conf,因为它们通常不以 000- 为前缀。

【讨论】:

这对我有用。但我讨厌没有解释的解决方案。为什么 Apache 不跟随我的虚拟主机而是加载默认的虚拟主机?完全没有意义。 这是正确的解决方案。请添加一些有关它的详细信息。 通常 Ubuntu 上的 apache2 为默认站点设置了虚拟主机,即当 apache 找不到附加到另一个虚拟主机的更具体的域 (TLD) 时。命令a2dissite SITE_NAME 是一个用于在 Ubuntu/Debian 系统上禁用任何已启用站点的脚本。相反的命令是a2ensite,用于启用禁用的站点。这些命令只能以特权权限执行,即sudo。它也适用于 Ubuntu 当前的 16.04LTS 和 17.04。 为我工作。我认为 中该死的 * 是问题所在...... 不。我有相反的问题。我有 并且它仍在处理 e.conf 。这是有道理的,因为 e.conf 首先是按字母顺序排列的,但让我感到困惑的是,在我安装letsencrypt serverfault.com/questions/1013270/… 之前,它并没有阻止 ssl.conf 先被处理【参考方案2】:

tl;dr:sudo 调用它:sudo service apache2 reload


看起来service apache2 reload 的行为愚弄了我。请参阅以下日志:

user@Laptop:/etc/apache2/sites-available$ sudo a2ensite test.conf 
Enabling site test.
To activate the new configuration, you need to run:
  service apache2 reload
user@Laptop:/etc/apache2/sites-available$ service apache2 reload
 * Reloading web server apache2                                                  * 
user@Laptop:/etc/apache2/sites-available$

尝试联系http://test不工作

user@Laptop:/etc/apache2/sites-available$ sudo service apache2 reload
 * Reloading web server apache2                                                  * 
user@Laptop:/etc/apache2/sites-available$

尝试联系http://testWORKING

所以,找出差异!关键是我认为它首先会正确重新加载。日志文件中也没有条目。使用 sudo 调用它会有所帮助。这是一个错误吗?

【讨论】:

没有 sudo,apache 不会抛出异常。所以你不知道你是否正确地重新加载了你的conf。谢谢。 清除浏览器缓存。我被发送到我的默认站点,该站点通过那里的 .htaccess 重定向了我。这意味着,即使我确实使用了 sudo,我的浏览器仍然决定重定向我。清除缓存修复它。 谢谢你,第二次没有抛出错误(!)【参考方案3】:

只是指出这一点对于有经验的用户来说可能是显而易见的,但如果你是第一个计时器,那就不是那么明显了。

确保您在/sites-enabled 中使用的配置以.conf 结尾,正如您的apache2.conf 中所预期的那样

这是我的问题,它解决了。

【讨论】:

不知道我查看了我的代码有多久,并没有注意到我命名良好的文件是域,而不是 domain.conf。谢谢指出【参考方案4】:

如果您已经尝试过以下方法: 1.检查文档根目录和父文件夹的权限。 2. a2dissite 000-default 等 3. 使用 sudo service apache2 reload 重启 apache 它仍然无法正常工作,然后执行以下操作:

1.启用调试日志记录: vi /etc/apache2/apache2.conf LogLevel debug 2.重启apache2并监控日志sudo service apache2 restart tail -f /var/log/apache2/*.log 3.注意服务器的 IP 是否按预期显示在日志中:

==> /var/log/apache2/other_vhosts_access.log

您会注意到它不像典型的 IP 地址那样 xxx.xx.xx.xx:80 我有一些 FQDN,例如“ip-xxx-xx-xx-xx.eu-west-2.compute.internal:80” 我正在使用 AWS 弹性 IP 为我的 Amazon EC2 Web 服务器创建一个固定 IP。

4.检查您的虚拟主机 .conf 文件的头部

<VirtualHost 127.0.0.1:80 11.22.33.44:80>
# Added from nessus to make more secure
RewriteEngine on
RewriteCond %REQUEST_METHOD ^(TRACE|TRACK)
RewriteRule .* - [F]
ServerName mydomain.com
...

好的,所以我们在这里看到的是,我们告诉 Apache 为来自 127.0.0.1 或 11.22.33.44 端口 80 上的请求提供服务。但是服务器永远不会看到这些 IP,因为它得到了那个奇怪的 FQDN,所以它永远不会火柴!尤里卡!

解决方案: 将 *:80 添加到 VirtualHost 标记,使其如下所示:

<VirtualHost 127.0.0.1:80 11.22.33.44:80 *:80>

并重新启动 apache。我希望这有帮助。可能还有其他原因,但如果这是您的问题的原因,那么是时候坐下来,喝杯茶放松一下了!如果没有,那么我希望您能找到解决方案。

PS。记得把你的日志放回去警告而不是调试!

【讨论】:

使用 &lt;VirtualHost mysite.com:80 *:80&gt; 并重新加载 Apache 就像一个魅力。谢谢楼主! 如果你输入*:80,其他的都是多余的。 &lt;VirtualHost *:80&gt; 就足够了。 对我来说,问题出在 VirtualHost 标头上,像您指出的那样修复了它,现在就像一个魅力。谢谢。【参考方案5】:

我浏览了所有这些解决方案,但都没有奏效。然后,我决定回去检查 apache2.conf 文件。我发现默认情况下,包含“启用站点”的 conf 文件的行被注释掉了。通过取消注释该行并重新启动 apache,它解决了我的问题(它接近文件末尾):

# Include the virtual host configurations:
IncludeOptional sites-enabled/*.conf 

【讨论】:

【参考方案6】:

可能虚拟主机的 .conf 文件有问题。

首先运行命令:

apache2ctl -S

响应必须类似于

VirtualHost configuration:
*:443                  is a NameVirtualHost
     default server localhost (/etc/apache2/sites-enabled/default-ssl.conf:2)
     port 443 namevhost localhost (/etc/apache2/sites-enabled/default-ssl.conf:2)
     port 443 namevhost myvhost.com (/etc/apache2/sites-enabled/myvhosts.com.conf:20)
             alias www.myvhost.com

*:80                   is a NameVirtualHost
     default server localhost (/etc/apache2/sites-enabled/000-default.conf:1)
     port 80 namevhost localhost (/etc/apache2/sites-enabled/000-default.conf:1)
     port 80 namevhost myvhost.com (/etc/apache2/sites-enabled/myvhost.com.conf:1)
             alias www.myvhost.com

但有时你可以阅读:

default server myvhost.com (/etc/apache2/sites-enabled/default-ssl.conf:2)

因此您的虚拟主机域指向默认配置(http 或 https)。

解决方案是在default-ssl.conf000-default.conf 文件中添加ServerName localhost 指令。

Apache 不知道您的默认站点的名称是谁,它需要随机解析 127.0.0.1。

设置ServerName后,必须运行:

service apache2 reload
service apache2 restart

如果您再次运行apache2ctl -S,您必须看到默认服务器的正确匹配。

【讨论】:

【参考方案7】:

它也让我发疯了,我一遍又一遍地检查我的 .conf 文件,所有的定义都绝对正确。我最终在这篇文章中尝试了 a2ensite 和 a2dissite 命令作为 sudoer,重新启动 apache,仍然登陆默认的 apache 欢迎页面,就好像 apache 永远不会禁用默认站点或使用我的新虚拟主机一样。

原来我试图在不使用 sudo 的情况下重新启动 apache...

service apache2 restart

使用

sudo service apache2 restart

【讨论】:

【参考方案8】:

如果你保持默认 *:80; *.443 确保它在底部 - 所以将 000-default 重命名为 zzz-default

【讨论】:

【参考方案9】:

我看到在 /etc/hosts 文件中使用与我尝试连接的站点相同的完全限定域名 (FQDN) 时会发生这种情况。为了解决这个问题,我不得不将 FQDN 重命名为不同于我的 VirtualHost ServerName 值之一。

也就是说,如果我的 /etc/hostname 是:

apple

在我的 /etc/hosts 中,我有:

192.168.54.34 apple.example.com apple

在我的 /etc/apache2/sites-enabled/apple.example.com.conf 我有:

<VirtualHost *:80>
    ServerAdmin blah@apple.example.com
    ServerName apple.example.com
    DocumentRoot /var/www/apple.example.com
    DirectoryIndex index.html index.php
</VirtualHost>

apple.example.com 将被 000-default.conf 接受,因为它也在 /etc/hosts 文件中列出。为了解决这个问题,我只是在 /etc/hostname 文件中更改了我的服务器的 FQDN,如下所示:

server1

和 /etc/hosts 文件:

192.168.54.34 server1.example.com server1

【讨论】:

【参考方案10】:

这不止一次地咬了我;有时我会启用 sudo - 有时我不会。

Ubuntu 14.04 似乎以任何方式显示相同的消息。当以每小时 100 英里的速度行驶时,有时您会错过一两个sudo

新网站默认返回错误目录的症状是我唯一的线索,即启用从未发生过。我会说这是一个错误。

它至少应该在命令未执行时发出警告!!!

【讨论】:

顺便说一句——同样的“错误”发生在 a2dissite 上——Ubuntu 显示它删除了符号链接——但实际上并没有。【参考方案11】:

对我来说,它在重新启动 apache 后开始工作:sudo service apache2 reload。然后在 http://test 上按 ctrl + F5。

【讨论】:

【参考方案12】:

我在 Apache 2.4 上的情况是通过在虚拟主机配置中添加以下设置来解决的:

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>

【讨论】:

以上是关于VirtualHost 始终在 Ubuntu 14.04 上使用 Apache 返回默认主机的主要内容,如果未能解决你的问题,请参考以下文章

VirtualHost 文件都指向 Ubuntu 12.04 中的第一个 VirtualHost [关闭]

Apache 2.4 虚拟主机被忽略

在 laravel @Apache2 Server Ubuntu 14.04 LTS 中将 Root 设置为公用文件夹

Apache 2.4 VirtualHost Ubuntu 只允许访问本地网络

后端多个apache 2.4 如何同步设置virtualhost

Ubuntu apache 虚拟主机站点在浏览器中不起作用