VirtualHost 始终在 Ubuntu 14.04 上使用 Apache 返回默认主机
Posted
技术标签:
【中文标题】VirtualHost 始终在 Ubuntu 14.04 上使用 Apache 返回默认主机【英文标题】:VirtualHost always returns default host with Apache on Ubuntu 14.04 【发布时间】:2014-07-05 22:56:59 【问题描述】:我尝试在默认的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>
【问题讨论】:
所以你已经做了a2ensite test
?
是的,当然。抱歉,忘记了。
您的 vHost 文件和主机文件对我来说看起来不错。您在进行 a2ensite test 时是否获得了 apache 默认页面?你能从日志中找到任何东西吗?
日志中没有任何内容。但我想通了。看我自己的答案。谢谢。
【参考方案1】:
我遇到了这个问题,结果我不得不禁用默认虚拟主机。
sudo a2dissite 000-default.conf
可能的扩展:
根据apache文档An In-Depth Discussion of Virtual Host Matching:
[...] 如果此时主服务器没有 ServerName,则使用运行 httpd 的机器的主机名。
这意味着如果默认 vhost(通常为 000-default.conf)没有设置 ServerName - 这是默认设置 - Apache 将回退到操作系统的主机名。
因此,Apache 会从默认虚拟主机 (000-default.conf) 中选择并提供服务,即使配置了另一个用户创建的虚拟主机,其服务器名称与机器的主机名相同。
原因是 Apache 按文件名的字母顺序对虚拟主机进行排序,并选择与请求的 HTTP 主机标头匹配的第一个虚拟主机配置。因此,在用户定义的虚拟主机之前检查 000-default.conf,因为它们通常不以 000-
为前缀。
【讨论】:
这对我有用。但我讨厌没有解释的解决方案。为什么 Apache 不跟随我的虚拟主机而是加载默认的虚拟主机?完全没有意义。 这是正确的解决方案。请添加一些有关它的详细信息。 通常 Ubuntu 上的 apache2 为默认站点设置了虚拟主机,即当 apache 找不到附加到另一个虚拟主机的更具体的域 (TLD) 时。命令a2dissite SITE_NAME
是一个用于在 Ubuntu/Debian 系统上禁用任何已启用站点的脚本。相反的命令是a2ensite
,用于启用禁用的站点。这些命令只能以特权权限执行,即sudo
。它也适用于 Ubuntu 当前的 16.04LTS 和 17.04。
为我工作。我认为 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
:WORKING
所以,找出差异!关键是我认为它首先会正确重新加载。日志文件中也没有条目。使用 sudo
调用它会有所帮助。这是一个错误吗?
【讨论】:
没有 sudo,apache 不会抛出异常。所以你不知道你是否正确地重新加载了你的conf。谢谢。 清除浏览器缓存。我被发送到我的默认站点,该站点通过那里的 .htaccess 重定向了我。这意味着,即使我确实使用了 sudo,我的浏览器仍然决定重定向我。清除缓存修复它。 谢谢你,第二次没有抛出错误(!)【参考方案3】:只是指出这一点对于有经验的用户来说可能是显而易见的,但如果你是第一个计时器,那就不是那么明显了。
确保您在/sites-enabled
中使用的配置以.conf
结尾,正如您的apache2.conf
中所预期的那样
这是我的问题,它解决了。
【讨论】:
不知道我查看了我的代码有多久,并没有注意到我命名良好的文件是域,而不是 domain.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:80 我有一些 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 为来自 127.0.0.1 或 11.22.33.44 端口 80 上的请求提供服务。但是服务器永远不会看到这些 IP,因为它得到了那个奇怪的 FQDN,所以它永远不会火柴!尤里卡!
解决方案: 将 *:80 添加到 VirtualHost 标记,使其如下所示:
<VirtualHost 127.0.0.1:80 11.22.33.44:80 *:80>
并重新启动 apache。我希望这有帮助。可能还有其他原因,但如果这是您的问题的原因,那么是时候坐下来,喝杯茶放松一下了!如果没有,那么我希望您能找到解决方案。
PS。记得把你的日志放回去警告而不是调试!
【讨论】:
使用<VirtualHost mysite.com:80 *:80>
并重新加载 Apache 就像一个魅力。谢谢楼主!
如果你输入*:80
,其他的都是多余的。 <VirtualHost *:80>
就足够了。
对我来说,问题出在 VirtualHost 标头上,像您指出的那样修复了它,现在就像一个魅力。谢谢。【参考方案5】:
我浏览了所有这些解决方案,但都没有奏效。然后,我决定回去检查 apache2.conf 文件。我发现默认情况下,包含“启用站点”的 conf 文件的行被注释掉了。通过取消注释该行并重新启动 apache,它解决了我的问题(它接近文件末尾):
# Include the virtual host configurations:
IncludeOptional sites-enabled/*.conf
【讨论】:
【参考方案6】:可能虚拟主机的 .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)
因此您的虚拟主机域指向默认配置(http 或 https)。
解决方案是在default-ssl.conf
和000-default.conf
文件中添加ServerName localhost
指令。
Apache 不知道您的默认站点的名称是谁,它需要随机解析 127.0.0.1。
设置ServerName后,必须运行:
service apache2 reload
service apache2 restart
如果您再次运行apache2ctl -S
,您必须看到默认服务器的正确匹配。
【讨论】:
【参考方案7】:它也让我发疯了,我一遍又一遍地检查我的 .conf 文件,所有的定义都绝对正确。我最终在这篇文章中尝试了 a2ensite 和 a2dissite 命令作为 sudoer,重新启动 apache,仍然登陆默认的 apache 欢迎页面,就好像 apache 永远不会禁用默认站点或使用我的新虚拟主机一样。
原来我试图在不使用 sudo 的情况下重新启动 apache...
service apache2 restart
使用
sudo service apache2 restart
【讨论】:
【参考方案8】:如果你保持默认 *:80; *.443 确保它在底部 - 所以将 000-default 重命名为 zzz-default
【讨论】:
【参考方案9】:我看到在 /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
【讨论】:
【参考方案10】:这不止一次地咬了我;有时我会启用 sudo
- 有时我不会。
Ubuntu 14.04 似乎以任何方式显示相同的消息。当以每小时 100 英里的速度行驶时,有时您会错过一两个sudo
。
新网站默认返回错误目录的症状是我唯一的线索,即启用从未发生过。我会说这是一个错误。
它至少应该在命令未执行时发出警告!!!
【讨论】:
顺便说一句——同样的“错误”发生在 a2dissite 上——Ubuntu 显示它删除了符号链接——但实际上并没有。【参考方案11】:对我来说,它在重新启动 apache 后开始工作:sudo service apache2 reload。然后在 http://test 上按 ctrl + F5。
【讨论】:
【参考方案12】:我在 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>
【讨论】:
以上是关于VirtualHost 始终在 Ubuntu 14.04 上使用 Apache 返回默认主机的主要内容,如果未能解决你的问题,请参考以下文章
VirtualHost 文件都指向 Ubuntu 12.04 中的第一个 VirtualHost [关闭]
在 laravel @Apache2 Server Ubuntu 14.04 LTS 中将 Root 设置为公用文件夹
Apache 2.4 VirtualHost Ubuntu 只允许访问本地网络