我尝试设置除默认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>
答案 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 localhost
和default-ssl.conf
文件中添加000-default.conf
指令。
Apache不知道谁是您的默认站点的名称,它需要一个随机值来解析127.0.0.1。
设置ServerName后,必须运行:
service apache2 reload
service apache2 restart
如果再次运行apache2ctl -S
,则必须看到默认服务器的正确匹配项。
答案 6 :(得分:1)
事实证明我试图在不使用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。