无法使默认虚拟主机正常工作

无法使默认虚拟主机正常工作

我正在配置一个 apache 服务器来支持几个具有不同子域的虚拟主机。情况:

目前,有 4 个子域名指向同一 IP:

srv.example.com
svn.example.com
mail.example.com
mysql.example.com

稍后将使用其他名称扩展列表。第一个,应使用类似以下内容加载默认虚拟主机欢迎页面。第二个用于为 svn repos 提供服务的 vhost,第三个用于 webmail 客户端,最后一个用于 phpmyadmin。

接下来我启用了 4 个站点:

000-default.conf -> ../sites-available/000-default.conf
010-svn.conf -> ../sites-available/010-svn.conf
020-roundcube.conf -> ../sites-available/020-roundcube.conf
090-phpmyadmin.conf -> ../sites-available/090-phpmyadmin.conf

第一个是默认的 apache2 配置:

<VirtualHost *:80>
  ServerAdmin webmaster@localhost
  DocumentRoot /var/www/html
  ErrorLog ${APACHE_LOG_DIR}/error.log
  CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

二、svn repos主机配置:

<VirtualHost 192.168.22.11:38443>
  ServerName svn.example.com
  <Location />
    ... SVN stuff ...
  </Location>
  ... SSL stuff ...
</VirtualHost>

Webmail 虚拟主机:

<VirtualHost *:443>
  ServerName mail.example.com
  DocumentRoot /home/webapps/roundcubemail-1.1.2

  ... SSL stuff ...

  <Directory "/home/webapps/roundcubemail-1.1.2">
    Order allow,deny
    Allow from all
    Require all granted
  </Directory>
</VirtualHost>

<VirtualHost *:80>
  ServerName mail.example.com
  Redirect / https://mail.example.com/
</VirtualHost>

和 phpmyadmin:

<VirtualHost 192.168.22.11:80>
  ServerName mysql.example.com
  DocumentRoot /usr/share/phpmyadmin
  <Directory />
    Options FollowSymLinks
    AllowOverride None
  </Directory>
  LogLevel notice
  CustomLog /var/log/apache2/access.log combined
  ErrorLog /var/log/apache2/error.log
  ServerSignature On 
</VirtualHost>

因此,再次强调,它应该是:

http://srv.example.com => land on 'default' vhost (000-def...)
http://svn.example.com => land on 'default' as SVN is served on 38443 port
http://svn.example.com:38443 => land on svn vhost
http://mail.example.com => redirect to https://mail.example.com
https://mail.example.com => land on webmail vhost
http://mysql.example.com => land on phpmyadmin vhost

但是,它不能像这样工作:

http://srv.example.com => loads phpmyadmin vhost
http://svn.example.com => loads phpmyadmin vhost too
http://svn.example.com:38443 => lands on svn vhost
http://mail.example.com => loads phpmyadmin vhost
https://mail.example.com => land on webmail vhost
http://mysql.example.com => land on phpmyadmin vhost

因此,apache2 通常将最后一个 vhost (mysql) 作为默认主机。但由于某种原因,邮件重定向不起作用。

我不知道哪里出了问题,因为我用谷歌搜索了一些,它应该可以工作,当子域名不适合任何定义的虚拟主机时,它应该加载第一个(按照符号链接的顺序为 000-default) - 那么为什么它会加载最后一个?

编辑 2015.11.09

问题似乎出在 phpmyadmin 配置中,当我禁用它的 vhost 时,一切都按预期工作,而当我再次启用它时,它又变得不好了。

不知道为什么会发生这种情况...

答案1

如果默认虚拟主机中没有服务器名,您将收到一条警告,提示 Apache 无法在每次重新启动或重新加载时可靠地确定主机名。

更改配置后,您是否重新启动或重新加载了 Apache?

服务器是否实际在 192.168.22.11 上运行,以及在测试时如何将该 IP 号码分配给主机名?

您是否将 /etc/hosts 文件用于此目的?

确保 hosts 文件行不是这样的:

127.0.0.1 srv.example.com svn.example.com mysql.example.com

你有:

192.168.22.11 srv.example.com svn.example.com mysql.example.com

或者将 vhost 从 192.168.22.11:80 更改为 *:80

答案2

好吧,经过大量的盲测之后,我仍然不确定问题到底是什么,但是我通过更改 phpmyadmin 配置使其不绑定到特定界面而是绑定到所有界面,从而使它按我想要的方式工作。

现在我已<VirtualHost *:80>改为<VirtualHost 192.168.22.11:80>。该更改“修复”了 apache 在选择正确虚拟主机方面的行为,但导致 phpmyadmin 在所有子网上都可用 - 不太好。

然后我认为将 vhost 绑定到一个子网以防止其他子网的用户访问它并不是最好的主意,也许最好正确设置 apache 权限?考虑到这一点,几分钟后,我将以下内容添加到 vhost conf 中:

<Directory "/www/webapps/adminer">
    Require ip 192.168.22.0/25
</Directory>

(是的,与此同时我把 phpmyadmin 换成了 adminer)

现在一切都按预期运行。我现在唯一想的是,也许让用户看到没有这样的事(404)而不是有东西,但你无法访问它(禁止)但我猜这是另一个问题的主题......

答案3

有几件事让我印象深刻:

应该是这样吗<VirtualHost 192.168.22.11:38443>

不是<VirtualHost *:38443>

并且您的默认设置中也没有ServerName。我一般会有一个。

- - - 编辑 - - -

如果您尝试限制谁可以查看该网站那么您需要在 VirtualHost 声明中设置有关该规则:

<Location />
    Order Allow,Deny
    Allow from 123.123.123.0/24
</Location>

答案4

我观察到了原始问题中提到的不当行为:一旦我启用 PhpMyAdmin VirtualHost,它就会覆盖(劫持)我的默认 VirtualHost。

默认 VirtualHost 通常是根据 Apache 配置中的 VirtualHost 条目顺序推断出来的。第一个 VirtualHost 将成为默认 VirtualHost。这就是为什么在多文件配置中(其中 apache.conf 仅包含所有 site.conf 文件),默认 VirtualHost 的文件名通常称为 000-default 或类似的名称。

就我而言,最初我将所有 VirtualHost 条目声明为

<VirtualHost *:80>
     ServerName ...

并且默认 VirtualHost 会被正确推断。在为 PhpMyAdmin 添加 VirtualHost 后,将成为默认设置。

而且,与公认的解决方案相反,我不得不重新编写 VirtualHost 声明以包含特定的 IP 地址。这就是“配置中出现的第一个 VirtualHost”再次占据主导地位的地方。我不得不用 IP 地址声明它们:默认 VirtualHost、PhpMyAdmin VirtualHost 以及我拥有的所有其他 VirtualHost。

Apache httpd 版本:2.4.10-10+deb8u16

似乎 mod_php 作为 httpd 的全局扩展加载,并且优先于股票 httpd 部分的标准“默认选择”......

相关内容