当前位置: 首页>>技术教程>>正文


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

, ,

问题描述

我尝试设置除默认localhost之外的虚拟主机。每当我尝试调用虚拟主机http://test时,我都会获得默认的Apache2索引文件,该文件位于http://localhost的目录中。此外,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>

最佳答案

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

sudo a2dissite 000-default.conf

可能的扩展:

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

[…] If the main server has no ServerName at this point, then the hostname of the machine that httpd is running on is used instead.

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

结果,即使配置了另一个user-created虚拟主机,且该虚拟主机具有与计算机主机名相同的ServerName,Apache仍从默认虚拟主机(000-default.conf)中选择并提供服务。

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

次佳答案

长话短说:使用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进行调用很有帮助。这是错误吗?

第三种答案

只是指出这一点对于有经验的用户可能是显而易见的,但是如果您是初学者,则不是很多。

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

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

第四种答案

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

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”

您会注意到,我没有像典型IP地址那样的xxx.xx.xx.xx:80,而是有了一些FQDN,例如“ ip-xxx-xx-xx-xx.eu-west-2.compute.internal:80”,我使用的是AWS Elastic IP为我的Amazon EC2 Web服务器设置固定IP。

4.检查您的virtual-hosts .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,因此它永远不匹配!尤里卡!

解决方案:在VirtualHost标记中添加*:80,使其看起来像这样:

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

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

PS。请记住,将日志放回警告而不是调试!

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/7886.html,未经允许,请勿转载。