如何使用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

  ServerAdmin webmaster@localhost DocumentRoot /var/www  Options FollowSymLinks AllowOverride None   Options Indexes FollowSymLinks MultiViews AllowOverride None Order allow,deny allow from all  ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/  AllowOverride None Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch Order allow,deny Allow from all  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/"  Options Indexes MultiViews FollowSymLinks AllowOverride None Order deny,allow Deny from all Allow from 127.0.0.0/255.0.0.0 ::1/128   

/ etc / apache2 / sites-available $ cat newsite

  DocumentRoot /var/www/newsite ServerName newsite.example.com  Options FollowSymLinks AllowOverride None   Options Indexes FollowSymLinks MultiViews AllowOverride None Order allow,deny allow from all  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  

/ 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 

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

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

有关如何创建虚拟服务器的正式文档(版本2.2,但此function在版本之间没有根本改变)可以在这里找到:

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

简短的回答是你需要:

  • 定义您的虚拟主机
  • 在您的主机名和他们提供的内容之间包含一些映射

这是通过向某个apache配置文件添加虚拟主机子句来完成的,例如在/ etc / apache2 / sites-available / 000-add-my-virtual-hosts下 (专门设计为以字母顺序排列在000默认名称之前的名称)

 NameVirtualHost *:80  ServerName hostname1.mydomain.com DocumentRoot /home/www/hostname1   ServerName hostname2.mydomain.com DocumentRoot /home/www/hostname2  

请注意,如果您需要的站点已经在后者而不是前者,您可能还需要将/ etc / apache2 / sites-enabled /中的链接添加到/ etc / apache2 / sites-available

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

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

编辑3:服务器名称出现的顺序,重要性和更多内容记录在基于名称的vhost部分的这个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. 

在基于Debian的系统中使用Ubuntu托管Apache 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的原因,因此主机的命名实际上很重要。

如果一个请求来到你的服务器,它会在/ etc / apache2 / sites-enabled /中按字母顺序读取vhosts文件

并且它在启用站点的目录中找不到所需的配置文件
它(apache2)将按字母顺序提供第一个vhost文件,所以一个好的提示总是使用默认的000默认文件为空白或指向某个错误页面,如你所愿

现在,您可以为internal1.example.com进行如下配置

  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  

像上面的例子你可以制作internal2.example.conf,internal3.example.conf等你不需要在你的设置中需要其他行标签可能你可以看看这个链接http:/ /www.debian-administration.org/articles/18

我不知道为什么这经常被掩盖但是你的站点conf文件中的重要关键字是“ServerAlias”这里是一个带有该集合的示例conf文件

 NameVirtualHost *:80  ServerName www.domain.tld ServerAlias domain.tld *.domain.tld DocumentRoot /www/domain   ServerName www.otherdomain.tld DocumentRoot /www/otherdomain  

只是为了添加大卫的post,虽然我没有运行Ubuntu我正在运行Apache而且我注意到我可以使用完整的www.domain.com访问该网站,但是当我使用它而没有使用www时它会使用第一个网站定义(默认)。 请注意,DNS已正确设置,因为www设置为@(主机名),因此这是正确的。

因此,通过添加ServerAlias指令,它解决了这个问题。 我还在阅读文档,因此可能还有其他方法可以解决它。

我的配置文件是(部分):

ServerName http://www.domain.com

当我将其更改为(添加ServerAlias行)时:

ServerName domain.com ServerAlias http://www.domain.com

这解决了这个问题。 我打算测试David的配置选项,只使用* .domain.com,所以像ftp.domain.com或smtp.domain.com这样的东西都可以使用。

@Corey

听起来你有一个apache配置文件的句柄。 而且你知道在哪里寻找文档。 如果我理解正确您不确定使用a2ensite实用程序。 根据a2ensite的手册页:

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

您可以在Apache网站上找到您可能需要的任何帮助。 这是非常简洁和干燥的文档,但值得您花时间熟悉自己

我有这个问题并做了其他答案建议,我的情况是我想在我的开发环境中运行几个项目,并通过*.dev访问每个项目, 如此处所述

为了补充上面的答案,我的问题是foo.dev干扰bar.dev并添加以下部分解决了它

  #<---- you can filter the requests here ServerName foo.dev ServerAlias *.foo.dev DocumentRoot /home/dev/foo