VirtualHost总是在Ubuntu 14.04上使用Apache返回默认主机

问题描述 投票:31回答:12

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

虚拟主机无法正常工作会出现什么问题?

组态:

我的目录结构如下:

/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>
apache ubuntu virtualhost
12个回答
52
投票

我遇到了这个问题,事实证明我必须禁用默认的虚拟主机。

sudo a2dissite 000-default.conf

Possible Expanation:

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

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

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

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

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


0
投票

我在/ 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 [email protected]
    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

0
投票

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

Listen 80

所以设置是这样的:

Listen 80
<VirtualHost *:80>
    ServerAdmin [email protected]
    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>

0
投票

您需要将默认的html文件(/var/www/html/index.html)替换为您的站点,或者将文件重命名为index.html.bak。由于某些原因,apache默认为index.html,除非您更改它。


43
投票

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://test:工作

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


6
投票

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

确保您在/sites-enabled中使用的配置以.conf中预期的apache2.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.eu-west-2.compute.internal:80 xx.78.xx.2xx - - [13 / Sep / 2017:18:40:44 +0100]“GET / HTTP / 1.1”200 3509“ - ”“Mozilla / 5.0(X11; Ubuntu; Linux x86_64; rv:55.0)Gecko / 20100101 Firefox / 55.0”

您会注意到,而不是xxx.xx.xx.xx:80,而不是典型的IP地址 我有一些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为端口80上的127.0.0.1或11.22.33.44的请求提供服务。但是服务器永远不会看到这些IP,因为它得到了奇怪的FQDN,所以它永远不会匹配!找到了!

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

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

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

PS。记得把你的日志恢复警告而不是调试!


2
投票

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

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

1
投票

它一直让我疯狂,我一遍又一遍地对我的.conf文件进行了解决,所有这些都是正确定义的。我最后在这篇文章中尝试了a2ensite和a2dissite命令作为sudoer,重新启动apache,仍然登陆默认的apache欢迎页面,好像apache从未禁用默认站点或占用我的新虚拟主机。

事实证明我试图重新启动apache而不使用sudo ...

service apache2 restart

使用

sudo service apache2 restart

1
投票

如果你保持默认*:80; * .443确保它位于底部 - 因此将000-default重命名为zzz-default


0
投票

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

Ubuntu 14.04似乎无论如何都显示相同的消息。当以每小时100英里的速度移动时,有时你会错过一两个sudo

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

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


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.