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

时间:2014-05-17 15:25:40

标签: apache ubuntu virtualhost

我尝试设置除默认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>

13 个答案:

答案 0 :(得分:50)

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

sudo a2dissite 000-default.conf

可能的扩展:

根据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-的前缀。

答案 1 :(得分: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 进行调用有帮助。这是一个错误吗?

答案 2 :(得分:5)

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

确保您在/sites-enabled中使用的配置以.conf

中预期的apache2.conf结尾

这是我的问题并修复了它。

答案 3 :(得分:4)

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

<强> 1。启用调试日志记录:
vi /etc/apache2/apache2.conf
LogLevel debug

2。重启apache2并监控日志
sudo service apache2 restart
tail -f /var/log/apache2/*.log

第3。请注意,如果服务器的IP按预期显示在日志中:

  

==&GT; /var/log/apache2/other_vhosts_access.log&lt; ==   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,所以它永远不会火柴!尤里卡!

<强> SOLUTION:
将*:80添加到VirtualHost标记,使其如下所示:

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


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

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

答案 4 :(得分:2)

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

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

答案 5 :(得分:2)

虚拟主机的.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)

因此您的vhost域指向默认配置(http或https)。

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

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

设置ServerName后,必须运行:

service apache2 reload
service apache2 restart

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

答案 6 :(得分:1)

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

事实证明我试图在不使用sudo的情况下重启apache ...

service apache2 restart

使用

sudo service apache2 restart

答案 7 :(得分:1)

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

答案 8 :(得分:0)

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

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

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

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

答案 9 :(得分:0)

对我来说,重新启动apache后开始工作:sudo service apache2 reload。并在http:/ test。

上按ctrl + F5

答案 10 :(得分: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 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

答案 11 :(得分:0)

我在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>

答案 12 :(得分:0)

您需要用您的网站替换默认的html文件(/var/www/html/index.html)或将文件重命名为index.html.bak。出于某种原因,除非更改,否则apache默认为index.html。