📄 mass.html
字号:
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<meta name="keywords" content="Apache, 中文, 手册, 中文版, 中文手册, 中文版手册, 参考手册, 中文参考手册, 金步国" />
<meta name="description" content="Apache 2.2 中文版参考手册" />
<meta name="author" content="金步国" />
<link href="../style/css/manual-zip.css" rel="stylesheet" media="all" type="text/css" title="Main stylesheet" />
<link href="../style/css/manual-zip-100pc.css" rel="alternate stylesheet" media="all" type="text/css" title="No Sidebar - Default font size" />
<link href="../style/css/manual-print.css" rel="stylesheet" media="print" type="text/css" />
<title>大批量虚拟主机的动态配置 - Apache 2.2 中文版参考手册</title>
</head>
<body id="manual-page"><div id="page-header">
<p class="menu"><a href="../mod/index.html">模块索引</a> | <a href="../mod/directives.html">指令索引</a> | <a href="../faq/index.html">常见问题</a> | <a href="../glossary.html">词汇表</a> | <a href="../sitemap.html">站点导航</a></p><p class="apache">Apache HTTP Server 版本2.2</p><img alt="" src="../images/feather.gif" /></div>
<div class="up"><a href="./index.html"><img title="<-" alt="<-" src="../images/left.gif" /></a></div>
<div id="path"><a href="http://www.apache.org/">Apache</a> > <a href="http://httpd.apache.org/">HTTP Server</a> > <a href="http://httpd.apache.org/docs/">文档</a> > <a href="../index.html">版本2.2</a> > <a href="./index.html">虚拟主机</a></div>
<div id="translation-info"> <a href="../translator_announcement.html#thanks">致谢</a> | <a href="../translator_announcement.html#announcement">译者声明</a> | 本篇译者:<a href="mailto:csfrank@citiz.net">金步国</a> | 本篇译稿最后更新:2006年1月18日 | <a href="../translator_announcement.html#last_new">获取最新版本</a></div>
<div id="page-content"><div id="preamble"><h1>大批量虚拟主机的动态配置</h1>
<p>本文档描述如何使用Apache有效的架设大批量虚拟主机。</p>
</div>
<div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="section">
<h2><a name="motivation" id="motivation">动机</a></h2>
<p>如果你的配置文件<code>httpd.conf</code>中包含类似下面的许多<code><VirtualHost></code>段,并且其中的内容都大致相同的话,你应该会对这里所讲的技术感兴趣。比如:</p>
<div class="example"><p><code>
NameVirtualHost 111.22.33.44<br />
<VirtualHost 111.22.33.44><br />
<span class="indent">
ServerName www.customer-1.com<br />
DocumentRoot /www/hosts/www.customer-1.com/docs<br />
ScriptAlias /cgi-bin/ /www/hosts/www.customer-1.com/cgi-bin<br />
</span>
</VirtualHost><br />
<VirtualHost 111.22.33.44><br />
<span class="indent">
ServerName www.customer-2.com<br />
DocumentRoot /www/hosts/www.customer-2.com/docs<br />
ScriptAlias /cgi-bin/ /www/hosts/www.customer-2.com/cgi-bin<br />
</span>
</VirtualHost><br />
# 等 等 等 。。。 <br />
<VirtualHost 111.22.33.44><br />
<span class="indent">
ServerName www.customer-N.com<br />
DocumentRoot /www/hosts/www.customer-N.com/docs<br />
ScriptAlias /cgi-bin/ /www/hosts/www.customer-N.com/cgi-bin<br />
</span>
</VirtualHost>
</code></p></div>
<p>最基本的思想是用动态的机制来实现所有这些静态的<code><VirtualHost></code>配置段。这样做有许多优点:</p>
<ol>
<li>配置文件变小,使得Apache可以更快的启动,同时消耗更少的内存。</li>
<li>添加一个虚拟主机,应该只是简单的在文件系统中创建合适的目录,以及配置相关的DNS信息,且无需重新启动Apache 。</li>
</ol>
<p>主要的缺点是你无法针对每个虚拟主机使用不同的日志文件。然而,如果真的在配置有大量虚拟主机的服务器上记录不同的日志文件的话,很有可能会达到操作系统所允许的最大文件描述符的数量。更好的办法是把日志写到管道或者先入先出的栈,并启用其他的进程来分拣所得到的日志信息(同时也可以做一些历史纪录的统计等等)。</p>
</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="section">
<h2><a name="overview" id="overview">概述</a></h2>
<p>一个虚拟主机由两部分来定义:一个是它的IP地址,还有一个是HTTP的"<code>Host:</code>"请求头。动态大量虚拟主机的技术,是基于自动在所要返回的文件路径中插入相关信息的想法实现的。使用<code class="module"><a href="../mod/mod_vhost_alias.html">mod_vhost_alias</a></code>可以很容易的实现,但如果你的Apache版本低于1.3.6 ,则你必须使用<code class="module"><a href="../mod/mod_rewrite.html">mod_rewrite</a></code> 。两者在默认情况下都不启用;要使用他们,必须在配置和编译Apache的阶段启用。</p>
<p>我们需要做很多"伪装",才能使动态虚拟主机看起来像普通主机。最重要的一点是Apache使用虚拟主机名(ServerName)来生成自引用(self-referential)URL等信息。这是用<code>ServerName</code>指令来配置的,并且可以通过环境变量<code>SERVER_NAME</code>传递给CGI脚本。运行时实际使用的值是由<code class="directive"><a href="../mod/core.html#usecanonicalname">UseCanonicalName</a></code>指令的设置来控制的。当 <code>UseCanonicalName Off</code> 时,虚拟主机名(ServerName)取自请求中的"<code>Host:</code>"头。当 <code>UseCanonicalName DNS</code> 时,则通过DNS反解析虚拟主机的IP地址得到主机名。以前的做法是基于名称的动态虚拟主机,现在常用基于IP地址的虚拟主机。如果Apache无法判断虚拟主机名,则可能是没有"<code>Host:</code>"头或是DNS解析失败,这样种情况下,Apache将使用配置<code>ServerName</code>时所填写的主机名。</p>
<p>另一件需要"伪装"的事情是文档根目录(由<code>DocumentRoot</code>配置并可以通过<code>DOCUMENT_ROOT</code>环境变量为CGI脚本所使用)。在通常的配置方式下,这些设置信息由核心(core)模块在将URI映射到文件系统的时候使用,但是如果使用动态虚拟主机配置,这些信息将由另外一个使用不同于核心(core)模块将URI映射到文件系统的方式的模块(<code>mod_vhost_alias</code>或<code>mod_rewrite</code>)使用。这两个模块都不负责设置<code>DOCUMENT_ROOT</code>环境变量,所以如果CGI或SSI程序使用了<code>DOCUMENT_ROOT</code>环境变量,那么将得到错误的值。</p>
</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="section">
<h2><a name="simple" id="simple">简单的动态虚拟主机</a></h2>
<p>这是<code>httpd.conf</code>文件中,完成和上文<a href="#motivation">动机</a>部分所提到的虚拟主机一样效果的配置方法,但这里采用了<code>mod_vhost_alias</code>模块:</p>
<div class="example"><p><code>
# 从"Host:"头中取得主机名<br />
UseCanonicalName Off<br />
<br />
# 这种日志格式可以从第一个字段中提取出主机名<br />
LogFormat "%V %h %l %u %t \"%r\" %s %b" vcommon<br />
CustomLog logs/access_log vcommon<br />
<br />
# 在返回请求的文件名路径中包含主机名<br />
VirtualDocumentRoot /www/hosts/%0/docs<br />
VirtualScriptAlias /www/hosts/%0/cgi-bin
</code></p></div>
<p>将 <code>UseCanonicalName Off</code> 的配置改为 <code>UseCanonicalName DNS</code> 即可实现基于IP地址的虚拟主机。而在文件路径中所要插入的服务器名则通过虚拟主机的IP地址解析得到。</p>
</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="section">
<h2><a name="homepages" id="homepages">一个实际的个人主页系统</a></h2>
<p>这里对上面的系统作了一点调整,便可作为ISP的个人主页服务器。我们使用了略微复杂的方法,从主机名(ServerName)中提取子字符串,并插入到文件路径中。在这个例子中<code>www.user.isp.com</code>的文档将在<code>/home/user/</code>中定位。并对所有虚拟主机使用单个<code>cgi-bin</code>目录。</p>
<div class="example"><p><code>
# 所有之前的准备事项和上面一样,然后在文件路径中包含主机名<br />
VirtualDocumentRoot /www/hosts/%2/docs<br />
<br />
# 单个cgi-bin目录<br />
ScriptAlias /cgi-bin/ /www/std-cgi/<br />
</code></p></div>
<p>更复杂的关于<code>VirtualDocumentRoot</code>的设置,可以查阅<code class="module"><a href="../mod/mod_vhost_alias.html">mod_vhost_alias</a></code>文档。</p>
</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="section">
<h2><a name="combinations" id="combinations">在同一个服务器上架设多个主机的虚拟系统</a></h2>
<p>更复杂的设置,应该使用Apache的<code><VirtualHost></code>容器来管理各种虚拟主机配置的作用域。例如,你可以用一个IP地址来给个人主页客户使用,同时用下面的配置提供给商业客户使用。自然的,这两者通过运用<code><VirtualHost></code>结合到一起。</p>
<div class="example"><p><code>
UseCanonicalName Off<br />
<br />
LogFormat "%V %h %l %u %t \"%r\" %s %b" vcommon<br />
<br />
<Directory /www/commercial><br />
<span class="indent">
Options FollowSymLinks<br />
AllowOverride All<br />
</span>
</Directory><br />
<br />
<Directory /www/homepages><br />
<span class="indent">
Options FollowSymLinks<br />
AllowOverride None<br />
</span>
</Directory><br />
<br />
<VirtualHost 111.22.33.44><br />
<span class="indent">
ServerName www.commercial.isp.com<br />
<br />
CustomLog logs/access_log.commercial vcommon<br />
<br />
VirtualDocumentRoot /www/commercial/%0/docs<br />
VirtualScriptAlias /www/commercial/%0/cgi-bin<br />
</span>
</VirtualHost><br />
<br />
<VirtualHost 111.22.33.45><br />
<span class="indent">
ServerName www.homepages.isp.com<br />
<br />
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -