在独立文件内定义 Apache 的虚拟主机

1. 引言

正因为 Apache 设置设的文件不小,假若每台虚拟主机的容器(定义)都放置在独立文件内,寻找及更改它们的设置便容易得多了。

<!> 严格来说上游文件并不推荐这样做,但这是个常见的人手改动令系统更易管理。

<!> 你应该记录系统上的一切人手改动作为日后参考之用。

<!> 虚拟主机的源文件可以放置在数个不同位置。这个复杂议题备有多个不同的见解,而且不会在这份文件内全面探讨。

2. 一般做法:conf.d/

放置独立虚拟主机配置文件的最常用位置是 /etc/httpd/conf.d/。只要配置文件的名称与现有或将来模块的配置文件没有冲突,它们的名称可以用来反映所涉及的网站。相关的内容可以放置在 /var/www//var/www/html/ 的子目录内,例如 /var/www/example.com//var/www/html/example.com/

这样做的好处就是上层的目录已经获创建,而 SELinux 可以通过承继规则来处理访问权限。当然,组件系统亦运用这个特性,例如通过组件安装 phpphp.conf 这个文件便会被放在设置目录内,而当网页服务器重新引导时,PHP 编译的页面便会「运作自如」。

虽然将一个虚拟主机配置文件放在一个满载 php.confmailman.conf 等与虚拟主机无关的文件的目录内,起初看似不洽当,但是细阅文件时,我们在 Apache HTTP Server Version 2.2 - Configuration Sections 内会看见:「多数容器都按每个要求重新运算。」

因此,不论虚拟主机的指令是在概述文件内任何一个位置,又或者是在一个满载配置文件的目录内,Apache 永远先应用所有非虚拟主机的指令,然后才应用虚拟主机的指令。

这方面在系统管理上已成定局,甚至乎上游的最新文件在 CentOS 5 系列内并不包含「系统管理指南」。在 CentOS 4 的系统管理指南中,Chapter 24. Apache HTTP Server Configuration 对这方面有更深入的讲解。

3. 虚拟主机档

你可以直接将虚拟主机容器档放在设置目录内,或者采用连结。假如用连结的话,请确定实际案档的 SELinux 属性已被更新 。

3.1. 样例

每个文件都应该含有针对该主机的设置项目。以下是一个 example.conf 样例档……

# 文件:/etc/http/conf.d/example.conf
# 虚拟主机:example.org *.example.org
<VirtualHost *:80>
  ServerName example.org
  ServerAlias *.example.org
  ServerAdmin webmaster@example.org
  ErrorLog /var/log/httpd/example.err
  CustomLog /var/log/httpd/example.log combined
  DocumentRoot /var/www/example.org
  <Directory "/var/www/example.org">
    Order allow,deny
    Allow from all
  </Directory>
</VirtualHost>

当然,一个虚拟配置文件可以通过单一目录树来对应多于一个 URL 或 DNS 结果。

[userid@webhost conf.d]$ cat example.conf 
### 这里处理两个网域的虚拟网站:
### example.com 及 example.org
###
### .COM 网域
<VirtualHost x.x.x.x >
        ServerAdmin webmaster@example.com
        DocumentRoot /var/www/html/example.com/public_html/
        ServerName example.com
        ServerAlias www.example.com
        ErrorLog logs/example.com-error_log
        TransferLog logs/example.com-access_log
        AccessFileName .htaccess
</VirtualHost>

### .ORG 网域
<VirtualHost x.x.x.x >
        ServerAdmin webmaster@example.org
        DocumentRoot /var/www/html/example.org/public_html/
        ServerName example.org
        ServerAlias www.example.org
        ErrorLog logs/example.org-error_log
        TransferLog logs/example.org-access_log
        AccessFileName .htaccess
</VirtualHost>

这个文件设置两个网域,一个是 .com,另一个是 .org。当浏览器的 URL 指向这些网域或它们的 www 子域时,同样的内容便会被返回,而这是一般想要的结果,但它当然亦会按著低层目录树里的内容,为这两个不同的首层网域返回不同的内容。

4. 输入虚拟主机

有些时候你也许会想停用一台虚拟主机。由于 /etc/httpd/conf/httpd.conf 内的 include 词句指定 *.conf,你可以通过更改配置文件的名称来「隐藏」一台虚拟主机。

4.1. 停用虚拟主机

你可以通过把虚拟主机档的名称改至不依从 *.conf 格式来停用该主机。加入 disabled 扩展名是其中一个方法。

mv --verbose /etc/httpd/conf.d/example.conf /etc/httpd/conf.d/example.conf.disabled

假若你要减少所打的字,较短的指令是:

mv -v /etc/httpd/conf.d/example.conf{,_}

4.2. 启用虚拟主机

你可以通过去除额外的扩展名来重新启用主机。

要删除 disabled 这个旗号:

mv --verbose /etc/httpd/conf.d/example.conf.disabled /etc/httpd/conf.d/example.conf

较短的版本是:

mv -v /etc/httpd/conf.d/example.conf{_,}

<!> 利用这个方法来启用或停用一个虚拟主机,网页服务器必须重新引导才会生效。

5. 重新引导 Apache

要让你的改动生效,请重新引导 Apache。利用 graceful 这个选项会确保所有进序能完成伺服现有的页面,减低用户浏览时被中断的机会。

service httpd graceful


{i} Filipe,多请你推荐使用 graceful,及提供指引关于 Apache 如何编译分段。

6. 另类方法:vhost.d/

6.1. 声明

<!> 这部份所介绍的另类方法超越了很多 CentOS 系统管理员的严格、最基本设置。正如任何对 CentOS 系统所作出的人手改动,发行版本更新时也许会导致系统不能运作。

另一个放置虚拟主机容器档的地方就是一个新目录,例如 /etc/httpd/vhost.d/,然后在 conf.d/ 内加入一个 vhost.conf 档来告诉 apache 它们的位置。这样做会把虚拟主机容器档与模块配置文件分割开来。此做法让你更容易地备份虚拟主机设置上的改动,并且去除不同类型的文件在文件名上有冲突的可能性。

6.2. 创建目录

创建一个与 /etc/httpd/conf.d/ 有相同 SELinux 属性的目录……

mkdir --context=system_u:object_r:httpd_config_t /etc/httpd/vhost.d

6.3. 更新 SELinux 属性

检查 SELinux 属性的方法很简单……

ls -lZ /etc/httpd

它应该返回类似以下的东西……

drwxr-xr-x  root root system_u:object_r:httpd_config_t conf
drwxr-xr-x  root root system_u:object_r:httpd_config_t conf.d
lrwxrwxrwx  root root system_u:object_r:httpd_log_t    logs -> ../../var/log/httpd
lrwxrwxrwx  root root system_u:object_r:httpd_modules_t modules -> ../../usr/lib/httpd/modules
lrwxrwxrwx  root root system_u:object_r:httpd_config_t run -> ../../var/run
drwxr-xr-x  root root system_u:object_r:httpd_config_t vhost.d

由于 /etc/httpd/vhost.d/ 位于 /etc/httpd/ 之内,它应该会承继所有关于 /etc/httpd/ 的原则的改动,并能过渡文件系统的重新标签。

6.4. 创建新的虚拟主机配置文件

conf.d/ 内置立一个新的配置文件,好让 Apache 知道虚拟主机配置文件的位置。

echo "Include vhost.d/*.conf" >>/etc/httpd/conf.d/vhost.conf

更改安全属性,好让 Apache 能读入它

chcon --reference /etc/httpd/conf.d/README /etc/httpd/conf.d/vhost.conf


{i} 多谢 BrianMathis 推荐采用 conf.d/vhost.conf

7. 另类方法:文件前缀词

对某些人来说,为文件加入 vhost- 等前缀词也许会更易明、令首层网域更显著、并可将使用中及停用了的虚拟主机集合起来。

<!> 这个方法必须在 /etc/httpd/conf/httpd.conf 内加入额外的 include 词句才能生效。

<!> 此方法可与在 conf.d/ 创建新配置文件的方法结合,来避免更改发行版本的 httpd.conf。

7.1. include 词句

请不要输入 .conf 结尾的文件,改而输入以 vhost- 起首的文件:

echo "Include conf.d/vhost-*" >>/etc/httpd/conf/httpd.conf

又或者在利用 vhost.d/ 这个方法时:

echo "Include vhost.d/vhost-*" >>/etc/httpd/conf/httpd.conf

7.2. 停用虚拟主机

在一个虚拟主机档的名称起首加上 _ 来防止它被输入:

mv -v /etc/httpd/conf.d/{,_}vhost-example.org

又或者在利用 vhost.d/ 这个方法时:

mv -v /etc/httpd/vhost.d/{,_}vhost-example.org

7.3. 启用虚拟主机

删除一个虚拟主机文件名起首的 _ 来容让它被输入:

mv -v /etc/httpd/conf.d/{_,}vhost-example.org

又或者在利用 vhost.d/ 这个方法时:

mv -v /etc/httpd/vhost.d/{_,}vhost-example.org

<!> 利用这个方法来启用或停用一个虚拟主机,网页服务器必须重新引导才会生效。


这页的英文版本由 Ed Heron 创建。

Translation of revision 20

zh/TipsAndTricks/ApacheVhostDir (last edited 2012-07-23 08:32:48 by TimothyLee)