在独立文件内定义 Apache 的虚拟主机
Contents
1. 引言
正因为 Apache 设置设的文件不小,假若每台虚拟主机的容器(定义)都放置在独立文件内,寻找及更改它们的设置便容易得多了。
严格来说上游文件并不推荐这样做,但这是个常见的人手改动令系统更易管理。
你应该记录系统上的一切人手改动作为日后参考之用。
虚拟主机的源文件可以放置在数个不同位置。这个复杂议题备有多个不同的见解,而且不会在这份文件内全面探讨。
2. 一般做法:conf.d/
放置独立虚拟主机配置文件的最常用位置是 /etc/httpd/conf.d/。只要配置文件的名称与现有或将来模块的配置文件没有冲突,它们的名称可以用来反映所涉及的网站。相关的内容可以放置在 /var/www/ 或 /var/www/html/ 的子目录内,例如 /var/www/example.com/ 或 /var/www/html/example.com/。
这样做的好处就是上层的目录已经获创建,而 SELinux 可以通过承继规则来处理访问权限。当然,组件系统亦运用这个特性,例如通过组件安装 php,php.conf 这个文件便会被放在设置目录内,而当网页服务器重新引导时,PHP 编译的页面便会「运作自如」。
虽然将一个虚拟主机配置文件放在一个满载 php.conf 及 mailman.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
<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 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
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
多谢 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