如何使用 Ubuntu 12.04 设置“基于名称”的虚拟主机?

如何使用 Ubuntu 12.04 设置“基于名称”的虚拟主机?

如何使用 Ubuntu 12.04 设置“基于名称”的虚拟主机?

我已遵循https://help.ubuntu.com/12.04/serverguide/httpd.html#http-configuration

我已完成以下操作...

  1. cp default newsite
  2. 将 newsite 中的“/var/www”替换为“/var/www/newsite”
  3. 将“ServerName newsite.example.com”添加到 newsite

经过一番研究,我发现了一篇博客文章,其中指出我需要使用 禁用默认站点a2dissite default。我这样做之后,它就起作用了。对吗?Ubuntu 服务器指南中从未提到这一点。该指南还包括这一行...

“默认虚拟主机没有指定 ServerName 指令,因此它将响应所有与另一个虚拟主机中的 ServerName 指令不匹配的请求。”

这似乎意味着默认站点和其他站点可以共存。

我正在运行全新安装的 12.04 Server,每次进行调整时都会重新加载 apache 配置。

总之...在 /etc/apache2/sites-available 下添加新文件(添加了 ServerName 指令的“default”文件的更改副本)并在 /etc/apache2/sites-enabled 下添加相应的符号链接后,是否需要禁用或重命名默认站点符号链接才能使新站点正常运行?文档和下面给出的一个答案似乎推断没有必要这样做,但如果是的话,我做错了什么?使用下面的配置,当尝试访问 newsite.example.com 时,我得到了默认站点。

/etc/apache2/sites-available$ cat default

<VirtualHost *:80>
        ServerAdmin webmaster@localhost

        DocumentRoot /var/www
        <Directory />
                Options FollowSymLinks
                AllowOverride None
        </Directory>
        <Directory /var/www/>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride None
                Order allow,deny
                allow from all
        </Directory>

        ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
        <Directory "/usr/lib/cgi-bin">
                AllowOverride None
                Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
                Order allow,deny
                Allow from all
        </Directory>

        ErrorLog ${APACHE_LOG_DIR}/error.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

        CustomLog ${APACHE_LOG_DIR}/access.log combined

    Alias /doc/ "/usr/share/doc/"
    <Directory "/usr/share/doc/">
        Options Indexes MultiViews FollowSymLinks
        AllowOverride None
        Order deny,allow
        Deny from all
        Allow from 127.0.0.0/255.0.0.0 ::1/128
    </Directory>

</VirtualHost>

/etc/apache2/sites-available$ cat newsite

<VirtualHost *:80>

        DocumentRoot /var/www/newsite
        ServerName newsite.example.com
        <Directory />
                Options FollowSymLinks
                AllowOverride None
        </Directory>
        <Directory /var/www/newsite/>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride None
                Order allow,deny
                allow from all
        </Directory>

        ErrorLog ${APACHE_LOG_DIR}/error.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

        CustomLog ${APACHE_LOG_DIR}/access.log combined

</VirtualHost>

/etc/apache2/sites-enabled# ls -l

root@sandbox:/etc/apache2/sites-enabled# ls -l
total 0
lrwxrwxrwx 1 root root 26 Mar 18 09:56 000-default -> ../sites-available/default
lrwxrwxrwx 1 root root 26 Mar  7 13:36 newsite -> ../sites-available/newsite

答案1

这更多的是一个 apache 配置问题,而不是 Ubuntu 问题。

是的,您可以在一台主机上运行多个虚拟服务器,每个虚拟服务器提供单独的内容,只要它们都映射(例如通过 DNS)到同一台服务器。

关于如何创建虚拟服务器的官方文档(版本 2.2,但此功能在各个版本之间并没有发生根本变化)可以在这里找到:

httpd.apache.org/docs/2.2/vhosts/

简短的回答是你需要:

  • 定义你的虚拟主机
  • 包括主机名和其所服务内容之间的一些映射

这是通过向某些 Apache 配置文件添加虚拟主机子句来实现的,例如/etc/apache2/sites-available/000-添加我的虚拟主机(专门设计的名称,按字母顺序排列在 000 默认名称之前)

NameVirtualHost *:80

<VirtualHost *:80>
    ServerName hostname1.mydomain.com
    DocumentRoot /home/www/hostname1
</VirtualHost>

<VirtualHost *:80>
    ServerName hostname2.mydomain.com
    DocumentRoot /home/www/hostname2
</VirtualHost>

请注意可能还需要添加来自/etc/apache2/sites-enabled//etc/apache2/站点可用如果您需要的站点已经在后者中,但不在前者中。

编辑1:
阅读手册页后a2分散体,很明显它所做的就是从中删除符号链接/etc/apache2/sites-enabled/. 关键是要理解命令这些配置的处理方式会影响最终结果。默认站点称为000-默认以便首先加载。如果它与所有网站匹配,即充当“其他”通配符,那么您将看不到其他网站。尝试重命名链接以获得更高的数字,例如999-默认因此它最后被加载(在其他站点匹配之后)。

编辑2: 对于您更新的问题:是的,需要重命名或删除默认站点,因为其配置文件名以“000”开头,使其首先加载,并由于通配符匹配而“接管”。我想文档可以在这一点上有所改进。

编辑3: 服务器名称出现的顺序、其重要性等信息记录在这个 Apache 页面在本节中基于名称的虚拟主机其中有一句话是这样的:

The first vhost on this list (the first vhost in the config file with the
specified IP address) has the highest priority and catches any request to
an unknown server name or a request without a Host: header field.

后来观察结果

... the ordering of name-based vhosts for a specific address set is significant.
The one name-based vhosts that comes first in the configuration file has the
highest priority for its corresponding address set.

答案2

我不知道为什么这经常被忽略,但站点配置文件中的重要关键字是“ServerAlias”,下面是一个包含该设置的示例配置文件

NameVirtualHost *:80

<VirtualHost *:80>
ServerName www.domain.tld
ServerAlias domain.tld *.domain.tld
DocumentRoot /www/domain
</VirtualHost>

<VirtualHost *:80>
ServerName www.otherdomain.tld
DocumentRoot /www/otherdomain
</VirtualHost>

答案3

使用 Ubuntu 托管 Apache,如果是基于 Debian 的系统,则 vhost 定义网站的定义在

/etc/apache2/sites-enabled/*.conf

其中 *conf 对应于

internal1.conf internal2.conf internal3.conf internal4.conf

每个站点的 vhost 定义如下

/etc/apache2/sites-enabled/internal1.example.conf

当你说

The default virtual host has no ServerName directive specified, so it will 

响应与另一个虚拟主机中的 ServerName 指令不匹配的所有请求。

这意味着

当 apache 从许多 vhost 提供网站服务时,它会按字母顺序读取文件名,这就是您提到的默认文件的编号为 000-default 的原因,因此主机的命名实际上很重要。

如果你的服务器收到对 something.something 的请求,它会按字母顺序读取 /etc/apache2/sites-enabled/ 中的 vhosts 文件

并且它在 sites-enabled 目录中找不到所需的配置文件,
它(apache2)将按字母顺序提供第一个 vhost 文件,因此一个好的技巧是始终使用默认的 000-default 文件,该文件可以是空白的,也可以是指向你想要的错误页面

现在您可以对 internal1.example.com 进行如下配置。

<virtualhost *:80>

    ServerAdmin webmaster@yoursite
    DocumentRoot /var/www/yoursite <--this is an important place should be there
    ServerName yourservername
    ServerAlias www.mydomain.com  <-- if you do not need this do not put it
    ErrorLog /var/logs/apache2/yoursite/error_log  <--logs can be customized 
    CustomLog /var/logs/apache2/yoursite/access_log common
</VirtualHost>

像上面的例子一样,您可以创建 internal2.example.conf、internal3.example.conf 等等,您不需要标签中的其他行,如果您在设置中不需要它们,您可以看看这个链接http://www.debian-administration.org/articles/18

答案4

@Corey

听起来你对 Apache 配置文件很熟悉。而且你知道在哪里可以找到文档。如果我理解正确的话,你不确定是否要使用 a2ensite 实用程序。根据a2ensite 的手册页:

a2ensite 是一个脚本,用于在 apache2 配置中启用指定站点(包含一个块)。它通过在 /etc/apache2/sites-enabled 中创建符号链接来实现此目的。同样,a2dis-site 通过删除这些符号链接来禁用站点。启用已启用的站点或禁用已禁用的站点并不是错误

您可能需要的任何帮助都可以在Apache 网站。这是非常简洁和枯燥的文档,但值得你花时间熟悉一下

相关内容