问题描述
我尝试设置除默认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。请记住,将日志放回警告而不是调试!