<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>PT Ubuntu Blog &#187; www</title>
	<atom:link href="http://www.ptubuntu.com/tag/www/feed" rel="self" type="application/rss+xml" />
	<link>http://www.ptubuntu.com</link>
	<description>Ruijin to linux 生活中的每一点点滴滴……</description>
	<lastBuildDate>Mon, 30 Jan 2012 09:17:42 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Cherokee：最快的 Web 服务器？</title>
		<link>http://www.ptubuntu.com/2008/12/1220.html</link>
		<comments>http://www.ptubuntu.com/2008/12/1220.html#comments</comments>
		<pubDate>Wed, 24 Dec 2008 03:53:54 +0000</pubDate>
		<dc:creator>ptubuntu</dc:creator>
				<category><![CDATA[Apache&php&Ftp]]></category>
		<category><![CDATA[Linux Server]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[cherookee]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[www]]></category>

		<guid isPermaLink="false">http://www.ptubuntu.com/?p=1220</guid>
		<description><![CDATA[之前我也写过一篇cherokee,觉的看的很多.特别是老外.下在这个是我从网上找来的.有一些相关的配置跟我写的那个关不多.但是我先收集想来.并留着相关的连接在上面.如果你想看原文请点这里. 在汽车世界中，形象憨厚的大切（Grand Cherokee）肯定不是跑得最快的车。而在强手如林的 Web 服务器领域，新锐 Cherokee 却号称是当前最快的 Web 服务器，悍然超越了很多人认为还属于新事物的 Lighttpd、Nginx，性能高出作为行业标准的 Apache 一倍有余。 于是兄弟我顺便把最新版的 Nginx、Lighttpd、Apache 都拿来测了一圈。结果出人意料，Cherokee 牛皮吹爆，各项得分都低于 Nginx 和 Lighttpd。Lighttpd 1.4.20 最近修正了一大堆 bug，在多项测试中性能表现超越 Nginx，成为 Web 服务器领域暂时的王者（皇帝轮流做，这个位子不稳当）。真正令人震惊的是，Apache httpd 服务器颓势凸显，在多项测试中的性能表现真的只有上述三者一半左右，高并发（C=3000）状况下甚至根本无法完成测试。详见测试结果： &#60;!&#8211; TABLE,THEAD,TBODY,TFOOT,TR,TH,TD,P { font-family:”Arial”; font-size:x-small } &#8211;&#62; N=500000 C=20 C=100 C=1000 C=3000 Cherokee 0.11.5 1KB 40.93 40.84 47.99 67.65 10KB 46.76 45.28 55.25 67.17 100KB 136.64 134.42 150.52 [...]]]></description>
			<content:encoded><![CDATA[<div class="post-body entry-content"><img class="alignnone size-full wp-image-1221" title="cherokee001" src="http://www.ptubuntu.com/wp-content/uploads/2008/12/cherokee001.png" alt="cherokee001" width="400" height="94" /></div>
<div class="post-body entry-content">之前我也写过一篇cherokee,觉的看的很多.特别是老外.下在这个是我从网上找来的.有一些相关的配置跟我写的那个关不多.但是我先收集想来.并留着相关的连接在上面.如果你想看原文<a href="http://hutuworm.blogspot.com/2008/12/cherokee-web.html" target="_blank">请点这里</a>.</div>
<div class="post-body entry-content">在汽车世界中，形象憨厚的大切（Grand Cherokee）肯定不是跑得最快的车。而在强手如林的 Web 服务器领域，新锐 <a href="http://www.cherokee-project.com/">Cherokee</a> 却<a href="http://www.cherokee-project.com/benchmarks.html">号称</a>是当前最快的 Web  服务器，悍然超越了很多人认为还属于新事物的 Lighttpd、<a href="http://www.ptubuntu.com/tag/nginx" class="st_tag internal_tag" rel="tag" title="标签 Nginx 下的日志">Nginx</a>，性能高出作为行业标准的 <a href="http://www.ptubuntu.com/tag/apache" class="st_tag internal_tag" rel="tag" title="标签 apache 下的日志">Apache</a>  一倍有余。</div>
<div class="post-body entry-content"><span id="more-1220"></span></div>
<div class="post-body entry-content">
<p>于是兄弟我顺便把最新版的 Nginx、Lighttpd、Apache 都拿来测了一圈。结果出人意料，Cherokee  牛皮吹爆，各项得分都低于 Nginx 和 Lighttpd。Lighttpd 1.4.20 最近修正了一大堆 bug，在多项测试中性能表现超越 Nginx，成为  Web 服务器领域暂时的王者（皇帝轮流做，这个位子不稳当）。真正令人震惊的是，Apache httpd  服务器颓势凸显，在多项测试中的性能表现真的只有上述三者一半左右，高并发（C=3000）状况下甚至根本无法完成测试。详见测试结果：</p>
<p>&lt;!&#8211;    TABLE,THEAD,TBODY,TFOOT,TR,TH,TD,P { font-family:”Arial”; font-size:x-small }    &#8211;&gt;</p>
<table border="0" cellspacing="0" frame="void" rules="none">
<colgroup>
<col width="86"></col>
<col width="86"></col>
<col width="86"></col>
<col width="86"></col>
<col width="86"></col>
<col width="86"></col>
</colgroup>
<tbody>
<tr>
<td style="border: 1px solid #000000;" width="86" height="17" align="middle"><span style="color: #000080;">N=500000</span></td>
<td style="border: 1px solid #000000;" width="86" align="middle"></td>
<td style="border: 1px solid #000000;" width="86" align="middle"><span style="color: #0000ff;">C=20</span></td>
<td style="border: 1px solid #000000;" width="86" align="middle"><span style="color: #0000ff;">C=100</span></td>
<td style="border: 1px solid #000000;" width="86" align="middle"><span style="color: #0000ff;">C=1000</span></td>
<td style="border: 1px solid #000000;" width="86" align="middle"><span style="color: #0000ff;">C=3000</span></td>
</tr>
<tr>
<td style="border: 1px solid #000000;" rowspan="4" height="68" align="middle" valign="center"><strong>Cherokee 0.11.5</strong></td>
<td style="border: 1px solid #000000;" align="middle"><span style="color: #00ae00;">1KB</span></td>
<td style="border: 1px solid #000000;" align="middle">40.93</td>
<td style="border: 1px solid #000000;" align="middle">40.84</td>
<td style="border: 1px solid #000000;" align="middle">47.99</td>
<td style="border: 1px solid #000000;" align="middle">67.65</td>
</tr>
<tr>
<td style="border: 1px solid #000000;" align="middle"><span style="color: #00ae00;">10KB</span></td>
<td style="border: 1px solid #000000;" align="middle">46.76</td>
<td style="border: 1px solid #000000;" align="middle">45.28</td>
<td style="border: 1px solid #000000;" align="middle">55.25</td>
<td style="border: 1px solid #000000;" align="middle">67.17</td>
</tr>
<tr>
<td style="border: 1px solid #000000;" align="middle"><span style="color: #00ae00;">100KB</span></td>
<td style="border: 1px solid #000000;" align="middle">136.64</td>
<td style="border: 1px solid #000000;" align="middle">134.42</td>
<td style="border: 1px solid #000000;" align="middle">150.52</td>
<td style="border: 1px solid #000000;" align="middle">159.67</td>
</tr>
<tr>
<td style="border: 1px solid #000000;" align="middle"><span style="color: #00ae00;">1000KB</span></td>
<td style="border: 1px solid #000000;" align="middle">683.16</td>
<td style="border: 1px solid #000000;" align="middle">676.39</td>
<td style="border: 1px solid #000000;" align="middle">877.26</td>
<td style="border: 1px solid #000000;" align="middle">1086.35</td>
</tr>
<tr>
<td style="border: 1px solid #000000;" rowspan="4" height="68" align="middle" valign="center"><strong>Nginx 0.7.27</strong></td>
<td style="border: 1px solid #000000;" align="middle"><span style="color: #00ae00;">1KB</span></td>
<td style="border: 1px solid #000000;" align="middle">36.59</td>
<td style="border: 1px solid #000000;" align="middle">35.82</td>
<td style="border: 1px solid #000000;" align="middle">42.88</td>
<td style="border: 1px solid #000000;" align="middle">56.57</td>
</tr>
<tr>
<td style="border: 1px solid #000000;" align="middle"><span style="color: #00ae00;">10KB</span></td>
<td style="border: 1px solid #000000;" align="middle">38.81</td>
<td style="border: 1px solid #000000;" align="middle">36.61</td>
<td style="border: 1px solid #000000;" align="middle">44.97</td>
<td style="border: 1px solid #000000;" align="middle">60.78</td>
</tr>
<tr>
<td style="border: 1px solid #000000;" align="middle"><span style="color: #00ae00;">100KB</span></td>
<td style="border: 1px solid #000000;" align="middle"><span style="color: #ff0000;">88.42</span></td>
<td style="border: 1px solid #000000;" align="middle"><span style="color: #ff0000;">81.53</span></td>
<td style="border: 1px solid #000000;" align="middle"><span style="color: #ff0000;">99.83</span></td>
<td style="border: 1px solid #000000;" align="middle">123.88</td>
</tr>
<tr>
<td style="border: 1px solid #000000;" align="middle"><span style="color: #00ae00;">1000KB</span></td>
<td style="border: 1px solid #000000;" align="middle"><span style="color: #ff0000;">658.39</span></td>
<td style="border: 1px solid #000000;" align="middle"><span style="color: #ff0000;">659.58</span></td>
<td style="border: 1px solid #000000;" align="middle">840.94</td>
<td style="border: 1px solid #000000;" align="middle"><span style="color: #ff0000;">1055.47</span></td>
</tr>
<tr>
<td style="border: 1px solid #000000;" rowspan="4" height="68" align="middle" valign="center"><strong>Lighttpd 1.4.20</strong></td>
<td style="border: 1px solid #000000;" align="middle"><span style="color: #00ae00;">1KB</span></td>
<td style="border: 1px solid #000000;" align="middle"><span style="color: #ff0000;">34.98</span></td>
<td style="border: 1px solid #000000;" align="middle"><span style="color: #ff0000;">34.23</span></td>
<td style="border: 1px solid #000000;" align="middle"><span style="color: #ff0000;">41.91</span></td>
<td style="border: 1px solid #000000;" align="middle"><span style="color: #ff0000;">50.85</span></td>
</tr>
<tr>
<td style="border: 1px solid #000000;" align="middle"><span style="color: #00ae00;">10KB</span></td>
<td style="border: 1px solid #000000;" align="middle"><span style="color: #ff0000;">36.29</span></td>
<td style="border: 1px solid #000000;" align="middle"><span style="color: #ff0000;">36.79</span></td>
<td style="border: 1px solid #000000;" align="middle"><span style="color: #ff0000;">43.71</span></td>
<td style="border: 1px solid #000000;" align="middle"><span style="color: #ff0000;">55.89</span></td>
</tr>
<tr>
<td style="border: 1px solid #000000;" align="middle"><span style="color: #00ae00;">100KB</span></td>
<td style="border: 1px solid #000000;" align="middle">88.19</td>
<td style="border: 1px solid #000000;" align="middle">83.51</td>
<td style="border: 1px solid #000000;" align="middle">100.68</td>
<td style="border: 1px solid #000000;" align="middle"><span style="color: #ff0000;">123.17</span></td>
</tr>
<tr>
<td style="border: 1px solid #000000;" align="middle"><span style="color: #00ae00;">1000KB</span></td>
<td style="border: 1px solid #000000;" align="middle">669.61</td>
<td style="border: 1px solid #000000;" align="middle">669.36</td>
<td style="border: 1px solid #000000;" align="middle"><span style="color: #ff0000;">829.24</span></td>
<td style="border: 1px solid #000000;" align="middle">1081.38</td>
</tr>
<tr>
<td style="border: 1px solid #000000;" rowspan="4" height="68" align="middle" valign="center"><strong>Apache 2.2.11</strong></td>
<td style="border: 1px solid #000000;" align="middle"><span style="color: #00ae00;">1KB</span></td>
<td style="border: 1px solid #000000;" align="middle"><strong>101.47</strong></td>
<td style="border: 1px solid #000000;" align="middle"><strong>86.77</strong></td>
<td style="border: 1px solid #000000;" align="middle"><strong>95.22</strong></td>
<td style="border: 1px solid #000000;" align="middle"><strong>N/A</strong></td>
</tr>
<tr>
<td style="border: 1px solid #000000;" align="middle"><span style="color: #00ae00;">10KB</span></td>
<td style="border: 1px solid #000000;" align="middle"><strong>99.51</strong></td>
<td style="border: 1px solid #000000;" align="middle"><strong>88.31</strong></td>
<td style="border: 1px solid #000000;" align="middle"><strong>99.82</strong></td>
<td style="border: 1px solid #000000;" align="middle"><strong>N/A</strong></td>
</tr>
<tr>
<td style="border: 1px solid #000000;" align="middle"><span style="color: #00ae00;">100KB</span></td>
<td style="border: 1px solid #000000;" align="middle"><strong>143.76</strong></td>
<td style="border: 1px solid #000000;" align="middle"><strong>136.81</strong></td>
<td style="border: 1px solid #000000;" align="middle"><strong>183.41</strong></td>
<td style="border: 1px solid #000000;" align="middle"><strong>N/A</strong></td>
</tr>
<tr>
<td style="border: 1px solid #000000;" align="middle"><span style="color: #00ae00;">1000KB</span></td>
<td style="border: 1px solid #000000;" align="middle">718.17</td>
<td style="border: 1px solid #000000;" align="middle">725.46</td>
<td style="border: 1px solid #000000;" align="middle">957.25</td>
<td style="border: 1px solid #000000;" align="middle"><strong>N/A</strong></td>
</tr>
<tr>
<td height="17" align="left"></td>
<td align="left"></td>
<td align="left"></td>
<td align="left"></td>
<td align="left"></td>
<td align="middle"><span style="color: #000080;">Seconds</span></td>
</tr>
</tbody>
</table>
<p>有图有真相：</p></div>
<div class="post-body entry-content"><img class="alignnone size-full wp-image-1222" title="cherokee002" src="http://www.ptubuntu.com/wp-content/uploads/2008/12/cherokee002.png" alt="cherokee002" width="400" height="200" /></p>
<p>Apache 的问题不多说了，这么丑陋的数据摆在那儿，有的人喜欢抱残守缺，那就让他们抱去。Cherokee  虽然比 Lighttpd 和 Nginx 略输一筹，但还是非常值得推荐给入门级的网站管理员使用。因为 Cherokee 附带一个非常易用的 <a href="http://www.cherokee-project.com/doc/bundle_cherokee-admin.html">Web  管理界面</a>，可以轻松完成各种配置，入门级用户一般不会出错：</p>
<p><img class="alignnone size-medium wp-image-1223" title="cherokee003" src="http://www.ptubuntu.com/wp-content/uploads/2008/12/cherokee003-500x360.png" alt="cherokee003" width="500" height="360" /><br />
总之，Lighttpd 和 Nginx 是大容量、高并发网站的当然之选，入门级网站可以考虑使用  Cherokee 快速上手。至于 Apache 么，当作玩具留着玩，或者当作古董供起来吧。</div>
<div class="post-footer">
<div class="post-footer-line post-footer-line-1"><span class="post-author vcard">来自:作者 <a href="http://hutuworm.blogspot.com/2008/12/cherokee-web.html" target="_blank"><span class="fn">hutuworm</span></a></span></div>
<div class="post-footer-line post-footer-line-1"><span class="post-author vcard"><span class="fn"><!--more--><br />
</span></span></div>
</div>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.ptubuntu.com%2F2008%2F12%2F1220.html&amp;title=Cherokee%EF%BC%9A%E6%9C%80%E5%BF%AB%E7%9A%84%20Web%20%E6%9C%8D%E5%8A%A1%E5%99%A8%EF%BC%9F" id="wpa2a_2"><img src="http://www.ptubuntu.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.ptubuntu.com/2008/12/1220.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Apache2.2 虚拟主机文档</title>
		<link>http://www.ptubuntu.com/2008/12/970.html</link>
		<comments>http://www.ptubuntu.com/2008/12/970.html#comments</comments>
		<pubDate>Mon, 15 Dec 2008 07:38:00 +0000</pubDate>
		<dc:creator>ptubuntu</dc:creator>
				<category><![CDATA[Apache&php&Ftp]]></category>
		<category><![CDATA[Linux Server]]></category>
		<category><![CDATA[技术类]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[www]]></category>

		<guid isPermaLink="false">http://www.ptubuntu.com/?p=970</guid>
		<description><![CDATA[如果要使用apache建站.那你一定要看完这个.如果你没有看完.那会遇到一大堆问题.等你问题出来了再一个一个找.那我看你要花更多的时间去解答问题.那时你会觉的力不可行也&#8230;..所以说重了一点.这个是最常重要的文档.下面这个文档适合在于用原代码安装有朋友查看.不过用软包直接安装的.他们的这些文档不是放在同一个文档里.而是分开的.所以你要花更多的时间去了解. 术语”虚拟主机“是指在一个机器上运行多个网站(比如：www.company1.com和www.company2.com)。如果每个网站拥有不同的IP地址，则虚拟主机可以是”基于IP”的；如果只有一个IP地址，也可以是”基于主机名”的，其实现对最终用户是透明的。 Apache是率先支持基于IP的虚拟主机的服务器之一。1.1及其更新版本同时支持基于IP和基于主机名的虚拟主机，今后，不同的虚拟主机有时会被称为”基于主机”或”非IP虚拟主机”。 下列文档会阐述Apache1.3及其更新版本所支持的虚拟主机的所有细节。 虚拟主机支持 * 基于主机名的虚拟主机(一个IP地址，多个网站) * 基于IP地址的虚拟主机(每个站点拥有一个的独立IP地址) * 虚拟主机的普通配置示例 * 文件描述符限制(在日志文件过多的情况下会产生的限制) * 动态配置大量虚拟主机 * 深入讨论虚拟主机的匹配 配置指令 * &#60;VirtualHost&#62; * NameVirtualHost * ServerName * ServerAlias * ServerPath 如果要调试你的虚拟主机配置，你会发现Apache的 -S 命令行开关很有用。比如： /usr/local/apache2/bin/httpd -S 此命令会输出Apache解析配置文件的详细描述，仔细检查IP地址和主机名会有助于纠正配置错误。 本文档说明了如何使用基于域名的虚拟主机。 基于域名的虚拟主机和基于IP的虚拟主机比较 基于IP的虚拟主机使用连接的IP地址来决定相应的虚拟主机。这样，你就需要为每个虚拟主机分配一个独立的IP地址。而基于域名的虚拟主机是根据客户端提交的HTTP头中标识主机名的部分决定的。使用这种技术，很多虚拟主机可以共享同一个IP地址。 基于域名的虚拟主机相对比较简单，因为你只需要配置你的DNS服务器将每个主机名映射到正确的IP地址，然后配置Apache HTTP服务器，令其辨识不同的主机名就可以了。基于域名的服务器也可以缓解IP地址不足的问题。所以，如果没有特殊原因使你必须使用基于IP的虚拟主机，您最好还是使用基于域名的虚拟主机。下列情况下，你可能会想要使用基于IP的虚拟主机： * 一些古董级的客户端与基于域名的虚拟主机不兼容。为了与基于域名的虚拟主机兼容，客户端必须发送”Host”头。HTTP/1.1规范中对此做了要求。而所有现在常见的仅支持HTTP/1.0的旧版本浏览器都以附加的方式实现了这个要求。如果你又想支持这些老浏览器，又想使用基于域名的虚拟主机。我们提供了一个技术方案，你可以在本文末尾看到它。 * SSL协议先天特性决定了基于域名的虚拟主机无法成为SSL安全服务器。 * 一些操作系统和网络设备实现的带宽管理技术无法在多个主机共享一个IP的情况下区别它们。 使用基于域名的虚拟主机 相关模块: * core 相关指令: * DocumentRoot * NameVirtualHost * [...]]]></description>
			<content:encoded><![CDATA[<p><span class="postbody"><span style="color: #33cccc;">如果要使用apache建站.那你一定要看完这个.如果你没有看完.那会遇到一大堆问题.等你问题出来了再一个一个找.那我看你要花更多的时间去解答问题.那时你会觉的力不可行也&#8230;..所以说重了一点.这个是最常重要的文档.下面这个文档适合在于用原代码安装有朋友查看.不过用软包直接安装的.他们的这些文档不是放在同一个文档里.而是分开的.所以你要花更多的时间去了解.</span></span></p>
<p><span class="postbody">术语”<strong><span style="color: #ff0000;">虚拟主机</span></strong>“是指在一个机器上运行多个网站(比如：<a href="http://www.ptubuntu.com/tag/www" class="st_tag internal_tag" rel="tag" title="标签 www 下的日志">www</a>.company1.com和www.company2.com)。如果每个网站拥有不同的IP地址，则虚拟主机可以是”基于IP”的；如果只有一个IP地址，也可以是”基于主机名”的，其实现对最终用户是透明的。</p>
<p>Apache是率先支持基于IP的虚拟主机的服务器之一。1.1及其更新版本同时支持基于IP和基于主机名的虚拟主机，今后，不同的虚拟主机有时会被称为”基于主机”或”非IP虚拟主机”。</p>
<p>下列文档会阐述Apache1.3及其更新版本所支持的虚拟主机的所有细节。</p>
<p><strong><span style="color: #00008b;">虚拟主机支持</span></strong><br />
* 基于主机名的虚拟主机(一个IP地址，多个网站)<br />
* 基于IP地址的虚拟主机(每个站点拥有一个的独立IP地址)<br />
* 虚拟主机的普通配置示例<br />
* 文件描述符限制(在日志文件过多的情况下会产生的限制)<br />
* 动态配置大量虚拟主机<br />
* 深入讨论虚拟主机的匹配<br />
<strong><span style="color: #00008b;">配置指令</span></strong><br />
* &lt;VirtualHost&gt;<br />
* NameVirtualHost<br />
* ServerName<br />
* ServerAlias<br />
* ServerPath </span></p>
<p><span class="postbody"><span id="more-970"></span><br />
如果要调试你的虚拟主机配置，你会发现Apache的 -S 命令行开关很有用。比如：</p>
<p>/usr/local/<a href="http://www.ptubuntu.com/tag/apache" class="st_tag internal_tag" rel="tag" title="标签 apache 下的日志">apache</a>2/bin/httpd -S</p>
<p>此命令会输出Apache解析配置文件的详细描述，仔细检查IP地址和主机名会有助于纠正配置错误。 </span></p>
<p><span class="postbody"><span class="postbody">本文档说明了如何使用基于域名的虚拟主机。</p>
<p><span style="FONT-SIZE: 18px; LINE-HEIGHT: normal"><strong>基于域名的虚拟主机和基于IP的虚拟主机比较</strong></span></p>
<p>基于IP的虚拟主机使用连接的IP地址来决定相应的虚拟主机。这样，你就需要为每个虚拟主机分配一个独立的IP地址。而基于域名的虚拟主机是根据客户端提交的HTTP头中标识主机名的部分决定的。使用这种技术，很多虚拟主机可以共享同一个IP地址。</p>
<p>基于域名的虚拟主机相对比较简单，因为你只需要配置你的DNS服务器将每个主机名映射到正确的IP地址，然后配置Apache HTTP服务器，令其辨识不同的主机名就可以了。基于域名的服务器也可以缓解IP地址不足的问题。所以，如果没有特殊原因使你必须使用基于IP的虚拟主机，您最好还是使用基于域名的虚拟主机。下列情况下，你可能会想要使用基于IP的虚拟主机：</p>
<p>* 一些古董级的客户端与基于域名的虚拟主机不兼容。为了与基于域名的虚拟主机兼容，客户端必须发送”Host”头。HTTP/1.1规范中对此做了要求。而所有现在常见的仅支持HTTP/1.0的旧版本浏览器都以附加的方式实现了这个要求。如果你又想支持这些老浏览器，又想使用基于域名的虚拟主机。我们提供了一个技术方案，你可以在本文末尾看到它。<br />
* SSL协议先天特性决定了基于域名的虚拟主机无法成为SSL安全服务器。<br />
* 一些操作系统和网络设备实现的带宽管理技术无法在多个主机共享一个IP的情况下区别它们。</p>
<p><span style="FONT-SIZE: 18px; LINE-HEIGHT: normal"><strong>使用基于域名的虚拟主机</strong></span><br />
相关模块:<br />
* core<br />
相关指令:<br />
* DocumentRoot<br />
* NameVirtualHost<br />
* ServerAlias<br />
* ServerName<br />
* ServerPath<br />
* &lt;VirtualHost&gt;</p>
<p>为了使用基于域名的虚拟主机，你必须指定服务器IP地址(和可能的端口)来使主机接受请求，这个可以用NameVirtualHost指令来进行配置。如果服务器上所有的IP地址都会用到，你可以用”*”作为NameVirtualHost的参数。如果你打算使用多端口(如运行SSL)你必须在参数中指定一个端口号，比如”*:80&#8243;。请注意，在NameVirtualHost指令中指定IP地址并不会使服务器自动侦听那个IP地址。请参阅设置Apache使用的地址和端口一章获取更多详情。另外，这里设定的IP地址必须对应服务器上的一个网络接口。</p>
<p>下一步就是为每个虚拟主机建立&lt;VirtualHost&gt;段。&lt;VirtualHost&gt;的参数与NameVirtualHost的参数必须是一样的(比如说，一个IP地址或”*”代表的所有地址)。在每个&lt;VirtualHost&gt;段中，至少要有一个ServerName指令来指定伺服哪个主机和一个DocumentRoot指令来说明这个主机的内容位于文件系统的什么地方。<br />
<strong>取消中心主机(Mainhost)</strong></p>
<p>如果你想在现有的web服务器上增加虚拟主机，你必须也为现存的主机建造一个&lt;VirtualHost&gt;定义块。这个虚拟主机中ServerName和DocumentRoot所包含的内容应该与全局的ServerName和DocumentRoot保持一致。还要把这个虚拟主机放在配置文件的最前面，来让它扮演默认主机的角色。</p>
<p>比如说，假设你正在为域名www.domain.tld提供服务，而你又想在同一个IP地址上增加一个名叫www.otherdomain.tld的虚拟主机，你只需在httpd.conf中加入以下内容：</p>
<p>NameVirtualHost *:80</p>
<p>&lt;VirtualHost *:80&gt;<br />
ServerName www.domain.tld<br />
ServerAlias domain.tld *.domain.tld<br />
DocumentRoot /www/domain<br />
&lt;/VirtualHost&gt;</p>
<p>&lt;VirtualHost *:80&gt;<br />
ServerName www.otherdomain.tld<br />
DocumentRoot /www/otherdomain<br />
&lt;/VirtualHost&gt;</p>
<p>当然，你可以用一个固定的IP地址来代替NameVirtualHost和&lt;VirtualHost&gt;指令中的”*”号，以达到一些特定的目的。比如说，你可能会希望在一个IP地址上运行一个基于域名的虚拟主机，而在另外一个IP地址上运行一个基于IP的或是另外一套基于域名的虚拟主机。</p>
<p>很多服务器希望自己能通过不只一个域名被访问。我们可以把ServerAlias指令放入&lt;VirtualHost&gt;小节中来解决这个问题。比如说在上面的第一个&lt;VirtualHost&gt;配置段中ServerAlias指令中列出的名字就是用户可以用来访问同一个web站点的其它名字：</p>
<p>ServerAlias domain.tld *.domain.tld</p>
<p>这样，所有对域domain.tld的访问请求都将由虚拟主机www.domain.tld处理。通配符标记”*”和”?”可以用于域名的匹配。当然你不能仅仅搞个名字然后把它放到ServerName或ServerAlias里就算完了。你必须先在你的DNS服务器上进行配置，将这些名字和您服务器上的一个IP地址建立映射关系。</p>
<p>最后，你可以把其他一些指令放入&lt;VirtualHost&gt;段中，以更好的配置一个虚拟主机。大部分指令都可以放入这些&lt;VirtualHost&gt;段中以改变相应虚拟主机配置。如果您想了解一个特定的指令是否可以这样运用，请参见指令的作用域。主服务器(main server)范围内的配置指令(在所有&lt;VirtualHost&gt;配置段之外的指令)仅在它们没有被虚拟主机的配置覆盖时才起作用。</p>
<p>这样，当一个请求到达的时候，服务器会首先检查它是否使用了一个能和NameVirtualHost相匹配的IP地址。如果能够匹配，它就会查找每个与这个IP地址相对应的&lt;VirtualHost&gt;段，并尝试找出一个与请求的主机名相同的ServerName或ServerAlias配置项。如果找到了，它就会使用这个服务器。否则，将使用符合这个IP地址的第一个列出的虚拟主机。</p>
<p>综上所述，第一个列出的虚拟主机充当了默认虚拟主机的角色。当一个IP地址与NameVirtualHost指令中的配置相符的时候，主服务器中的DocumentRoot将永远不会被用到。所以，如果你想创建一段特殊的配置用于处理不对应任何一个虚拟主机的请求的话，你只要简单的把这段配置放到&lt;VirtualHost&gt;段中，并把它放到配置文件的最前面就可以了。</p>
<p><span style="FONT-SIZE: 18px; LINE-HEIGHT: normal"><strong>与旧版浏览器的兼容性</strong></span></p>
<p>前面提过，有些浏览器无法对基于域名的虚拟主机发送必要的数据，从而使其无法正常工作。这些浏览器将会收到由配置中符合那个IP地址的第一个列出的虚拟主机发出的页面(基于域名的主虚拟主机)。<br />
究竟什么算旧？</p>
<p>请注意，当我们说到旧的时候，我们并不是真的说它们很古老。其实现实中您未必就能用上这些浏览器。现在几乎所有的浏览器都会发送基于域名的虚拟主机所必须的Host头了。</p>
<p>虽然有点麻烦。但您还是有可能会用到ServerPath指令，以下是一个配置实例：</p>
<p>NameVirtualHost 111.22.33.44</p>
<p>&lt;VirtualHost 111.22.33.44&gt;<br />
ServerName www.domain.tld<br />
ServerPath /domain<br />
DocumentRoot /web/domain<br />
&lt;/VirtualHost&gt;</p>
<p>以上这些说明了什么呢？它说明一个具有”/domain”开头的任何URI都会为www.domain.tld这个虚拟主机所伺服。这意味着这个页面可以由http://www.domain.tld/domain/的形式为所有的浏览器所访问。能够发送”Host:”头的浏览器也能使用http://www.domain.tld/这种形式来访问它。</p>
<p>为了达到这样的目的。您先要在您的主虚拟主机的页面上放一个到http://www.domain.tld/domain/的链接。然后，确保在虚拟主机的页面中使用的全是相对链接(诸如：”file.<a href="http://www.ptubuntu.com/tag/html" class="st_tag internal_tag" rel="tag" title="标签 html 下的日志">html</a>”或”../icons/image.gif”)或者是包含/domain/这个前缀(比如：”http://www.domain.tld/domain/misc/file.<a href="http://www.ptubuntu.com/tag/html" class="st_tag internal_tag" rel="tag" title="标签 html 下的日志">html</a>”或”/domain/misc/file.<a href="http://www.ptubuntu.com/tag/html" class="st_tag internal_tag" rel="tag" title="标签 html 下的日志">html</a>”)。</p>
<p>完成这些可能需要一些尝试，但遵照上述指导将会确保你的页面能够为所有的浏览器所正确显示，不论新旧。 </span></span></p>
<p><span class="postbody"><span class="postbody"><span class="postbody"><strong><span style="FONT-SIZE: 18px; LINE-HEIGHT: normal">系统需求</span></strong></p>
<p>就像它的名字”基于IP”所暗示的那样，这样的服务器中每个基于IP的虚拟主机必须拥有不同的IP地址。可以通过配备多个真实的物理网络接口来达到这一要求，也可以使用几乎所有流行的操作系统都支持的虚拟界面来达到这一要求(详情请参见您的系统文档，这种功能一般被称作”IP别名”，一般用”ifconfig”命令来进行设置)。</p>
<p><span style="FONT-SIZE: 18px; LINE-HEIGHT: normal"><strong><span style="color: #00008b;">如何配置Apache</span></strong></span></p>
<p>有两种配置方法来使apache支持多主机：为每个虚拟主机运行不同的httpd守护进程；或者用同一个守护进程来支持所有虚拟主机。</p>
<p>以下情况使用多个守护进程：</p>
<p>* 出于安全的考虑，比如说公司甲不希望公司乙的任何人能用除web以外的方式访问到他们的数据。在这种情况下，您需要启动两个守护进程。每个进程都使用不同的User, Group, Listen, ServerRoot设置。<br />
* 您能够为机器上的每个IP地址提供内存和文件描述符需求。您只能Listen一个”通配符型”地址或一个特定的地址。所以不管出于什么原因，如果您需要侦听一个特定的地址，您就必须同时侦听所有特定的地址。(尽管可以让一个httpd侦听N-1个地址，而让另一个侦听剩下的地址)</p>
<p>以下情况使用单一守护进程：</p>
<p>* httpd的配置可以为多个虚拟主机共享而不引起麻烦。<br />
* 机器要接受大量的访问请求，从而多启动一个守护进程会导致性能大幅度降低。</p>
<p><span style="FONT-SIZE: 18px; LINE-HEIGHT: normal"><strong>设置多个守护进程</strong></span></p>
<p>为每个虚拟主机创建一个不同的httpd安装。每次安装都在配置文件中使用Listen指令指定守护进程伺服的IP地址(或虚拟主机)。比如：</p>
<p>Listen www.smallco.com:80</p>
<p>建议您使用IP地址来取代域名(理由请参见关于DNS和Apache)。</p>
<p><span style="FONT-SIZE: 18px; LINE-HEIGHT: normal"><strong>配置拥有多个虚拟主机的单一守护进程</strong></span></p>
<p>在这种情况下，单一的httpd将伺服所有对主服务器和虚拟主机的请求。而配置文件中的VirtualHost指令将为每个虚拟主机配置不同的ServerAdmin, ServerName, DocumentRoot, ErrorLog, TransferLog, CustomLog 。例如：</p>
<p>&lt;VirtualHost www.smallco.com&gt;<br />
ServerAdmin <a class="snap_shots" href="mailto:webmaster@mail.smallco.com">webmaster@mail.smallco.com</a><br />
DocumentRoot /groups/smallco/www<br />
ServerName www.smallco.com<br />
ErrorLog /groups/smallco/logs/error_log<br />
TransferLog /groups/smallco/logs/access_log<br />
&lt;/VirtualHost&gt;</p>
<p>&lt;VirtualHost www.baygroup.org&gt;<br />
ServerAdmin <a class="snap_shots" href="mailto:webmaster@mail.baygroup.org">webmaster@mail.baygroup.org</a><br />
DocumentRoot /groups/baygroup/www<br />
ServerName www.baygroup.org<br />
ErrorLog /groups/baygroup/logs/error_log<br />
TransferLog /groups/baygroup/logs/access_log<br />
&lt;/VirtualHost&gt;</p>
<p>建议您使用IP地址来取代域名(理由请参见关于DNS和Apache)。</p>
<p>除了创建进程的指令和其他一些指令外，几乎所有的配置指令都能用于&lt;VirtualHost&gt;指令中。您可以使用指令索引在作用域中查询一个指令是否可以用于&lt;VirtualHost&gt;指令。</p>
<p>如果使用了suEXEC包装，那么SuexecUserGroup指令也可以在&lt;VirtualHost&gt;段中使用。</p>
<p>安全警示：当指定日志文件时，请记住有安全风险。一些别有用心的人会在那个目录拥有写权限。 </span></span></span></p>
<p><span class="postbody"><span class="postbody"><span class="postbody"><span class="postbody">本文档试图解释一些在设置虚拟主机时经常问及的问题。这些示例向你展示了如何在一个服务器上通过基于域名的或是基于IP的虚拟主机来部署多个web站点。另一份关于如何在一个代理服务器后构建基于多个服务器的站点的说明文档也很快就会出来。</p>
<p><span style="color: #ff0000;"><span style="font-size: 18px; line-height: normal;"><strong>在一个IP地址上运行多个基于域名的web站点</strong></span><br />
</span><br />
您的服务器有只一个IP地址，而在DNS中有很多域名(CNAMES)映射到这个机器。您而您想要在这个机器上运行www.example.com和www.example.org两个站点。<br />
注意</p>
<p>在您的Apache服务器配置中创建一个虚拟主机并不会自动在您的DNS中对主机名做相应更新。您必须自己在DNS中添加域名来指向您的IP地址。否则别人是无法看到您的web站点的。您可以在您的hosts文件中添加这一条目来进行测试，但这种方法仅适用于那些有这些hosts文件的机器来使用。<br />
服务器配置</p>
<p># 确保Apache在监听80端口<br />
Listen 80</p>
<p># 为虚拟主机在所有IP地址上监听<br />
NameVirtualHost *:80</p>
<p>&lt;VirtualHost *:80&gt;<br />
DocumentRoot /www/example1<br />
ServerName www.example.com</p>
<p># 你可以在这里添加其他指令</p>
<p>&lt;/VirtualHost&gt;</p>
<p>&lt;VirtualHost *:80&gt;<br />
DocumentRoot /www/example2<br />
ServerName www.example.org</p>
<p># 你可以在这里添加其他指令</p>
<p>&lt;/VirtualHost&gt;</p>
<p>因为星号匹配所有IP地址，所以主服务器不接收任何请求。因为www.example.com首先出现在配置文件中，所以它拥有最高优先级，可以认为是默认或主服务器。这意味着如果一个请求不能与某个ServerName指令相匹配，它将会由第一个&lt;VirtualHost&gt;段所伺服。<br />
注意</p>
<p>如果您愿意，您可以用确定的IP地址来取代”*”。在这种情况下，VirtualHost的参数必须与NameVirtualHost的参数相符：</p>
<p>NameVirtualHost 172.20.30.40</p>
<p>&lt;VirtualHost 172.20.30.40&gt;<br />
# 其他 &#8230;</p>
<p>然而，当您的IP地址无法确定的时候，使用”*”是很方便的，比如说，您的ISP给您配置的是动态IP地址，而您又使用了某种动态域名解析系统时。因为”*”匹配任何IP地址，所以在这种情况下，不论IP地址如何变化，您都不需要另外进行配置。</p>
<p>上述配置就是您在绝大多数情况下使用基于域名的虚拟主机时将要用到的。事实上，仅在一种情况下这样的配置不会让您满意：您想为不同的IP地址或是端口提供不同的内容。</p>
<p><span style="color: #ff0000;"><span style="font-size: 18px; line-height: normal;"><strong>在多于一个IP的情况下使用基于域名的虚拟主机</strong></span><br />
</span>注意</p>
<p>在这里讨论的任何技术都可以推广到使用任意数量的IP地址。</p>
<p>服务器有两个IP地址。一个(172.20.30.40)用于主服务器server.domain.com ，另外一个(172.20.30.50)用于构建两个或多个虚拟主机。<br />
服务器配置</p>
<p>Listen 80</p>
<p># “主”服务器运行于：172.20.30.40<br />
ServerName server.domain.com<br />
DocumentRoot /www/mainserver</p>
<p># 这是另外一个IP地址<br />
NameVirtualHost 172.20.30.50</p>
<p>&lt;VirtualHost 172.20.30.50&gt;<br />
DocumentRoot /www/example1<br />
ServerName www.example.com</p>
<p># 你可以在这里添加其他指令 &#8230;</p>
<p>&lt;/VirtualHost&gt;</p>
<p>&lt;VirtualHost 172.20.30.50&gt;<br />
DocumentRoot /www/example2<br />
ServerName www.example.org</p>
<p># 你可以在这里添加其他指令 &#8230;</p>
<p>&lt;/VirtualHost&gt;</p>
<p>任何不是针对172.20.30.50的请求都将由主服务器来伺服。而提交给172.20.30.50却没有主机名或没有”Host:”头的请求，都将由www.example.com伺服。</p>
<p><span style="FONT-SIZE: 18px; LINE-HEIGHT: normal"><strong><span style="color: #ff0000;">在不同的IP的地址(比如一个内部和一个外部地址)上提供相同的内容</span></strong></span></p>
<p>服务器有两个IP地址(192.168.1.1和172.20.30.40)。这个机器位于内部(局域网)网络和外部(广域网)之间。在外部，域名server.example.com指向外部地址(172.20.30.40)，而在内部则指向内部地址(192.168.1.1)。</p>
<p>服务器可以为来自内部和外部的请求提供同样的内容，您只需要一个&lt;VirtualHost&gt;配置段就可以了。<br />
服务器配置</p>
<p>NameVirtualHost 192.168.1.1<br />
NameVirtualHost 172.20.30.40</p>
<p>&lt;VirtualHost 192.168.1.1 172.20.30.40&gt;<br />
DocumentRoot /www/server1<br />
ServerName server.example.com<br />
ServerAlias server<br />
&lt;/VirtualHost&gt;</p>
<p>现在，从不同的网络提交的请求都会由同一个&lt;VirtualHost&gt;段来伺服。<br />
注意</p>
<p>在内网中，您可以使用server这个名字来代替server.example.com这个全名。</p>
<p>跟上面一样，在上述的例子里，您可以用”*”来代替具体的IP地址，这样就可以对所有的地址都返回相同的内容了。</p>
<p><span style="FONT-SIZE: 18px; LINE-HEIGHT: normal"><strong><span style="color: #ff0000;">在不同的端口上运行不同的站点</span></strong></span></p>
<p>如果您想让同一个IP的不同端口伺服多个域名。您可以借助在NameVirtualHost指令中定义端口的方法来达到这个目的。如果您想使用不带”name:port”的&lt;VirtualHost name:port&gt;或是直接用Listen指令，您的配置将无法生效。<br />
服务器配置</p>
<p>Listen 80<br />
Listen 8080</p>
<p>NameVirtualHost 172.20.30.40:80<br />
NameVirtualHost 172.20.30.40:8080</p>
<p>&lt;VirtualHost 172.20.30.40:80&gt;<br />
ServerName www.example.com<br />
DocumentRoot /www/domain-80<br />
&lt;/VirtualHost&gt;</p>
<p>&lt;VirtualHost 172.20.30.40:8080&gt;<br />
ServerName www.example.com<br />
DocumentRoot /www/domain-8080<br />
&lt;/VirtualHost&gt;</p>
<p>&lt;VirtualHost 172.20.30.40:80&gt;<br />
ServerName www.example.org<br />
DocumentRoot /www/otherdomain-80<br />
&lt;/VirtualHost&gt;</p>
<p>&lt;VirtualHost 172.20.30.40:8080&gt;<br />
ServerName www.example.org<br />
DocumentRoot /www/otherdomain-8080<br />
&lt;/VirtualHost&gt;</p>
<p><span style="color: #ff0000;"><span style="font-size: 18px; line-height: normal;"><strong>建立基于IP的虚拟主机</strong></span><br />
</span><br />
一个有两个IP地址(172.20.30.40和172.20.30.50)分别对应域名www.example.com和www.example.org的配置如下：<br />
服务器配置</p>
<p>Listen 80</p>
<p>&lt;VirtualHost 172.20.30.40&gt;<br />
DocumentRoot /www/example1<br />
ServerName www.example.com<br />
&lt;/VirtualHost&gt;</p>
<p>&lt;VirtualHost 172.20.30.50&gt;<br />
DocumentRoot /www/example2<br />
ServerName www.example.org<br />
&lt;/VirtualHost&gt;</p>
<p>如果存在主服务器，那么对没有出现在任一个&lt;VirtualHost&gt;段中的请求(比如，对localhost的请求)都会由主服务器来伺服。</p>
<p><span style="FONT-SIZE: 18px; LINE-HEIGHT: normal"><strong><span style="color: #ff0000;">混用基于端口和基于IP的虚拟主机</span></strong></span></p>
<p>如果您的服务器有两个IP地址(172.20.30.40和172.20.30.50)分别对应域名www.example.com和www.example.org 。对每个域名，您都希望在80端口和8080端口发布您的网站。您可以这样配置：<br />
服务器配置</p>
<p>Listen 172.20.30.40:80<br />
Listen 172.20.30.40:8080<br />
Listen 172.20.30.50:80<br />
Listen 172.20.30.50:8080</p>
<p>&lt;VirtualHost 172.20.30.40:80&gt;<br />
DocumentRoot /www/example1-80<br />
ServerName www.example.com<br />
&lt;/VirtualHost&gt;</p>
<p>&lt;VirtualHost 172.20.30.40:8080&gt;<br />
DocumentRoot /www/example1-8080<br />
ServerName www.example.com<br />
&lt;/VirtualHost&gt;</p>
<p>&lt;VirtualHost 172.20.30.50:80&gt;<br />
DocumentRoot /www/example2-80<br />
ServerName www.example.org<br />
&lt;/VirtualHost&gt;</p>
<p>&lt;VirtualHost 172.20.30.50:8080&gt;<br />
DocumentRoot /www/example2-8080<br />
ServerName www.example.org<br />
&lt;/VirtualHost&gt;</p>
<p><span style="FONT-SIZE: 18px; LINE-HEIGHT: normal"><strong><span style="color: #ff0000;">混用基于域名和基于IP的虚拟主机</span></strong></span></p>
<p>您想在一些地址上配置基于域名的虚拟主机而在另外一些地址上配置基于IP的虚拟主机。<br />
服务器配置</p>
<p>Listen 80</p>
<p>NameVirtualHost 172.20.30.40</p>
<p>&lt;VirtualHost 172.20.30.40&gt;<br />
DocumentRoot /www/example1<br />
ServerName www.example.com<br />
&lt;/VirtualHost&gt;</p>
<p>&lt;VirtualHost 172.20.30.40&gt;<br />
DocumentRoot /www/example2<br />
ServerName www.example.org<br />
&lt;/VirtualHost&gt;</p>
<p>&lt;VirtualHost 172.20.30.40&gt;<br />
DocumentRoot /www/example3<br />
ServerName www.example3.net<br />
&lt;/VirtualHost&gt;</p>
<p># IP-based<br />
&lt;VirtualHost 172.20.30.50&gt;<br />
DocumentRoot /www/example4<br />
ServerName www.example4.edu<br />
&lt;/VirtualHost&gt;</p>
<p>&lt;VirtualHost 172.20.30.60&gt;<br />
DocumentRoot /www/example5<br />
ServerName www.example5.gov<br />
&lt;/VirtualHost&gt;</p>
<p><span style="FONT-SIZE: 18px; LINE-HEIGHT: normal"><strong>将&lt;Virtual_host&gt;和mod_proxy模块一起使用</strong></span></p>
<p>下面的例子允许一个前端机器代理一个运行在其他机器上的虚拟主机。在如下示例中，在192.168.111.2机器上配置了一个同名的虚拟主机。这样，万一在同一台机器上代理了多个主机名，ProxyPreserveHost On 指令能确保指定的主机名顺利通过代理。</p>
<p>&lt;VirtualHost *:*&gt;<br />
ProxyPreserveHost On<br />
ProxyPass / <a class="snap_shots" rel="nofollow" href="http://192.168.111.2/" target="_blank">http://192.168.111.2</a><br />
ProxyPassReverse / <a class="snap_shots" rel="nofollow" href="http://192.168.111.2/" target="_blank">http://192.168.111.2/</a><br />
ServerName hostname.example.com<br />
&lt;/VirtualHost&gt;</p>
<p><span style="FONT-SIZE: 18px; LINE-HEIGHT: normal"><strong>使用”_default_”虚拟主机</strong></span><br />
为所有端口配置”_default_”虚拟主机</p>
<p>这样配置可以捕获所有指向没指定的IP地址和端口的请求。比如：一个没被任何虚拟主机使用的地址/端口对。<br />
服务器配置</p>
<p>&lt;VirtualHost _default_:*&gt;<br />
DocumentRoot /www/default<br />
&lt;/VirtualHost&gt;</p>
<p>这样一个使用通配符端口的默认虚拟主机可以有效的防止请求被主服务器接收。</p>
<p>如果一个地址/端口对已经被一个基于域名的虚拟主机使用，那么”_default_”虚拟主机决不会处理发向这个地址/端口对的请求。如果一个”Host:”请求头中包含未知信息，或者干脆就没有，那么它会被第一个基于域名的虚拟主机(也就是在配置文件中最先出现的使用了那个地址/端口对的虚拟主机)处理。</p>
<p>您可以用AliasMatch或RewriteRule来重写任何请求，使它指向一个简单信息页面(或脚本)。<br />
为不同的端口配置”_default_”虚拟主机</p>
<p>与第一种一样，但我们想让服务器侦听很多端口而第二个”_default_”虚拟主机单独侦听80端口。<br />
服务器配置</p>
<p>&lt;VirtualHost _default_:80&gt;<br />
DocumentRoot /www/default80<br />
# &#8230;<br />
&lt;/VirtualHost&gt;</p>
<p>&lt;VirtualHost _default_:*&gt;<br />
DocumentRoot /www/default<br />
# &#8230;<br />
&lt;/VirtualHost&gt;</p>
<p>侦听80端口的”_default_”虚拟主机(必须出现在所有使用通配符端口的虚拟主机之前)会捕获所有发向一个未指定的IP地址的请求。主服务器将不会用于伺服任何请求。<br />
为单独一个端口配置”_default_”虚拟主机</p>
<p>如果我们只想在80端口上建立唯一的一个”_default_”虚拟主机，我们应该这样配置：<br />
服务器配置</p>
<p>&lt;VirtualHost _default_:80&gt;<br />
DocumentRoot /www/default<br />
&#8230;<br />
&lt;/VirtualHost&gt;</p>
<p>发向一个未指定地址的80端口的请求将会由这个虚拟主机伺服；而发向未设定地址的其他端口的请求则由主服务器伺服。<br />
<span style="FONT-SIZE: 18px; LINE-HEIGHT: normal"><br />
<strong><span style="color: #ff0000;">将一个基于域名的虚拟主机移植为一个基于IP的虚拟主机</span></strong></span></p>
<p>如果一个具有www.example.org域名的虚拟主机(就是基于域名配置示例中的第二个)得到了自己的IP地址。为了避免一些域名服务器或代理服务器在移植期间仍对这个域名做老的解析，我们可以采用一种过渡方法：同时提供新旧两个IP地址的解析。</p>
<p>达到这个目的很简单。因为我们只要简单的把新地址(172.20.30.50)加入VirtualHost指令就行了。<br />
服务器配置</p>
<p>Listen 80<br />
ServerName www.example.com<br />
DocumentRoot /www/example1</p>
<p>NameVirtualHost 172.20.30.40</p>
<p>&lt;VirtualHost 172.20.30.40 172.20.30.50&gt;<br />
DocumentRoot /www/example2<br />
ServerName www.example.org<br />
# &#8230;<br />
&lt;/VirtualHost&gt;</p>
<p>&lt;VirtualHost 172.20.30.40&gt;<br />
DocumentRoot /www/example3<br />
ServerName www.example.net<br />
ServerAlias *.example.net<br />
# &#8230;<br />
&lt;/VirtualHost&gt;</p>
<p>现在这个虚拟主机就可以用新地址(表现为一个基于IP的虚拟主机)和旧地址(表现为一个基于域名的虚拟主机)同时进行访问了。</p>
<p><span style="FONT-SIZE: 18px; LINE-HEIGHT: normal"><strong>使用ServerPath指令</strong></span></p>
<p>如果我们在同一个服务器上运行了两个基于域名的虚拟主机。为了匹配正确的虚拟主机，客户端必须发送正确的”Host:” 头。而旧的使用HTTP/1.0的客户端无法发送这样的头，这样Apache就无法辨别客户端想要连接哪个虚拟主机(会用主虚拟主机来伺服这个请求)。为了尽量提供向下兼容性，我们可以提供一个主虚拟主机来返回一个页面，在页面中加入指向基于域名的虚拟主机的URL前缀的链接。<br />
服务器配置</p>
<p>NameVirtualHost 172.20.30.40</p>
<p>&lt;VirtualHost 172.20.30.40&gt;<br />
# 主虚拟主机<br />
DocumentRoot /www/subdomain<br />
RewriteEngine On<br />
RewriteRule ^/.* /www/subdomain/index.html<br />
# &#8230;<br />
&lt;/VirtualHost&gt;</p>
<p>&lt;VirtualHost 172.20.30.40&gt;<br />
DocumentRoot /www/subdomain/sub1<br />
ServerName www.sub1.domain.tld<br />
ServerPath /sub1/<br />
RewriteEngine On<br />
RewriteRule ^(/sub1/.*) /www/subdomain$1<br />
# &#8230;<br />
&lt;/VirtualHost&gt;</p>
<p>&lt;VirtualHost 172.20.30.40&gt;<br />
DocumentRoot /www/subdomain/sub2<br />
ServerName www.sub2.domain.tld<br />
ServerPath /sub2/<br />
RewriteEngine On<br />
RewriteRule ^(/sub2/.*) /www/subdomain$1<br />
# &#8230;<br />
&lt;/VirtualHost&gt;</p>
<p>由于ServerPath指令的作用，发送到http://www.sub1.domain.tld/sub1/的请求总会被sub1-vhost所伺服。<br />
如果客户端发送了正确的”Host:”头，发送到http://www.sub1.domain.tld/的请求只会被sub1-vhost所伺服。如果没有发送”Host:”头，客户端将会得到从主虚拟主机发送的信息页面。</p>
<p>请注意，这里还有一点小问题：如果客户端没有发送”Host:”头，发送到http://www.sub2.domain.tld/sub1/的请求还是会被sub1-vhost所伺服。</p>
<p>RewriteRule指令用以确保正确发送了”Host:”头的客户端可以任意使用这两种URL变量，比如说：使用或不使用URL前缀。</span></span></span></span></p>
<p><span class="postbody"><span class="postbody"><span class="postbody"><span class="postbody"><span class="postbody">当使用了大量虚拟主机，而且每个主机又使用了不同的日志文件时，Apache可能会遭遇文件描述符(有时也称为文件句柄) 耗尽的困境。Apache使用的文件描述符总数如下：每个不同的错误日志文件一个、每个其他日志文件指令一个、再加10－20个作为内部使用。Unix操作系统限制了每个进程可以使用的文件描述符数量。典型上限是64个，但可以进行扩充，直至到达一个很大的硬件限制为止(hard-limit)。</p>
<p>尽管Apache会试着增大限制，但如果发生以下情况，则这个机制无法起作用：</p>
<p>1. 您的操作系统没有提供setrlimit()系统调用。<br />
2. setrlimit(RLIMIT_NOFILE)调用无法在您的系统上正常工作(比如 Solaris 2.3)<br />
3. 文件描述符的需求量已经超出了硬件的限制。<br />
4. 您的操作系统对文件描述符作出了其他限制。比如说限制了stdio流只能使用256以下的文件描述符。(Solaris 2)</p>
<p>如果遇到了这样的问题，您可以这样解决：</p>
<p>* 减少日志文件的数量。不在&lt;VirtualHost&gt;配置段中指定日志文件，而是只在主日志文件中进行记录。(参见下述分解日志文件获得详情)<br />
* 如果您的系统因上述第1条或第2条原因不能正常工作，可以在启动Apache之前，用类似下述的脚本增大文件描述符的限制：</p>
<p>#!/bin/sh<br />
ulimit -S -n 100<br />
exec httpd</p>
<p><span style="FONT-SIZE: 18px; LINE-HEIGHT: normal"><strong>分解日志文件</strong></span></p>
<p>如果您想把多个虚拟主机的日志记录到同一个日志文件中，你可能会想事后把它们分开，以对不同的虚拟主机数据进行统计分析。您可用下述方法达到这个目的。</p>
<p>首先，您需要将虚拟主机的信息放入日志中。您可以用LogFormat指令和”%v”变量达到这个目的。在您的日志格式串的开头加入它们：</p>
<p>LogFormat “%v %h %l %u %t \”%r\” %&gt;s %b” vhost<br />
CustomLog logs/multiple_vhost_log vhost</p>
<p>这将用日志的普通格式来创建一个日志文件。但会在每条记录前加上正式的虚拟主机名(就是在ServerName指令中定义的那个)。(参见自定义日志格式以获取更多内容)</p>
<p>当您想将日志文件分开(每个虚拟主机一个日志文件)的时候，您可以使用split-logfile程序来完成这个工作。您将在Apache发行版的support目录中找到这个程序。</p>
<p>用如下命令来运行这个程序：</p>
<p>split-logfile &lt; /logs/multiple_vhost_log</p>
<p>当这个程序在给予一个虚拟主机日志文件作为参数的情况下，会为日志文件中的每个虚拟主机建立一个文件。每个文件都以”主机名.log”这样的形式命名。<br />
</span></span></span></span></span></p>
<p><span class="postbody"><span class="postbody"><span class="postbody"><span class="postbody"></span></span></span></span> </p>
<p><span class="postbody"><span class="postbody"><span class="postbody"><span class="postbody"><span class="postbody"><span class="postbody">本文档描述如何使用Apache有效的架设大批量虚拟主机。</p>
<p><span style="FONT-SIZE: 18px; LINE-HEIGHT: normal"><strong>动机</strong></span></p>
<p>如果你的配置文件httpd.conf中包含类似下面的许多&lt;VirtualHost&gt;段，并且其中的内容都大致相同的话，你应该会对这里所讲的技术感兴趣。比如：</p>
<p>NameVirtualHost 111.22.33.44<br />
&lt;VirtualHost 111.22.33.44&gt;<br />
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 />
&lt;/VirtualHost&gt;<br />
&lt;VirtualHost 111.22.33.44&gt;<br />
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 />
&lt;/VirtualHost&gt;<br />
# 等 等 等 。。。<br />
&lt;VirtualHost 111.22.33.44&gt;<br />
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 />
&lt;/VirtualHost&gt;</p>
<p>最基本的思想是用动态的机制来实现所有这些静态的&lt;VirtualHost&gt;配置段。这样做有许多优点：</p>
<p>1. 配置文件变小，使得Apache可以更快的启动，同时消耗更少的内存。<br />
2. 添加一个虚拟主机，应该只是简单的在文件系统中创建合适的目录，以及配置相关的DNS信息，且无需重新启动Apache 。</p>
<p>主要的缺点是你无法针对每个虚拟主机使用不同的日志文件。然而，如果真的在配置有大量虚拟主机的服务器上记录不同的日志文件的话，很有可能会达到操作系统所允许的最大文件描述符的数量。更好的办法是把日志写到管道或者先入先出的栈，并启用其他的进程来分拣所得到的日志信息(同时也可以做一些历史纪录的统计等等)。</p>
<p><span style="FONT-SIZE: 18px; LINE-HEIGHT: normal"><strong>概述</strong></span></p>
<p>一个虚拟主机由两部分来定义：一个是它的IP地址，还有一个是HTTP的”Host:”请求头。动态大量虚拟主机的技术，是基于自动在所要返回的文件路径中插入相关信息的想法实现的。使用mod_vhost_alias可以很容易的实现，但如果你的Apache版本低于1.3.6 ，则你必须使用mod_rewrite 。两者在默认情况下都不启用；要使用他们，必须在配置和编译Apache的阶段启用。</p>
<p>我们需要做很多”伪装”，才能使动态虚拟主机看起来像普通主机。最重要的一点是Apache使用虚拟主机名(ServerName)来生成自引用(self-referential)URL等信息。这是用ServerName指令来配置的，并且可以通过环境变量SERVER_NAME传递给CGI脚本。运行时实际使用的值是由UseCanonicalName指令的设置来控制的。当 UseCanonicalName Off 时，虚拟主机名(ServerName)取自请求中的”Host:”头。当 UseCanonicalName DNS 时，则通过DNS反解析虚拟主机的IP地址得到主机名。以前的做法是基于名称的动态虚拟主机，现在常用基于IP地址的虚拟主机。如果Apache无法判断虚拟主机名，则可能是没有”Host:”头或是DNS解析失败，这样种情况下，Apache将使用配置ServerName时所填写的主机名。</p>
<p>另一件需要”伪装”的事情是文档根目录(由DocumentRoot配置并可以通过DOCUMENT_ROOT环境变量为CGI脚本所使用)。在通常的配置方式下，这些设置信息由核心(core)模块在将URI映射到文件系统的时候使用，但是如果使用动态虚拟主机配置，这些信息将由另外一个使用不同于核心(core)模块将URI映射到文件系统的方式的模块(mod_vhost_alias或mod_rewrite)使用。这两个模块都不负责设置DOCUMENT_ROOT环境变量，所以如果CGI或SSI程序使用了DOCUMENT_ROOT环境变量，那么将得到错误的值。</p>
<p><span style="FONT-SIZE: 18px; LINE-HEIGHT: normal"><strong>简单的动态虚拟主机</strong></span></p>
<p>这是httpd.conf文件中，完成和上文动机部分所提到的虚拟主机一样效果的配置方法，但这里采用了mod_vhost_alias模块：</p>
<p># 从”Host:”头中取得主机名<br />
UseCanonicalName Off</p>
<p># 这种日志格式可以从第一个字段中提取出主机名<br />
LogFormat “%V %h %l %u %t \”%r\” %s %b” vcommon<br />
CustomLog logs/access_log vcommon</p>
<p># 在返回请求的文件名路径中包含主机名<br />
VirtualDocumentRoot /www/hosts/%0/docs<br />
VirtualScriptAlias /www/hosts/%0/cgi-bin</p>
<p>将 UseCanonicalName Off 的配置改为 UseCanonicalName DNS 即可实现基于IP地址的虚拟主机。而在文件路径中所要插入的服务器名则通过虚拟主机的IP地址解析得到。</p>
<p><span style="FONT-SIZE: 18px; LINE-HEIGHT: normal"><strong>一个实际的个人主页系统</strong></span></p>
<p>这里对上面的系统作了一点调整，便可作为ISP的个人主页服务器。我们使用了略微复杂的方法，从主机名(ServerName)中提取子字符串，并插入到文件路径中。在这个例子中www.user.isp.com的文档将在/home/user/中定位。并对所有虚拟主机使用单个cgi-bin目录。</p>
<p># 所有之前的准备事项和上面一样，然后在文件路径中包含主机名<br />
VirtualDocumentRoot /www/hosts/%2/docs</p>
<p># 单个cgi-bin目录<br />
ScriptAlias /cgi-bin/ /www/std-cgi/</p>
<p>更复杂的关于VirtualDocumentRoot的设置，可以查阅mod_vhost_alias文档。</p>
<p><span style="FONT-SIZE: 18px; LINE-HEIGHT: normal"><strong><span style="color: #ff0000;">在同一个服务器上架设多个主机的虚拟系统</span></strong></span></p>
<p>更复杂的设置，应该使用Apache的&lt;VirtualHost&gt;容器来管理各种虚拟主机配置的作用域。例如，你可以用一个IP地址来给个人主页客户使用，同时用下面的配置提供给商业客户使用。自然的，这两者通过运用&lt;VirtualHost&gt;结合到一起。</p>
<p>UseCanonicalName Off</p>
<p>LogFormat “%V %h %l %u %t \”%r\” %s %b” vcommon</p>
<p>&lt;Directory /www/commercial&gt;<br />
Options FollowSymLinks<br />
AllowOverride All<br />
&lt;/Directory&gt;</p>
<p>&lt;Directory /www/homepages&gt;<br />
Options FollowSymLinks<br />
AllowOverride None<br />
&lt;/Directory&gt;</p>
<p>&lt;VirtualHost 111.22.33.44&gt;<br />
ServerName www.commercial.isp.com</p>
<p>CustomLog logs/access_log.commercial vcommon</p>
<p>VirtualDocumentRoot /www/commercial/%0/docs<br />
VirtualScriptAlias /www/commercial/%0/cgi-bin<br />
&lt;/VirtualHost&gt;</p>
<p>&lt;VirtualHost 111.22.33.45&gt;<br />
ServerName www.homepages.isp.com</p>
<p>CustomLog logs/access_log.homepages vcommon</p>
<p>VirtualDocumentRoot /www/homepages/%0/docs<br />
ScriptAlias /cgi-bin/ /www/std-cgi/<br />
&lt;/VirtualHost&gt;</p>
<p><span style="FONT-SIZE: 18px; LINE-HEIGHT: normal"><strong><span style="color: #ff0000;">更为有效的基于IP地址的虚拟主机</span></strong></span></p>
<p>在第一个例子中说过，转为基于IP地址的虚拟主机设置很容易做到。但不幸的是，那种做法并不高效，因为这样会在每次处理请求时，需要查询DNS。通过在文件系统中包含 IP地址的做法可以避免这样的问题。这样一来，免去了和主机名的关联，在日志记录中也一样可以用IP来分离不同日志。Apache将不会为了确定主机名 (ServerName)而去做DNS查询。</p>
<p># 从IP地址反解析得到主机名<br />
UseCanonicalName DNS</p>
<p># 在日志中包含IP地址，便于以后分拣<br />
LogFormat “%A %h %l %u %t \”%r\” %s %b” vcommon<br />
CustomLog logs/access_log vcommon</p>
<p># 在文件路径中包含IP地址<br />
VirtualDocumentRootIP /www/hosts/%0/docs<br />
VirtualScriptAliasIP /www/hosts/%0/cgi-bin</p>
<p><span style="FONT-SIZE: 18px; LINE-HEIGHT: normal"><strong>使用老版本的Apache</strong></span></p>
<p>上面的例子基于mod_vhost_alias ，但它是在版本1.3.6之后才出现的。如果你的版本比较老，可以通过使用mod_rewrite来达到相同的目的，如下所示。但只能是基于”Host:”头方式的虚拟主机。</p>
<p>此外还须注意日志方面的问题。Apache1.3.6是第一个支持”%V”日志格式指令的版本，在版本1.3.0-1.3.3中，”%v”选项做和”%V”一样的事情；而在版本1.3.4中没有等价指令。在所有的这些版本中，指令UseCanonicalName可以出现在.htaccess文件中，这意味着客户的设置可能会导致日志记录紊乱。所以最好的做法是使用”%{Host}i”指令，它可以直接记录”Host:”头；注意，这样可能在末尾包含”:port”，而使用”%V”则不会这样。</p>
<p><span style="FONT-SIZE: 18px; LINE-HEIGHT: normal"><strong>使用mod_rewrite实现简单的动态虚拟主机</strong></span></p>
<p>这里的例子摘自httpd.conf ，效果等同于第一个例子中的情况。前半部分和上面的例子大致相似，只是为了向后兼容mod_rewrite作了适当修改；后半部分配置mod_rewrite来做实际的工作。</p>
<p>有些特别的地方需要注意：默认情况下，mod_rewrite在所有其他URI转换模块(mod_alias等)之前运行，所以如果使用这些模块的话，mod_rewrite必须作相应的调整。同时，我们还要为每个动态虚拟主机变些戏法，使之等效于ScriptAlias</p>
<p># 从”Host:”头获取主机名<br />
UseCanonicalName Off</p>
<p># 可分拣的日志<br />
LogFormat “%{Host}i %h %l %u %t \”%r\” %s %b” vcommon<br />
CustomLog logs/access_log vcommon</p>
<p>&lt;Directory /www/hosts&gt;<br />
# 这里需要ExecCGI ，因为我们不能强制CGI以与ScriptAlias相同的方式执行<br />
Options FollowSymLinks ExecCGI<br />
&lt;/Directory&gt;</p>
<p># 接下来是关键部分</p>
<p>RewriteEngine On</p>
<p># 来自”Host:”头的ServerName ，可能大小写混杂<br />
RewriteMap lowercase int:tolower</p>
<p>## 首先处理普通文档<br />
# 允许变名/icons/起作用，其他变名类同<br />
RewriteCond %{REQUEST_URI} !^/icons/<br />
# 允许CGI<br />
RewriteCond %{REQUEST_URI} !^/cgi-bin/<br />
# 开始”变戏法”<br />
RewriteRule ^/(.*)$ /www/hosts/${lowercase:%{SERVER_NAME}}/docs/$1</p>
<p>## 现在处理CGI(我们需要强制使用一个MIME类型)<br />
RewriteCond %{REQUEST_URI} ^/cgi-bin/<br />
RewriteRule ^/(.*)$ /www/hosts/${lowercase:%{SERVER_NAME}}/cgi-bin/$1 [T=application/x-httpd-cgi]</p>
<p># ok 了！</p>
<p><span style="FONT-SIZE: 18px; LINE-HEIGHT: normal"><strong>使用mod_rewrite的个人主页系统</strong></span></p>
<p>这里的配置完成和第二个例子相同的工作。</p>
<p>RewriteEngine on</p>
<p>RewriteMap lowercase int:tolower</p>
<p># 允许CGI工作<br />
RewriteCond %{REQUEST_URI} !^/cgi-bin/</p>
<p># 检查hostname正确与否，之后才能使RewriteRule起作用<br />
RewriteCond ${lowercase:%{SERVER_NAME}} ^www\.[a-z-]+\.isp\.com$</p>
<p># 将虚拟主机名字连接到URI的开头<br />
# [C]表明本次重写的结果将在下一个rewrite规则中使用<br />
RewriteRule ^(.+) ${lowercase:%{SERVER_NAME}}$1 [C]</p>
<p># 现在创建实际的文件名<br />
RewriteRule ^www\.([a-z-]+)\.isp\.com/(.*) /home/$1/$2</p>
<p># 定义全局CGI目录<br />
ScriptAlias /cgi-bin/ /www/std-cgi/</p>
<p><span style="FONT-SIZE: 18px; LINE-HEIGHT: normal"><strong>使用独立的虚拟主机配置文件</strong></span></p>
<p>这样的布局利用了mod_rewrite的高级特性，在独立的虚拟主机配置文件中转换。如此可以更为灵活，但需要较为复杂的设置。</p>
<p>vhost.map文件包含了类似下面的内容：</p>
<p>www.customer-1.com /www/customers/1<br />
www.customer-2.com /www/customers/2<br />
# &#8230;<br />
www.customer-N.com /www/customers/N</p>
<p>http.conf包含了：</p>
<p>RewriteEngine on</p>
<p>RewriteMap lowercase int:tolower</p>
<p># 定义映射文件<br />
RewriteMap vhost txt:/www/conf/vhost.map</p>
<p># 和上面的例子一样，处理别名<br />
RewriteCond %{REQUEST_URI} !^/icons/<br />
RewriteCond %{REQUEST_URI} !^/cgi-bin/<br />
RewriteCond ${lowercase:%{SERVER_NAME}} ^(.+)$<br />
# 这里做基于文件的重新映射<br />
RewriteCond ${vhost:%1} ^(/.*)$<br />
RewriteRule ^/(.*)$ %1/docs/$1</p>
<p>RewriteCond %{REQUEST_URI} ^/cgi-bin/<br />
RewriteCond ${lowercase:%{SERVER_NAME}} ^(.+)$<br />
RewriteCond ${vhost:%1} ^(/.*)$<br />
RewriteRule ^/(.*)$ %1/cgi-bin/$1 </span></span></span></span></span></span></p>
<p><span class="postbody"><span class="postbody"><span class="postbody"><span class="postbody"><span class="postbody"><span class="postbody"><span class="postbody">虚拟主机部分的代码在Apache 1.3中进行了完全的重写。本文档试图详细解释Apache在接受到请求后如何确定使用哪一个虚拟主机进行伺服。在新的<strong><span style="font-size: 18px; line-height: normal;">[b]<em>NameVirtualHost</em></span>[/b]指令的帮助下，虚拟主机的配置比1.3版以前更加简单和安全。</p>
<p>如果您只是想让它能够工作而不愿意进行深入理解，这里有一些示例。</p>
<p><span style="font-size: 18px; line-height: normal;"><strong>解析配置文件</strong></span></p>
<p>在&lt;VirtualHost&gt;配置段外有一个主服务器(main_server)段中包含着所有定义。其中有&lt;VirtualHost&gt;配置段中定义的叫做虚拟主机(vhost)的虚拟服务器。</p>
<p>Listen, ServerName, ServerPath, ServerAlias指令可以出现在一个服务器定义段的任何地方。而且每个指令都会覆盖前面出现的同样定义(在那个服务器配置中)。</p>
<p>主服务器段中Listen指令的默认值是80。主服务器段没有默认的ServerPath和ServerAlias指令值。ServerName的默认值是由服务器的IP地址推断而来。</p>
<p>主服务器的Listen指令有两个功能：其一是决定Apache将要绑定的网络端口；其二是在重定向中指定绝对URI将使用的端口号。</p>
<p>不象在主服务器里，虚拟服务器的端口不会影响到Apache的监听端口。</p>
<p>每个VirtualHost指令中的地址都可以附带一个可选的端口。如果没有进行特别的指定，这个端口默认为主服务器中最近的一个Listen指令指定的值。特殊的端口”*”表示匹配所有端口。所有这一系列地址(包括由DNS查询出的所有A记录)统称虚拟主机的地址集(address set)。</p>
<p>如果没有对一个特定的IP地址使用NameVirtualHost指令，那么第一个使用这个地址的虚拟主机将被视为基于IP的虚拟主机。IP地址也可以用通配符”*”表示。</p>
<p>如果使用了基于域名的虚拟主机，那么必须用NameVirtualHost指令为这个基于域名的虚拟主机指定IP地址集。换句话说，您必须在配置文件中通过NameVirtualHost指令指定包括主机名映射(CNAME)的IP地址。</p>
<p>可以使用很多NameVirtualHost指令来分别对应一套NameVirtualHost指令，但对于每个特定的”IP:port”对来说，只能使用一次NameVirtualHost指令。</p>
<p>NameVirtualHost和VirtualHost指令出现的顺序并不重要。只有对应同一个IP地址的VirtualHost指令的次序才是重要的。所以下面两例所起的作用是完全相同的：<br />
<textarea class="java" cols="60" rows="10" name="code">NameVirtualHost 111.22.33.44 &lt;VirtualHost 111.22.33.44&gt; # server A &#8230; &lt;/VirtualHost&gt; &lt;VirtualHost 111.22.33.44&gt; # server B &#8230; &lt;/VirtualHost&gt;  NameVirtualHost 111.22.33.55 &lt;VirtualHost 111.22.33.55&gt; # server C &#8230; &lt;/VirtualHost&gt; &lt;VirtualHost 111.22.33.55&gt; # server D &#8230; &lt;/VirtualHost&gt; </textarea><br />
<textarea class="java" cols="60" rows="10" name="code">&lt;VirtualHost 111.22.33.44&gt; # server A &lt;/VirtualHost&gt; &lt;VirtualHost 111.22.33.55&gt; # server C &#8230; &lt;/VirtualHost&gt; &lt;VirtualHost 111.22.33.44&gt; # server B &#8230; &lt;/VirtualHost&gt; &lt;VirtualHost 111.22.33.55&gt; # server D &#8230; &lt;/VirtualHost&gt;  NameVirtualHost 111.22.33.44 NameVirtualHost 111.22.33.55 </textarea><br />
(为了使您的配置文件更具可读性，我们推荐您使用左边的格式)</p>
<p>在解析完VirtualHost指令后，虚拟主机服务器将被赋予在它的VirtualHost指令中第一个名字对应的端口作为默认的Listen端口。</p>
<p>如果所有域名都指向同一个地址集的话，VirtualHost指令中的所有域名列表都将会得到和ServerAlias指令一样的处理(但不会被其他ServerAlias语句覆盖)。请注意，这个虚拟主机自带的Listen指令将不能影响到那个地址集的端口号。</p>
<p>在初始化的过程中，将会为每一个IP地址产生一个列表，并插入到一个散列表中。如果这个IP地址是用在一个NameVirtualHost指令中的，这个列表将会包含所有指定为这个IP地址的基于域名的虚拟主机。如果没有虚拟主机针对这个IP地址，那么NameVirtualHost指令将被忽略，并会在日志中记录一个错误信息。对于基于IP的虚拟主机而言，这个散列表中的列表为空。</p>
<p>因为使用了高效的散列算法，使得在请求到达的时候在其中查找IP地址的开销变得很小，或者根本不需考虑。而且这个表格还为只有最后一个八进制位不同的IP地址做了优化。</p>
<p>虚拟主机的每个变量都有初始值。特别是以下这些：</p>
<p>1. 如果虚拟主机没有ServerAdmin, ResourceConfig, AccessConfig, Timeout, KeepAliveTimeout, KeepAlive, MaxKeepAliveRequests, ReceiveBufferSize, SendBufferSize指令，那么将从主服务器继承它们的值。(也就是说，使用在主服务器中最后出现的设定值)。<br />
2. 虚拟主机的默认目录权限将继承主服务器的设置(包括所有模块针对每个目录的配置信息)。<br />
3. 虚拟主机将继承主服务器中每个模块针对主服务器的设置。</p>
<p>本质上，主服务器在建立每个虚拟主机的时候，充当了一个默认值或根基的角色。但这些存在于主服务器中的定义的位置是无关紧要的——主服务器的配置在与虚拟主机整合之前就已经解析过了。所以即使一个主服务器的配置出现在虚拟主机定义的后面，它也同样会影响到虚拟主机的配置。</p>
<p>如果没有定义主服务器中的ServerName ，那么将由运行这个httpd服务的机器的主机名来代替。我们将由DNS查找此ServerName返回的IP地址称为主服务器地址集(main_server address set)。</p>
<p>在没有定义ServerName的情况下，一个基于域名的虚拟主机默认采用定义虚拟主机时在VirtualHost指令中最先出现的地址。</p>
<p>所有使用了”_default_”通配符的虚拟主机将被赋予和主服务器相同的ServerName 。</p>
<p><span style="font-size: 18px; line-height: normal;"><strong>虚拟主机匹配</strong></span></p>
<p>服务器用下述方法来确定对一个特定的请求使用哪个虚拟主机：<br />
</strong><strong>散列表查找</strong></p>
<p>当客户端第一次连接的时候，会从内部的IP散列表中查找客户端想要连接的IP地址。</p>
<p>如果查找失败(没有找到相应的IP地址)，而所请求的端口又存在一个”_default_”虚拟主机，那么这个请求将会由这个虚拟主机来伺服。如果没有找到这样的”_default_”虚拟主机，那么这个请求将会由主服务器来伺服。</p>
<p>如果在散列表中没有找到IP地址，但存在一个”NameVirtualHost *”指令与所请求的端口号相匹配，那么将用这个虚拟主机来处理这个请求。</p>
<p>如果查找成功(找到了对应于这个IP地址的列表)，下一步就是看我们要处理的是一个基于IP的虚拟主机还是一个基于域名的虚拟主机。<br />
<strong>基于IP的虚拟主机</strong></p>
<p>如果返回的列表中域名列表为空，那么我们处理的就是一个基于IP的虚拟主机，这个虚拟主机将会直接进行处理而不会有其他步骤。<br />
<strong>基于域名的虚拟主机</strong></p>
<p>如果返回的域名列表包含一个或多个虚拟主机的结构，那么我们处理的就是一个基于域名的虚拟主机。这个列表包含的虚拟主机的顺序与配置文件中相应VirtualHost指令出现的顺序是相同的。</p>
<p>这个列表中第一个虚拟主机(也就是在配置文件中第一个指定了这个IP地址的虚拟主机)对处理请求有着最高的优先级。所有对未知服务器名或没有”Host:”头的请求都将由它进行处理。</p>
<p>如果客户端在请求中提供了一个”Host:”头，那么将在列表中查找第一个ServerName或ServerAlias与其符合的虚拟主机，并将其用于伺服这个请求。尽管”Host:”头中可以包含端口号，但Apache还是会用收到请求的那个真实端口来进行匹配。</p>
<p>如果客户端提交了一个不包含”Host:”头的HTTP/1.0的请求，我们将无法确认客户端想要连接那个服务器。而如果存在一个ServerPath与客户端提交的请求中的URI相对应，那么列表中第一个符合条件的虚拟主机将用于伺服这个请求。</p>
<p>如果还是找不到对应的虚拟主机，那么这个请求将会由客户端连接的IP对应的列表中的第一个与请求的端口相同的虚拟主机来伺服(如前所述)。<br />
<strong>持久连接</strong></p>
<p>上述IP查找对一个特定的TCP/IP进程只执行一次。但在持久连接(KeepAlive)中，每个请求都会进行一次这样的查找过程。换句话说，一个客户端在一个持久连接中可以向位于不同的基于域名的虚拟主机的页面提出请求。<br />
<strong>绝对URI</strong></p>
<p>如果请求提交的URI是一个绝对URI，而其中的主机名和端口号又和主服务器或某个虚拟主机相符合，并且也与作为此请求提交对象的地址和端口相符，那么这个请求的类型/主机名/端口前缀将被抹除，仅留下相对URI为对应的主服务器或虚拟主机所伺服。如果不满足上述符合条件，这个URI将保留原样，而此请求将被作为一个代理请求处理。<br />
<span style="font-size: 18px; line-height: normal;"><strong>备忘录</strong></span></p>
<p>* 基于域名的虚拟主机和基于IP的虚拟主机之间互相不干扰。基于IP的虚拟主机只接受发送到它自身地址集的请求，而不接受其他IP地址。基于域名的虚拟主机也是一样，它们只接受NameVirtualHost指令定义的地址集的访问。<br />
* 永远不会对一个基于IP的虚拟主机执行ServerAlias和ServerPath检查。<br />
* 在配置文件中，基于域名的虚拟主机、基于IP的虚拟主机、”_default_”虚拟主机和NameVirtualHost指令出现的顺序并不重要。而对于某个指定的地址集来说，基于域名的虚拟主机的顺序是不能混淆的：在配置文件中较先出现的虚拟主机在相应的地址集中有较高的优先权。<br />
* 出于安全性的考虑，在”Host:”头中出现的端口号将不用于匹配。Apache会一直使用客户端所连接的真实端口作为匹配。<br />
* 如果一个ServerPath指令凑巧是后面出现的另外一个ServerPath指令的前缀，前者将用于匹配，而后者将被忽略。(这里讨论的是没有”Host:”头来将这两个情况分开的情况下)<br />
* 如果有两个基于IP的虚拟主机使用了同一个地址，则在配置文件中首先出现的那个用于匹配。这种事情可能发生在你疏忽的时候。当服务器遇到这种情况的时候，会在日志文件中写入一个错误信息。<br />
* 仅当没有其他虚拟主机符合客户端请求的IP地址和端口号时，”_default_”虚拟主机才会捕获这个请求。并且仅当”_default_”虚拟主机的端口号(默认值由您的Listen指定)与客户端发送请求的目的端口号相符时，这个请求才会被捕获。也可以使用通配符(例如：”_default_:*”)来捕获任何端口号的请求。这也同样适用于”NameVirtualHost *”的虚拟主机。<br />
* 仅当客户端连接的目的IP地址和端口号没有指定而且不与任何一个虚拟主机(包括”_default_”虚拟主机)匹配的时候，才会用主服务器来伺服请求。换句话说，主服务器仅捕获没有指定IP地址和端口的请求(除非存在一个匹配端口的”_default_”虚拟主机)。<br />
* 如果客户端连接到一个用于基于域名的虚拟主机使用的地址(和端口)，比如说使用了NameVirtualHost指令，那么一个未知的或没有”Host:”头的请求就不会与”_default_”虚拟主机或是主服务器相匹配。<br />
* 绝对不能在VirtualHost指令中使用DNS名称，否则您的服务器就会依赖DNS来进行启动。而且，如果您无法控制列表中所有的域，您将会面临安全威胁。您可以在这里获得关于这个问题和以下两个问题的更多详情。<br />
* 应当为每个虚拟主机设定ServerName 。否则就会需要为每个虚拟主机进行DNS查询。</p>
<p><span style="font-size: 18px; line-height: normal;"><strong>小技巧</strong><br />
</span><br />
作为DNS问题页面小技巧的附加，这里有些额外的技巧：</p>
<p>* 将所有主服务器的定义放在所有VirtualHost定义之前(为了增加可读性)，否则会使得类似在虚拟主机旁边的定义影响到所有的虚拟主机这样的问题不容易发现。<br />
* 将您配置中相应的NameVirtualHost和VirtualHost定义放到一起，以获得更好的可读性。<br />
* 避免前一个ServerPaths是后一个ServerPaths的前缀。如果您无法避免这样的情况，您最好确保在您的配置文件中”长在前，短在后”(也就是说：”ServerPath/abc/def”应当出现在”ServerPath/abc”之前)。<br />
</span></span></span></span></span></span></span></p>
<p><span class="postbody"><span class="postbody"><span class="postbody"><span class="postbody"><span class="postbody"><span class="postbody">来自:http://bbs.163jsp.com/posts/list/509.html;jsessionid=957967622CCF46F0D648E16BC4C0659E</span></span></span></span></span></span></p>
<p><span class="postbody"><span class="postbody"><span class="postbody"><span class="postbody"><span class="postbody"><span class="postbody"><!--more--><br />
</span><!-- Attachments --></span><!-- Attachments --></span></span><!-- Attachments --></span></span></p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.ptubuntu.com%2F2008%2F12%2F970.html&amp;title=Apache2.2%20%E8%99%9A%E6%8B%9F%E4%B8%BB%E6%9C%BA%E6%96%87%E6%A1%A3" id="wpa2a_4"><img src="http://www.ptubuntu.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.ptubuntu.com/2008/12/970.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Ubuntu 9.04 安装Cherokee Web 服务器(PHP 5+MySQL 5)</title>
		<link>http://www.ptubuntu.com/2008/12/624.html</link>
		<comments>http://www.ptubuntu.com/2008/12/624.html#comments</comments>
		<pubDate>Tue, 02 Dec 2008 12:53:35 +0000</pubDate>
		<dc:creator>ptubuntu</dc:creator>
				<category><![CDATA[Apache&php&Ftp]]></category>
		<category><![CDATA[Linux Server]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[www]]></category>
		<category><![CDATA[技术类]]></category>

		<guid isPermaLink="false">http://www.ptubuntu.com/?p=624</guid>
		<description><![CDATA[基于ubntu9.04[g++/gcc] 1.安装MySQL   #apt-get install mysql-server-5.0 mysql-client 2.设置MySQL&#8217;s root 用户密码. 3.安装PHP   #apt-get install php5-cgi   #apt-get install php5-mysql 4.安装一些需要的安装包.   #apt-get install cpp gcc g++ make 5.安装.Cherokee web 服务器.    # apt-get install cherokee Reading package lists&#8230; Done Building dependency tree Reading state information&#8230; Done The following extra packages will be installed:   libcherokee-base0 [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.ptubuntu.com/wp-content/uploads/2008/12/cherokee1.png" rel="shadowbox[sbpost-624];player=img;"><img class="alignnone size-medium wp-image-629" title="cherokee1" src="http://www.ptubuntu.com/wp-content/uploads/2008/12/cherokee1.png" alt="" width="350" height="136" /></a></p>
<p>基于ubntu9.04[g++/gcc]</p>
<p>1.安装MySQL<br />
  #apt-get install mysql-server-5.0 mysql-client</p>
<p>2.设置MySQL&#8217;s root 用户密码.</p>
<p>3.安装PHP<br />
  #apt-get install php5-cgi<br />
  #apt-get install php5-mysql</p>
<p><span id="more-624"></span></p>
<p>4.安装一些需要的安装包.<br />
  #apt-get install cpp gcc g++ make</p>
<p>5.安装.Cherokee web 服务器.<br />
   # apt-get install cherokee<br />
<span style="color: #33cccc;">Reading package lists&#8230; Done<br />
Building dependency tree<br />
Reading state information&#8230; Done<br />
The following extra packages will be installed:<br />
  libcherokee-base0 libcherokee-client0 libcherokee-config0<br />
  libcherokee-server0<br />
The following NEW packages will be installed:<br />
  cherokee libcherokee-base0 libcherokee-client0 libcherokee-config0<br />
  libcherokee-server0<br />
0 upgraded, 5 newly installed, 0 to remove and 242 not upgraded.<br />
Need to get 3052kB of archives.<br />
After this operation, 6808kB of additional disk space will be used.<br />
Do you want to continue [Y/n]? y</span></p>
<p>6.查看系统启动进端口<br />
  # netstat -atl<br />
<span style="color: #33cccc;">Active Internet connections (servers and established)<br />
Proto Recv-Q Send-Q Local Address           Foreign Address         State<br />
tcp        0      0 localhost:mysql         *:*                     LISTEN<br />
tcp        0      0 *:ssh                   *:*                     LISTEN<br />
tcp        0      0 localhost:ipp           *:*                     LISTEN<br />
tcp        0      0 ptubuntu.ptubuntu.c:ssh 192.168.0.103:4840      ESTABLISHED<br />
tcp        0    132 ptubuntu.ptubuntu.c:ssh 192.168.0.103:1754      ESTABLISHED<br />
tcp        0      1 ptubuntu.ptubuntu:34387 lithium.canonical.c:<a href="http://www.ptubuntu.com/tag/www" class="st_tag internal_tag" rel="tag" title="标签 www 下的日志">www</a> FIN_WAIT1<br />
tcp        0      0 ptubuntu.ptubuntu.c:ssh 202.131.68.91:49913     ESTABLISHED<br />
tcp6       0      0 [::]:www                [::]:*                  LISTEN<br />
tcp6       0      0 [::]:ssh                [::]:*                  LISTEN</span></p>
<p>7.输入你的服务器的IP地址.可以显示如下.<br />
<img class="alignnone size-medium wp-image-630" title="cherokee" src="http://www.ptubuntu.com/wp-content/uploads/2008/12/cherokee-499x451.jpg" alt="" width="499" height="451" /><a href="http://www.ptubuntu.com/wp-content/uploads/2008/12/cherokee1.png" rel="shadowbox[sbpost-624];player=img;"></a></p>
<p>8.WEB管理cherokee 服务器.要启动cherokee</p>
<p># cherokee-admin -b</p>
<p>Login:<br />
  User:              admin<br />
  One-time Password: xusWEshjBPoFC0Gl</p>
<p>Cherokee Web Server 0.10.1 (Nov  5 2008): Listening on port 9090, TLS disabled,<br />
IPv6 disabled, using epoll, 1024 fds system limit, max. 505 connections,<br />
single thread</p>
<p>接着打开网页.端口:http://192.168.0.4:9090</p>
<p><img class="alignnone size-medium wp-image-631" title="cherokee2" src="http://www.ptubuntu.com/wp-content/uploads/2008/12/cherokee2.jpg" alt="" width="437" height="276" /></p>
<p>A:进入cherokee-admin管理介面.</p>
<p><img class="alignnone size-medium wp-image-632" title="cherokee3" src="http://www.ptubuntu.com/wp-content/uploads/2008/12/cherokee3-500x369.jpg" alt="" width="500" height="369" /></p>
<p> </p>
<p>B:这个主要配置端口号和用户.</p>
<p><img class="alignnone size-medium wp-image-638" title="cherokee4" src="http://www.ptubuntu.com/wp-content/uploads/2008/12/cherokee4-499x560.jpg" alt="" width="499" height="560" /></p>
<p>C:这里添加虚拟主机.</p>
<p><a href="http://www.ptubuntu.com/wp-content/uploads/2008/12/cherokee5.jpg" rel="shadowbox[sbpost-624];player=img;"><img class="alignnone size-medium wp-image-639" title="cherokee5" src="http://www.ptubuntu.com/wp-content/uploads/2008/12/cherokee5-500x324.jpg" alt="" width="500" height="324" /></a></p>
<p>D:下面这个是设置虚拟主机的配置文件.</p>
<p><a href="http://www.ptubuntu.com/wp-content/uploads/2008/12/cherokee6.jpg" rel="shadowbox[sbpost-624];player=img;"><img class="alignnone size-medium wp-image-640" title="cherokee6" src="http://www.ptubuntu.com/wp-content/uploads/2008/12/cherokee6-500x490.jpg" alt="" width="500" height="490" /></a></p>
<p>E:配置PHP环境变量.点进入PHP里还可以有很多设置.</p>
<p><a href="http://www.ptubuntu.com/wp-content/uploads/2008/12/cherokee7.jpg" rel="shadowbox[sbpost-624];player=img;"><img class="alignnone size-medium wp-image-641" title="cherokee7" src="http://www.ptubuntu.com/wp-content/uploads/2008/12/cherokee7-500x490.jpg" alt="" width="500" height="490" /></a></p>
<p>F:配置网页支持的图片格式.</p>
<p><a href="http://www.ptubuntu.com/wp-content/uploads/2008/12/cherokee8.jpg" rel="shadowbox[sbpost-624];player=img;"><img class="alignnone size-medium wp-image-642" title="cherokee8" src="http://www.ptubuntu.com/wp-content/uploads/2008/12/cherokee8-456x600.jpg" alt="" width="456" height="600" /></a></p>
<p>I:这个设置支持显示类型.</p>
<p><a href="http://www.ptubuntu.com/wp-content/uploads/2008/12/cherokee9.jpg" rel="shadowbox[sbpost-624];player=img;"><img class="alignnone size-medium wp-image-643" title="cherokee9" src="http://www.ptubuntu.com/wp-content/uploads/2008/12/cherokee9-500x481.jpg" alt="" width="500" height="481" /></a></p>
<p>里面有很多配置文档.如果你想要了解的更多.那你也去安装一个吧.很简的.</p>
<p>转载请注明来自:http://www.ptubuntu.com</p>
<p><!--more--></p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.ptubuntu.com%2F2008%2F12%2F624.html&amp;title=Ubuntu%209.04%20%E5%AE%89%E8%A3%85Cherokee%20Web%20%E6%9C%8D%E5%8A%A1%E5%99%A8%28PHP%205%2BMySQL%205%29" id="wpa2a_6"><img src="http://www.ptubuntu.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.ptubuntu.com/2008/12/624.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>架设Nginx 0.7.x + PHP 5.2.6（FastCGI）</title>
		<link>http://www.ptubuntu.com/2008/11/330.html</link>
		<comments>http://www.ptubuntu.com/2008/11/330.html#comments</comments>
		<pubDate>Wed, 05 Nov 2008 10:00:23 +0000</pubDate>
		<dc:creator>ruijin</dc:creator>
				<category><![CDATA[Linux Server]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Nginx]]></category>
		<category><![CDATA[www]]></category>
		<category><![CDATA[技术类]]></category>

		<guid isPermaLink="false">http://blog.ptubuntu.com/?p=330</guid>
		<description><![CDATA[前言：本文是我撰写的关于搭建“Nginx + PHP（FastCGI）”Web服务器的第4篇文章。本系列文章作为国内最早详细介绍 Nginx + PHP 安装、配置、使用的资料之一，为推动 Nginx 在国内的发展产生了积极的作用。这是一篇关于Nginx 0.7.x系列版本的文章，安装、配置方式与第3篇文章相差不大，但配置参数有不同。Nginx 0.7.x系列版本虽然为开发版，但在很多大型网站的生产环境中已经使用。 链接：《2007年9月的第1版》、《2007年12月的第2版》、《2008年6月的第3版》 Nginx (“engine x”) 是一个高性能的 HTTP 和反向代理服务器，也是一个 IMAP/POP3/SMTP 代理服务器。 Nginx 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的，它已经在该站点运行超过两年半了。Igor 将源代码以类BSD许可证的形式发布。 Nginx 超越 Apache 的高性能和稳定性，使得国内使用 Nginx 作为 Web 服务器的网站也越来越多，其中包括新浪博客、新浪播客、网易新闻等门户网站频道，六间房、56.com等视频分享网站，Discuz!官方论坛、水木社区等知名论坛，豆瓣、YUPOO相册、海内SNS、迅雷在线等新兴Web 2.0网站。 Nginx 的官方中文维基：http://wiki.codemongers.com/NginxChs 在高并发连接的情况下，Nginx是Apache服务器不错的替代品。Nginx同时也可以作为7层负载均衡服务器来使用。根据我的测试结果，Nginx 0.7.19 + PHP 5.2.6 (FastCGI) 可以承受3万以上的并发连接数，相当于同等环境下Apache的10倍。 根据我的经验，4GB内存的服务器+Apache（prefork模式）一般只能处理3000个并发连接，因为它们将占用3GB以上的内存，还得为系统 预留1GB的内存。我曾经就有两台Apache服务器，因为在配置文件中设置的MaxClients为4000，当Apache并发连接数达到3800 时，导致服务器内存和Swap空间用满而崩溃。 而这台 Nginx 0.7.19 + PHP 5.2.6 [...]]]></description>
			<content:encoded><![CDATA[<p>前言：本文是我撰写的关于搭建“<a href="http://www.ptubuntu.com/tag/nginx" class="st_tag internal_tag" rel="tag" title="标签 Nginx 下的日志">Nginx</a> + PHP（FastCGI）”Web服务器的第4篇文章。本系列文章作为国内最早详细介绍 <a href="http://www.ptubuntu.com/tag/nginx" class="st_tag internal_tag" rel="tag" title="标签 Nginx 下的日志">Nginx</a> + PHP 安装、配置、使用的资料之一，为推动 <a href="http://www.ptubuntu.com/tag/nginx" class="st_tag internal_tag" rel="tag" title="标签 Nginx 下的日志">Nginx</a> 在国内的发展产生了积极的作用。这是一篇关于Nginx 0.7.x系列版本的文章，安装、配置方式与第3篇文章相差不大，但配置参数有不同。<a href="http://www.ptubuntu.com/tag/nginx" class="st_tag internal_tag" rel="tag" title="标签 Nginx 下的日志">Nginx</a> 0.7.x系列版本虽然为开发版，但在很多大型网站的生产环境中已经使用。</p>
<p>链接：《<a href="http://blog.s135.com/read.php/297.htm" target="_blank">2007年9月的第1版</a>》、《<a href="http://blog.s135.com/read.php/314.htm" target="_blank">2007年12月的第2版</a>》、《<a href="http://blog.s135.com/read.php/351.htm" target="_blank">2008年6月的第3版</a>》</p>
<p><a href="http://blog.s135.com/attachment/200806/nginx.png" rel="shadowbox[sbpost-330];player=img;" target="_blank"><img class="insertimage" title="点击在新窗口中浏览此图片" src="http://blog.s135.com/attachment/200806/nginx.png" border="0" alt="点击在新窗口中浏览此图片" /></a></p>
<p><a href="http://www.nginx.net/" target="_blank">Nginx</a> (“engine x”) 是一个高性能的 HTTP 和反向代理服务器，也是一个 IMAP/POP3/SMTP 代理服务器。 Nginx 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的，它已经在该站点运行超过两年半了。Igor 将源代码以类BSD许可证的形式发布。<span id="more-330"></span></p>
<p>Nginx 超越 <a href="http://www.ptubuntu.com/tag/apache" class="st_tag internal_tag" rel="tag" title="标签 apache 下的日志">Apache</a> 的高性能和稳定性，使得国内使用 Nginx 作为 Web 服务器的网站也越来越多，其中包括<a href="http://blog.sina.com.cn/" target="_blank">新浪博客</a>、<a href="http://v.sina.com.cn/" target="_blank">新浪播客</a>、<a href="http://news.163.com/" target="_blank">网易新闻</a>等门户网站频道，<a href="http://www.6.cn/" target="_blank">六间房</a>、<a href="http://www.56.com/" target="_blank">56.com</a>等视频分享网站，<a href="http://www.discuz.net/" target="_blank">Discuz!官方论坛</a>、<a href="http://www.newsmth.net/" target="_blank">水木社区</a>等知名论坛，<a href="http://www.douban.com/" target="_blank">豆瓣</a>、<a href="http://www.yupoo.com/" target="_blank">YUPOO相册</a>、<a href="http://www.hainei.com/" target="_blank">海内SNS</a>、<a href="http://www.xunlei.com/" target="_blank">迅雷在线</a>等新兴Web 2.0网站。</p>
<hr />Nginx 的官方中文维基：<a href="http://wiki.codemongers.com/NginxChs" target="_blank">http://wiki.codemongers.com/NginxChs</a></p>
<hr /><!--more--><br />
在高并发连接的情况下，Nginx是Apache服务器不错的替代品。Nginx同时也可以作为7层负载均衡服务器来使用。根据我的测试结果，<strong>Nginx 0.7.19 + PHP 5.2.6 (FastCGI) 可以承受3万以上的并发连接数，相当于同等环境下Apache的10倍</strong>。</p>
<p>根据我的经验，4GB内存的服务器+Apache（prefork模式）一般只能处理3000个并发连接，因为它们将占用3GB以上的内存，还得为系统 预留1GB的内存。我曾经就有两台Apache服务器，因为在配置文件中设置的MaxClients为4000，当Apache并发连接数达到3800 时，导致服务器内存和Swap空间用满而崩溃。</p>
<p>而这台 Nginx 0.7.19 + PHP 5.2.6 (FastCGI) 服务器在3万并发连接下，开启的10个Nginx进程消耗150M内存（15M*10=150M），开启的64个php-cgi进程消耗1280M内存 （20M*64=1280M），加上系统自身消耗的内存，总共消耗不到2GB内存。如果服务器内存较小，完全可以只开启25个php-cgi进程，这样 php-cgi消耗的总内存数才500M。</p>
<p>在3万并发连接下，访问Nginx 0.7.19 + PHP 5.2.6 (FastCGI) 服务器的PHP程序，仍然速度飞快。下图为Nginx的状态监控页面，显示的活动连接数为28457（关于Nginx的监控页配置，会在本文接下来所给出 的Nginx配置文件中写明）：</p>
<p><a href="http://blog.s135.com/attachment/200712/nginx_status.png" rel="shadowbox[sbpost-330];player=img;" target="_blank"><img class="insertimage" title="点击在新窗口中浏览此图片" src="http://blog.s135.com/attachment/200712/nginx_status.png" border="0" alt="点击在新窗口中浏览此图片" /></a></p>
<p>我生产环境下的两台Nginx + PHP5（FastCGI）服务器，跑多个一般复杂的纯PHP动态程序，单台Nginx + PHP5（FastCGI）服务器跑PHP动态程序的处理能力已经超过“<span style="color: #ff0000;">700次请求/秒</span>”，相当于每天可以承受6000万（700*60*60*24=60480000）的访问量（<a href="http://blog.s135.com/read.php/334.htm" target="_blank">更多信息见此</a>），而服务器的系统负载也不高：</p>
<p><a href="http://blog.s135.com/attachment/200803/nginx_php_la.gif" rel="shadowbox[sbpost-330];player=img;" target="_blank"><img class="insertimage" title="点击在新窗口中浏览此图片" src="http://blog.s135.com/attachment/200803/nginx_php_la.gif" border="0" alt="点击在新窗口中浏览此图片" /></a></p>
<hr />安装步骤：<br />
（系统要求：<a href="http://www.ptubuntu.com/tag/linx" class="st_tag internal_tag" rel="tag" title="标签 Linux 下的日志">Linux</a> 2.6+ 内核，本文中的Linux操作系统为CentOS 5.1，另在RedHat AS4上也安装成功）</p>
<p><strong>一、获取相关开源程序：</strong><br />
1、利用CentOS Linux系统自带的yum命令安装、升级所需的程序库（RedHat等其他Linux发行版可从安装光盘中找到这些程序库的RPM包，进行安装）：</p>
<div style="border: 1px dashed #00a0c6; margin: 5px 5px 0px; padding: 3px; background-color: #ffffff;">sudo -s<br />
LANG=C<br />
yum -y install gcc gcc-c++ autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurses ncurses-devel curl curl-devel</div>
<p>2、RedHat等其他Linux发行版 可从安装光盘中找到这些程序库的RPM包（事先可通过类似“rpm -qa | grep libjpeg”的命令查看所需的RPM包是否存在，通常是“xxx-devel”不存在，需要安装）。RedHat可以直接利用CentOS的RPM包 安装，以下是RPM包下载网址：<br />
①、RedHat AS4 &amp; CentOS 4<br />
<a href="http://mirror.be10.com/centos/4/os/i386/CentOS/RPMS/" target="_blank">http://mirror.be10.com/centos/4/os/i386/CentOS/RPMS/</a><br />
<a href="http://mirror.be10.com/centos/4/os/x86_64/CentOS/RPMS/" target="_blank">http://mirror.be10.com/centos/4/os/x86_64/CentOS/RPMS/</a></p>
<p>②、RedHat AS5 &amp; CentOS 5<br />
<a href="http://mirror.be10.com/centos/5/os/i386/CentOS/" target="_blank">http://mirror.be10.com/centos/5/os/i386/CentOS/</a><br />
<a href="http://mirror.be10.com/centos/5/os/x86_64/CentOS/" target="_blank">http://mirror.be10.com/centos/5/os/x86_64/CentOS/</a></p>
<p>③、RPM包搜索网站<br />
<a href="http://rpm.pbone.net/" target="_blank">http://rpm.pbone.net/</a><br />
<a href="http://www.rpmfind.net/" target="_blank">http://www.rpmfind.net/</a></p>
<p>3、下载程序源码包：<br />
本文中提到的所有开源软件为截止到2008年8月28日的最新稳定版。<br />
①、从软件的官方网站下载：</p>
<div style="border: 1px dashed #00a0c6; margin: 5px 5px 0px; padding: 3px; background-color: #ffffff;">mkdir -p /data0/software<br />
cd /data0/software<br />
wget <a href="http://sysoev.ru/nginx/nginx-0.7.19.tar.gz" target="_blank">http://sysoev.ru/nginx/nginx-0.7.19.tar.gz</a><br />
wget <a href="http://www.php.net/get/php-5.2.6.tar.gz/from/this/mirror" target="_blank">http://www.php.net/get/php-5.2.6.tar.gz/from/this/mirror</a><br />
wget <a href="http://php-fpm.anight.org/downloads/head/php-5.2.6-fpm-0.5.9.diff.gz" target="_blank">http://php-fpm.anight.org/downloads/head/php-5.2.6-fpm-0.5.9.diff.gz</a><br />
wget <a href="http://dev.mysql.com/get/Downloads/MySQL-5.1/mysql-5.1.29-rc.tar.gz/from/http://mirror.x10.com/mirror/mysql/" target="_blank">http://dev.mysql.com/get/Downloads/MySQL-5.1/mysql-5.1.29-rc.tar.gz/from/http://mirror.x10.com/mirror/mysql/</a><br />
wget <a href="http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.12.tar.gz" target="_blank">http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.12.tar.gz</a><br />
wget “http://downloads.sourceforge.net/mcrypt/libmcrypt-2.5.8.tar.gz?modtime=1171868460&amp;big_mirror=0&#8243;<br />
wget “http://downloads.sourceforge.net/mcrypt/mcrypt-2.6.7.tar.gz?modtime=1194463373&amp;big_mirror=0&#8243;<br />
wget <a href="http://pecl.php.net/get/memcache-2.2.3.tgz" target="_blank">http://pecl.php.net/get/memcache-2.2.3.tgz</a><br />
wget “http://downloads.sourceforge.net/mhash/mhash-0.9.9.tar.gz?modtime=1175740843&amp;big_mirror=0&#8243;<br />
wget <a href="ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-7.7.tar.gz" target="_blank">ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-7.7.tar.gz</a><br />
wget <a href="http://bart.eaccelerator.net/source/0.9.5.3/eaccelerator-0.9.5.3.tar.bz2" target="_blank">http://bart.eaccelerator.net/source/0.9.5.3/eaccelerator-0.9.5.3.tar.bz2</a></div>
<p>②、从<a href="http://blog.s135.com/" target="_blank">blog.s135.com</a>下载（比较稳定，只允许在本站，或者在Linux/Unix下通过Wget、Curl等命令下载以下软件）：</p>
<div style="border: 1px dashed #00a0c6; margin: 5px 5px 0px; padding: 3px; background-color: #ffffff;">mkdir -p /data0/software<br />
cd /data0/software<br />
wget <a href="http://blog.s135.com/soft/linux/nginx_php/nginx/nginx-0.7.19.tar.gz" target="_blank">http://blog.s135.com/soft/linux/nginx_php/nginx/nginx-0.7.19.tar.gz</a><br />
wget <a href="http://blog.s135.com/soft/linux/nginx_php/php/php-5.2.6.tar.gz" target="_blank">http://blog.s135.com/soft/linux/nginx_php/php/php-5.2.6.tar.gz</a><br />
wget <a href="http://blog.s135.com/soft/linux/nginx_php/phpfpm/php-5.2.6-fpm-0.5.9.diff.gz" target="_blank">http://blog.s135.com/soft/linux/nginx_php/phpfpm/php-5.2.6-fpm-0.5.9.diff.gz</a><br />
wget <a href="http://blog.s135.com/soft/linux/nginx_php/mysql/mysql-5.1.29-rc.tar.gz" target="_blank">http://blog.s135.com/soft/linux/nginx_php/mysql/mysql-5.1.29-rc.tar.gz</a><br />
wget <a href="http://blog.s135.com/soft/linux/nginx_php/libiconv/libiconv-1.12.tar.gz" target="_blank">http://blog.s135.com/soft/linux/nginx_php/libiconv/libiconv-1.12.tar.gz</a><br />
wget <a href="http://blog.s135.com/soft/linux/nginx_php/mcrypt/libmcrypt-2.5.8.tar.gz" target="_blank">http://blog.s135.com/soft/linux/nginx_php/mcrypt/libmcrypt-2.5.8.tar.gz</a><br />
wget <a href="http://blog.s135.com/soft/linux/nginx_php/mcrypt/mcrypt-2.6.7.tar.gz" target="_blank">http://blog.s135.com/soft/linux/nginx_php/mcrypt/mcrypt-2.6.7.tar.gz</a><br />
wget <a href="http://blog.s135.com/soft/linux/nginx_php/memcache/memcache-2.2.3.tgz" target="_blank">http://blog.s135.com/soft/linux/nginx_php/memcache/memcache-2.2.3.tgz</a><br />
wget <a href="http://blog.s135.com/soft/linux/nginx_php/mhash/mhash-0.9.9.tar.gz" target="_blank">http://blog.s135.com/soft/linux/nginx_php/mhash/mhash-0.9.9.tar.gz</a><br />
wget <a href="http://blog.s135.com/soft/linux/nginx_php/pcre/pcre-7.7.tar.gz" target="_blank">http://blog.s135.com/soft/linux/nginx_php/pcre/pcre-7.7.tar.gz</a><br />
wget <a href="http://blog.s135.com/soft/linux/nginx_php/eaccelerator/eaccelerator-0.9.5.3.tar.bz2" target="_blank">http://blog.s135.com/soft/linux/nginx_php/eaccelerator/eaccelerator-0.9.5.3.tar.bz2</a></div>
<hr /><strong>二、安装PHP 5.2.6（FastCGI模式）</strong><br />
1、编译安装PHP 5.2.6所需的支持库：</p>
<div style="border: 1px dashed #00a0c6; margin: 5px 5px 0px; padding: 3px; background-color: #ffffff;">tar zxvf libiconv-1.12.tar.gz<br />
cd libiconv-1.12/<br />
./configure &#8211;prefix=/usr/local<br />
make<br />
make install<br />
cd ../</p>
<p>tar zxvf libmcrypt-2.5.8.tar.gz<br />
cd libmcrypt-2.5.8/<br />
./configure<br />
make<br />
make install<br />
/sbin/ldconfig<br />
cd libltdl/<br />
./configure &#8211;enable-ltdl-install<br />
make<br />
make install<br />
cd ../../</p>
<p>tar zxvf mhash-0.9.9.tar.gz<br />
cd mhash-0.9.9/<br />
./configure<br />
make<br />
make install<br />
cd ../</p>
<p>cp /usr/local/lib/libmcrypt.* /usr/lib<br />
ln -s /usr/local/lib/libmhash.so.2 /usr/lib/libmhash.so.2</p>
<p>tar zxvf mcrypt-2.6.7.tar.gz<br />
cd mcrypt-2.6.7/<br />
./configure<br />
make<br />
make install<br />
cd ../</p></div>
<hr />2、编译安装MySQL 5.1.29-rc</p>
<div style="border: 1px dashed #00a0c6; margin: 5px 5px 0px; padding: 3px; background-color: #ffffff;">/usr/sbin/groupadd mysql<br />
/usr/sbin/useradd -g mysql mysql<br />
tar zxvf mysql-5.1.29-rc.tar.gz<br />
cd mysql-5.1.29-rc/<br />
./configure &#8211;prefix=/usr/local/webserver/mysql/ &#8211;enable-assembler &#8211;with-extra-charsets=complex &#8211;enable-thread-safe-client &#8211;with-big-tables &#8211;with-readline &#8211;with-ssl &#8211;with-embedded-server &#8211;enable-local-infile<br />
make &amp;&amp; make install<br />
chmod +w /usr/local/webserver/mysql<br />
chown -R mysql:mysql /usr/local/webserver/mysql<br />
cp support-files/my-medium.cnf /usr/local/webserver/mysql/my.cnf<br />
cd ../</div>
<hr />附：以下为附加步骤，如果你想在这台服务器上运行MySQL数据库，则执行以下两步。如果你只是希望让PHP支持MySQL扩展库，能够连接其他服务器上的MySQL数据库，那么，以下两步无需执行。<br />
①、以mysql用户帐号的身份建立数据表：</p>
<div style="border: 1px dashed #00a0c6; margin: 5px 5px 0px; padding: 3px; background-color: #ffffff;">/usr/local/webserver/mysql/bin/mysql_install_db &#8211;defaults-file=/usr/local/webserver/mysql/my.cnf &#8211;basedir=/usr/local/webserver/mysql &#8211;datadir=/usr/local/webserver/mysql/data &#8211;user=mysql &#8211;pid-file=/usr/local/webserver/mysql/mysql.pid &#8211;skip-locking &#8211;port=3306 &#8211;socket=/tmp/mysql.sock</div>
<p>②、启动MySQL（最后的&amp;表示在后台运行）</p>
<div style="border: 1px dashed #00a0c6; margin: 5px 5px 0px; padding: 3px; background-color: #ffffff;">/bin/sh /usr/local/webserver/mysql/bin/mysqld_safe &#8211;defaults-file=/usr/local/webserver/mysql/my.cnf &amp;</div>
<hr />3、编译安装PHP（FastCGI模式）</p>
<div style="border: 1px dashed #00a0c6; margin: 5px 5px 0px; padding: 3px; background-color: #ffffff;">tar zxvf php-5.2.6.tar.gz<br />
gzip -cd php-5.2.6-fpm-0.5.9.diff.gz | patch -d php-5.2.6 -p1<br />
cd php-5.2.6/<br />
./configure &#8211;prefix=/usr/local/webserver/php &#8211;with-config-file-path=/usr/local/webserver/php/etc &#8211;with-mysql=/usr/local/webserver/mysql &#8211;with-mysqli=/usr/local/webserver/mysql/bin/mysql_config &#8211;with-iconv-dir=/usr/local &#8211;with-freetype-dir &#8211;with-jpeg-dir &#8211;with-png-dir &#8211;with-zlib &#8211;with-libxml-dir=/usr &#8211;enable-xml &#8211;disable-rpath &#8211;enable-discard-path &#8211;enable-safe-mode &#8211;enable-bcmath &#8211;enable-shmop &#8211;enable-sysvsem &#8211;enable-inline-optimization &#8211;with-curl &#8211;with-curlwrappers &#8211;enable-mbregex &#8211;enable-fastcgi &#8211;enable-fpm &#8211;enable-force-cgi-redirect &#8211;enable-mbstring &#8211;with-mcrypt &#8211;with-gd &#8211;enable-gd-native-ttf &#8211;with-openssl<br />
sed -i &#8216;s#-lz -lm -lxml2 -lz -lm -lxml2 -lz -lm -lcrypt#&amp; -liconv#&#8217; Makefile<br />
make<br />
make install<br />
cp php.ini-dist /usr/local/webserver/php/etc/php.ini<br />
cd ../</div>
<hr />4、编译安装PHP5扩展模块</p>
<div style="border: 1px dashed #00a0c6; margin: 5px 5px 0px; padding: 3px; background-color: #ffffff;">tar zxvf memcache-2.2.3.tgz<br />
cd memcache-2.2.3/<br />
/usr/local/webserver/php/bin/phpize<br />
./configure &#8211;with-php-config=/usr/local/webserver/php/bin/php-config<br />
make<br />
make install<br />
cd ../</p>
<p>tar jxvf eaccelerator-0.9.5.3.tar.bz2<br />
cd eaccelerator-0.9.5.3/<br />
/usr/local/webserver/php/bin/phpize<br />
./configure &#8211;enable-eaccelerator=shared &#8211;with-php-config=/usr/local/webserver/php/bin/php-config<br />
make<br />
make install<br />
cd ../</p></div>
<p>5、修改php.ini文件<br />
<strong>手工修改：</strong>查找/usr/local/webserver/php/etc/php.ini中的extension_dir = “./”<br />
修改为extension_dir = “/usr/local/webserver/php/lib/php/extensions/no-debug-non-zts-20060613/”<br />
并在此行后增加以下几行，然后保存：<br />
extension = “memcache.so”</p>
<p>再查找output_buffering = Off<br />
修改为output_buffering = On</p>
<p><strong>自动修改：</strong>若嫌手工修改麻烦，可执行以下shell命令，自动完成对php.ini文件的修改：</p>
<div style="border: 1px dashed #00a0c6; margin: 5px 5px 0px; padding: 3px; background-color: #ffffff;">sed -i &#8216;s#extension_dir = “./”#extension_dir = “/usr/local/webserver/php/lib/php/extensions/no-debug-non-zts-20060613/”\nextension = “memcache.so”\n#&#8217; /usr/local/webserver/php/etc/php.ini<br />
sed -i &#8216;s#output_buffering = Off#output_buffering = On#&#8217; /usr/local/webserver/php/etc/php.ini</div>
<p>6、配置eAccelerator加速PHP：</p>
<div style="border: 1px dashed #00a0c6; margin: 5px 5px 0px; padding: 3px; background-color: #ffffff;">mkdir -p /usr/local/webserver/eaccelerator_cache<br />
vi /usr/local/webserver/php/etc/php.ini</div>
<p>按shift+g键跳到配置文件的最末尾，加上以下配置信息：</p>
<div class="quote">
<div class="quote-title">引用</div>
<div class="quote-content">[eaccelerator]<br />
zend_extension=”/usr/local/webserver/php/lib/php/extensions/no-debug-non-zts-20060613/eaccelerator.so”<br />
eaccelerator.shm_size=”128&#8243;<br />
eaccelerator.cache_dir=”/usr/local/webserver/eaccelerator_cache”<br />
eaccelerator.enable=”1&#8243;<br />
eaccelerator.optimizer=”1&#8243;<br />
eaccelerator.check_mtime=”1&#8243;<br />
eaccelerator.debug=”0&#8243;<br />
eaccelerator.filter=”"<br />
eaccelerator.shm_max=”0&#8243;<br />
eaccelerator.shm_ttl=”300&#8243;<br />
eaccelerator.shm_prune_period=”120&#8243;<br />
eaccelerator.shm_only=”0&#8243;<br />
eaccelerator.compress=”1&#8243;<br />
eaccelerator.compress_level=”9&#8243;</div>
</div>
<p>修改配置文件：</p>
<div style="border: 1px dashed #00a0c6; margin: 5px 5px 0px; padding: 3px; background-color: #ffffff;">vi /etc/sysctl.conf</div>
<p>输入以下内容：</p>
<div class="quote">
<div class="quote-title">引用</div>
<div class="quote-content">kernel.shmmax = 134217728</div>
</div>
<p>然后执行以下命令使配置生效：</p>
<div style="border: 1px dashed #00a0c6; margin: 5px 5px 0px; padding: 3px; background-color: #ffffff;">/sbin/sysctl -p</div>
<hr />7、创建www用户和组，以及供blog.s135.com和<a href="http://www.s135.com/" target="_blank">www.s135.com</a>两个虚拟主机使用的目录：</p>
<div style="border: 1px dashed #00a0c6; margin: 5px 5px 0px; padding: 3px; background-color: #ffffff;">/usr/sbin/groupadd <a href="http://www.ptubuntu.com/tag/www" class="st_tag internal_tag" rel="tag" title="标签 www 下的日志">www</a> -g 48<br />
/usr/sbin/useradd -u 48 -g www www<br />
mkdir -p /data0/htdocs/blog<br />
chmod +w /data0/htdocs/blog<br />
chown -R www:www /data0/htdocs/blog<br />
mkdir -p /data0/htdocs/www<br />
chmod +w /data0/htdocs/www<br />
chown -R www:www /data0/htdocs/www</div>
<p>8、创建php-fpm配置文件（php-fpm是为PHP打的一个FastCGI管理补丁，可以平滑变更php.ini配置而无需重启php-cgi）：<br />
在/usr/local/webserver/php/etc/目录中创建php-fpm.conf文件：</p>
<div style="border: 1px dashed #00a0c6; margin: 5px 5px 0px; padding: 3px; background-color: #ffffff;">rm -f /usr/local/webserver/php/etc/php-fpm.conf<br />
vi /usr/local/webserver/php/etc/php-fpm.conf</div>
<p>输入以下内容（如果您安装 Nginx + PHP 用于程序调试，请将以下的&lt;value name=”display_errors”&gt;0&lt;/value&gt;改为&lt;value name=”display_errors”&gt;1&lt;/value&gt;，以便显示PHP错误信息，否则，Nginx 会报状态为500的空白错误页）：</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools"><a onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" href="http://blog.s135.com/#">view plain</a><a onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" href="http://blog.s135.com/#">print</a><a onclick="dp.sh.Toolbar.Command('About',this);return false;" href="http://blog.s135.com/#">?</a></div>
</div>
<ol class="dp-xml">
<li class="alt"><span><span class="tag">&lt;?</span><span class="tag-name">xml</span><span> </span><span class="attribute">version</span><span>=</span><span class="attribute-value">“1.0&#8243;</span><span> </span><span class="tag">?&gt;</span><span> </span></span></li>
<li><span><span class="tag">&lt;</span><span class="tag-name">configuration</span><span class="tag">&gt;</span><span> </span></span></li>
<li class="alt"><span> </span></li>
<li><span> All relative paths in this config are relative to php&#8217;s install prefix </span></li>
<li class="alt"><span> </span></li>
<li><span> <span class="tag">&lt;</span><span class="tag-name">section</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">“global_options”</span><span class="tag">&gt;</span><span> </span></span></li>
<li class="alt"><span> </span></li>
<li><span> Pid file </span></li>
<li class="alt"><span> <span class="tag">&lt;</span><span class="tag-name">value</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">“pid_file”</span><span class="tag">&gt;</span><span>/usr/local/webserver/php/logs/php-fpm.pid</span><span class="tag">&lt;/</span><span class="tag-name">value</span><span class="tag">&gt;</span><span> </span></span></li>
<li><span> </span></li>
<li class="alt"><span> Error log file </span></li>
<li><span> <span class="tag">&lt;</span><span class="tag-name">value</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">“error_log”</span><span class="tag">&gt;</span><span>/usr/local/webserver/php/logs/php-fpm.log</span><span class="tag">&lt;/</span><span class="tag-name">value</span><span class="tag">&gt;</span><span> </span></span></li>
<li class="alt"><span> </span></li>
<li><span> Log level </span></li>
<li class="alt"><span> <span class="tag">&lt;</span><span class="tag-name">value</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">“log_level”</span><span class="tag">&gt;</span><span>notice</span><span class="tag">&lt;/</span><span class="tag-name">value</span><span class="tag">&gt;</span><span> </span></span></li>
<li><span> </span></li>
<li class="alt"><span> When this amount of php processes exited with SIGSEGV or SIGBUS &#8230; </span></li>
<li><span> <span class="tag">&lt;</span><span class="tag-name">value</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">“emergency_restart_threshold”</span><span class="tag">&gt;</span><span>10</span><span class="tag">&lt;/</span><span class="tag-name">value</span><span class="tag">&gt;</span><span> </span></span></li>
<li class="alt"><span> </span></li>
<li><span> &#8230; in a less than this interval of time, a graceful restart will be initiated. </span></li>
<li class="alt"><span> Useful to work around accidental curruptions in accelerator&#8217;s shared memory. </span></li>
<li><span> <span class="tag">&lt;</span><span class="tag-name">value</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">“emergency_restart_interval”</span><span class="tag">&gt;</span><span>1m</span><span class="tag">&lt;/</span><span class="tag-name">value</span><span class="tag">&gt;</span><span> </span></span></li>
<li class="alt"><span> </span></li>
<li><span> Time limit on waiting child&#8217;s reaction on signals from master </span></li>
<li class="alt"><span> <span class="tag">&lt;</span><span class="tag-name">value</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">“process_control_timeout”</span><span class="tag">&gt;</span><span>5s</span><span class="tag">&lt;/</span><span class="tag-name">value</span><span class="tag">&gt;</span><span> </span></span></li>
<li><span> </span></li>
<li class="alt"><span> Set to &#8217;no&#8217; to debug fpm </span></li>
<li><span> <span class="tag">&lt;</span><span class="tag-name">value</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">“daemonize”</span><span class="tag">&gt;</span><span>yes</span><span class="tag">&lt;/</span><span class="tag-name">value</span><span class="tag">&gt;</span><span> </span></span></li>
<li class="alt"><span> </span></li>
<li><span> <span class="tag">&lt;/</span><span class="tag-name">section</span><span class="tag">&gt;</span><span> </span></span></li>
<li class="alt"><span> </span></li>
<li><span> <span class="tag">&lt;</span><span class="tag-name">workers</span><span class="tag">&gt;</span><span> </span></span></li>
<li class="alt"><span> </span></li>
<li><span> <span class="tag">&lt;</span><span class="tag-name">section</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">“pool”</span><span class="tag">&gt;</span><span> </span></span></li>
<li class="alt"><span> </span></li>
<li><span> Name of pool. Used in logs and stats. </span></li>
<li class="alt"><span> <span class="tag">&lt;</span><span class="tag-name">value</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">“name”</span><span class="tag">&gt;</span><span>default</span><span class="tag">&lt;/</span><span class="tag-name">value</span><span class="tag">&gt;</span><span> </span></span></li>
<li><span> </span></li>
<li class="alt"><span> Address to accept fastcgi requests on. </span></li>
<li><span> Valid syntax is &#8217;ip.ad.re.ss:port&#8217; or just &#8217;port&#8217; or &#8217;/path/to/unix/socket&#8217; </span></li>
<li class="alt"><span> <span class="tag">&lt;</span><span class="tag-name">value</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">“listen_address”</span><span class="tag">&gt;</span><span>127.0.0.1:9000</span><span class="tag">&lt;/</span><span class="tag-name">value</span><span class="tag">&gt;</span><span> </span></span></li>
<li><span> </span></li>
<li class="alt"><span> <span class="tag">&lt;</span><span class="tag-name">value</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">“listen_options”</span><span class="tag">&gt;</span><span> </span></span></li>
<li><span> </span></li>
<li class="alt"><span> Set listen(2) backlog </span></li>
<li><span> <span class="tag">&lt;</span><span class="tag-name">value</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">“backlog”</span><span class="tag">&gt;</span><span>-1</span><span class="tag">&lt;/</span><span class="tag-name">value</span><span class="tag">&gt;</span><span> </span></span></li>
<li class="alt"><span> </span></li>
<li><span> Set permissions for unix socket, if one used. </span></li>
<li class="alt"><span> In Linux read/write permissions must be set in order to allow connections from web server. </span></li>
<li><span> Many BSD-derrived systems allow connections regardless of permissions. </span></li>
<li class="alt"><span> <span class="tag">&lt;</span><span class="tag-name">value</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">“owner”</span><span class="tag">&gt;</span><span class="tag">&lt;/</span><span class="tag-name">value</span><span class="tag">&gt;</span><span> </span></span></li>
<li><span> <span class="tag">&lt;</span><span class="tag-name">value</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">“group”</span><span class="tag">&gt;</span><span class="tag">&lt;/</span><span class="tag-name">value</span><span class="tag">&gt;</span><span> </span></span></li>
<li class="alt"><span> <span class="tag">&lt;</span><span class="tag-name">value</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">“mode”</span><span class="tag">&gt;</span><span>0666</span><span class="tag">&lt;/</span><span class="tag-name">value</span><span class="tag">&gt;</span><span> </span></span></li>
<li><span> <span class="tag">&lt;/</span><span class="tag-name">value</span><span class="tag">&gt;</span><span> </span></span></li>
<li class="alt"><span> </span></li>
<li><span> Additional php.ini defines, specific to this pool of workers. </span></li>
<li class="alt"><span> <span class="tag">&lt;</span><span class="tag-name">value</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">“php_defines”</span><span class="tag">&gt;</span><span> </span></span></li>
<li><span> <span class="tag">&lt;</span><span class="tag-name">value</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">“sendmail_path”</span><span class="tag">&gt;</span><span>/usr/sbin/sendmail -t -i</span><span class="tag">&lt;/</span><span class="tag-name">value</span><span class="tag">&gt;</span><span> </span></span></li>
<li class="alt"><span> <span class="tag">&lt;</span><span class="tag-name">value</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">“display_errors”</span><span class="tag">&gt;</span><span>1</span><span class="tag">&lt;/</span><span class="tag-name">value</span><span class="tag">&gt;</span><span> </span></span></li>
<li><span> <span class="tag">&lt;/</span><span class="tag-name">value</span><span class="tag">&gt;</span><span> </span></span></li>
<li class="alt"><span> </span></li>
<li><span> Unix user of processes </span></li>
<li class="alt"><span> <span class="tag">&lt;</span><span class="tag-name">value</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">“user”</span><span class="tag">&gt;</span><span>www</span><span class="tag">&lt;/</span><span class="tag-name">value</span><span class="tag">&gt;</span><span> </span></span></li>
<li><span> </span></li>
<li class="alt"><span> Unix group of processes </span></li>
<li><span> <span class="tag">&lt;</span><span class="tag-name">value</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">“group”</span><span class="tag">&gt;</span><span>www</span><span class="tag">&lt;/</span><span class="tag-name">value</span><span class="tag">&gt;</span><span> </span></span></li>
<li class="alt"><span> </span></li>
<li><span> Process manager settings </span></li>
<li class="alt"><span> <span class="tag">&lt;</span><span class="tag-name">value</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">“pm”</span><span class="tag">&gt;</span><span> </span></span></li>
<li><span> </span></li>
<li class="alt"><span> Sets style of controling worker process count. </span></li>
<li><span> Valid values are &#8217;static&#8217; and &#8217;apache-like&#8217; </span></li>
<li class="alt"><span> <span class="tag">&lt;</span><span class="tag-name">value</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">“style”</span><span class="tag">&gt;</span><span>static</span><span class="tag">&lt;/</span><span class="tag-name">value</span><span class="tag">&gt;</span><span> </span></span></li>
<li><span> </span></li>
<li class="alt"><span> Sets the limit on the number of simultaneous requests that will be served. </span></li>
<li><span> Equivalent to Apache MaxClients directive. </span></li>
<li class="alt"><span> Equivalent to PHP_FCGI_CHILDREN environment in original php.fcgi </span></li>
<li><span> Used with any pm_style. </span></li>
<li class="alt"><span> <span class="tag">&lt;</span><span class="tag-name">value</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">“max_children”</span><span class="tag">&gt;</span><span>128</span><span class="tag">&lt;/</span><span class="tag-name">value</span><span class="tag">&gt;</span><span> </span></span></li>
<li><span> </span></li>
<li class="alt"><span> Settings group for &#8217;apache-like&#8217; pm style </span></li>
<li><span> <span class="tag">&lt;</span><span class="tag-name">value</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">“apache_like”</span><span class="tag">&gt;</span><span> </span></span></li>
<li class="alt"><span> </span></li>
<li><span> Sets the number of server processes created on startup. </span></li>
<li class="alt"><span> Used only when &#8217;apache-like&#8217; pm_style is selected </span></li>
<li><span> <span class="tag">&lt;</span><span class="tag-name">value</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">“StartServers”</span><span class="tag">&gt;</span><span>20</span><span class="tag">&lt;/</span><span class="tag-name">value</span><span class="tag">&gt;</span><span> </span></span></li>
<li class="alt"><span> </span></li>
<li><span> Sets the desired minimum number of idle server processes. </span></li>
<li class="alt"><span> Used only when &#8217;apache-like&#8217; pm_style is selected </span></li>
<li><span> <span class="tag">&lt;</span><span class="tag-name">value</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">“MinSpareServers”</span><span class="tag">&gt;</span><span>5</span><span class="tag">&lt;/</span><span class="tag-name">value</span><span class="tag">&gt;</span><span> </span></span></li>
<li class="alt"><span> </span></li>
<li><span> Sets the desired maximum number of idle server processes. </span></li>
<li class="alt"><span> Used only when &#8217;apache-like&#8217; pm_style is selected </span></li>
<li><span> <span class="tag">&lt;</span><span class="tag-name">value</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">“MaxSpareServers”</span><span class="tag">&gt;</span><span>35</span><span class="tag">&lt;/</span><span class="tag-name">value</span><span class="tag">&gt;</span><span> </span></span></li>
<li class="alt"><span> </span></li>
<li><span> <span class="tag">&lt;/</span><span class="tag-name">value</span><span class="tag">&gt;</span><span> </span></span></li>
<li class="alt"><span> </span></li>
<li><span> <span class="tag">&lt;/</span><span class="tag-name">value</span><span class="tag">&gt;</span><span> </span></span></li>
<li class="alt"><span> </span></li>
<li><span> The timeout (in seconds) for serving a single request after which the worker process will be terminated </span></li>
<li class="alt"><span> Should be used when &#8217;max_execution_time&#8217; ini option does not stop script execution for some reason </span></li>
<li><span> &#8217;0s&#8217; means &#8217;off&#8217; </span></li>
<li class="alt"><span> <span class="tag">&lt;</span><span class="tag-name">value</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">“request_terminate_timeout”</span><span class="tag">&gt;</span><span>0s</span><span class="tag">&lt;/</span><span class="tag-name">value</span><span class="tag">&gt;</span><span> </span></span></li>
<li><span> </span></li>
<li class="alt"><span> The timeout (in seconds) for serving of single request after which a php backtrace will be dumped to slow.log file </span></li>
<li><span> &#8217;0s&#8217; means &#8217;off&#8217; </span></li>
<li class="alt"><span> <span class="tag">&lt;</span><span class="tag-name">value</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">“request_slowlog_timeout”</span><span class="tag">&gt;</span><span>0s</span><span class="tag">&lt;/</span><span class="tag-name">value</span><span class="tag">&gt;</span><span> </span></span></li>
<li><span> </span></li>
<li class="alt"><span> The log file for slow requests </span></li>
<li><span> <span class="tag">&lt;</span><span class="tag-name">value</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">“slowlog”</span><span class="tag">&gt;</span><span>logs/slow.log</span><span class="tag">&lt;/</span><span class="tag-name">value</span><span class="tag">&gt;</span><span> </span></span></li>
<li class="alt"><span> </span></li>
<li><span> Set open file desc rlimit </span></li>
<li class="alt"><span> <span class="tag">&lt;</span><span class="tag-name">value</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">“rlimit_files”</span><span class="tag">&gt;</span><span>51200</span><span class="tag">&lt;/</span><span class="tag-name">value</span><span class="tag">&gt;</span><span> </span></span></li>
<li><span> </span></li>
<li class="alt"><span> Set max core size rlimit </span></li>
<li><span> <span class="tag">&lt;</span><span class="tag-name">value</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">“rlimit_core”</span><span class="tag">&gt;</span><span>0</span><span class="tag">&lt;/</span><span class="tag-name">value</span><span class="tag">&gt;</span><span> </span></span></li>
<li class="alt"><span> </span></li>
<li><span> Chroot to this directory at the start, absolute path </span></li>
<li class="alt"><span> <span class="tag">&lt;</span><span class="tag-name">value</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">“chroot”</span><span class="tag">&gt;</span><span class="tag">&lt;/</span><span class="tag-name">value</span><span class="tag">&gt;</span><span> </span></span></li>
<li><span> </span></li>
<li class="alt"><span> Chdir to this directory at the start, absolute path </span></li>
<li><span> <span class="tag">&lt;</span><span class="tag-name">value</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">“chdir”</span><span class="tag">&gt;</span><span class="tag">&lt;/</span><span class="tag-name">value</span><span class="tag">&gt;</span><span> </span></span></li>
<li class="alt"><span> </span></li>
<li><span> Redirect workers&#8217; stdout and stderr into main error log. </span></li>
<li class="alt"><span> If not set, they will be redirected to /dev/null, according to FastCGI specs </span></li>
<li><span> <span class="tag">&lt;</span><span class="tag-name">value</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">“catch_workers_output”</span><span class="tag">&gt;</span><span>yes</span><span class="tag">&lt;/</span><span class="tag-name">value</span><span class="tag">&gt;</span><span> </span></span></li>
<li class="alt"><span> </span></li>
<li><span> How much requests each process should execute before respawn. </span></li>
<li class="alt"><span> Useful to work around memory leaks in 3rd party libraries. </span></li>
<li><span> For endless request processing please specify 0 </span></li>
<li class="alt"><span> Equivalent to PHP_FCGI_MAX_REQUESTS </span></li>
<li><span> <span class="tag">&lt;</span><span class="tag-name">value</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">“max_requests”</span><span class="tag">&gt;</span><span>10240</span><span class="tag">&lt;/</span><span class="tag-name">value</span><span class="tag">&gt;</span><span> </span></span></li>
<li class="alt"><span> </span></li>
<li><span> Comma separated list of ipv4 addresses of FastCGI clients that allowed to connect. </span></li>
<li class="alt"><span> Equivalent to FCGI_WEB_SERVER_ADDRS environment in original php.fcgi (5.2.2+) </span></li>
<li><span> Makes sense only with AF_INET listening socket. </span></li>
<li class="alt"><span> <span class="tag">&lt;</span><span class="tag-name">value</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">“allowed_clients”</span><span class="tag">&gt;</span><span>127.0.0.1</span><span class="tag">&lt;/</span><span class="tag-name">value</span><span class="tag">&gt;</span><span> </span></span></li>
<li><span> </span></li>
<li class="alt"><span> Pass environment variables like LD_LIBRARY_PATH </span></li>
<li><span> All $VARIABLEs are taken from current environment </span></li>
<li class="alt"><span> <span class="tag">&lt;</span><span class="tag-name">value</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">“environment”</span><span class="tag">&gt;</span><span> </span></span></li>
<li><span> <span class="tag">&lt;</span><span class="tag-name">value</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">“HOSTNAME”</span><span class="tag">&gt;</span><span>$HOSTNAME</span><span class="tag">&lt;/</span><span class="tag-name">value</span><span class="tag">&gt;</span><span> </span></span></li>
<li class="alt"><span> <span class="tag">&lt;</span><span class="tag-name">value</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">“PATH”</span><span class="tag">&gt;</span><span>/usr/local/bin:/usr/bin:/bin</span><span class="tag">&lt;/</span><span class="tag-name">value</span><span class="tag">&gt;</span><span> </span></span></li>
<li><span> <span class="tag">&lt;</span><span class="tag-name">value</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">“TMP”</span><span class="tag">&gt;</span><span>/tmp</span><span class="tag">&lt;/</span><span class="tag-name">value</span><span class="tag">&gt;</span><span> </span></span></li>
<li class="alt"><span> <span class="tag">&lt;</span><span class="tag-name">value</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">“TMPDIR”</span><span class="tag">&gt;</span><span>/tmp</span><span class="tag">&lt;/</span><span class="tag-name">value</span><span class="tag">&gt;</span><span> </span></span></li>
<li><span> <span class="tag">&lt;</span><span class="tag-name">value</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">“TEMP”</span><span class="tag">&gt;</span><span>/tmp</span><span class="tag">&lt;/</span><span class="tag-name">value</span><span class="tag">&gt;</span><span> </span></span></li>
<li class="alt"><span> <span class="tag">&lt;</span><span class="tag-name">value</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">“OSTYPE”</span><span class="tag">&gt;</span><span>$OSTYPE</span><span class="tag">&lt;/</span><span class="tag-name">value</span><span class="tag">&gt;</span><span> </span></span></li>
<li><span> <span class="tag">&lt;</span><span class="tag-name">value</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">“MACHTYPE”</span><span class="tag">&gt;</span><span>$MACHTYPE</span><span class="tag">&lt;/</span><span class="tag-name">value</span><span class="tag">&gt;</span><span> </span></span></li>
<li class="alt"><span> <span class="tag">&lt;</span><span class="tag-name">value</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">“MALLOC_CHECK_”</span><span class="tag">&gt;</span><span>2</span><span class="tag">&lt;/</span><span class="tag-name">value</span><span class="tag">&gt;</span><span> </span></span></li>
<li><span> <span class="tag">&lt;/</span><span class="tag-name">value</span><span class="tag">&gt;</span><span> </span></span></li>
<li class="alt"><span> </span></li>
<li><span> <span class="tag">&lt;/</span><span class="tag-name">section</span><span class="tag">&gt;</span><span> </span></span></li>
<li class="alt"><span> </span></li>
<li><span> <span class="tag">&lt;/</span><span class="tag-name">workers</span><span class="tag">&gt;</span><span> </span></span></li>
<li class="alt"><span> </span></li>
<li><span><span class="tag">&lt;/</span><span class="tag-name">configuration</span><span class="tag">&gt;</span><span> </span></span></li>
</ol>
</div>
<p><textarea class="xml" style="display: none;" cols="100" rows="15" name="code">&lt;?xml version=”1.0&#8243; ?&gt; &lt;configuration&gt;    All relative paths in this config are relative to php&#8217;s install prefix    &lt;section name=”global_options”&gt;      Pid file     &lt;value name=”pid_file”&gt;/usr/local/webserver/php/logs/php-fpm.pid&lt;/value&gt;      Error log file     &lt;value name=”error_log”&gt;/usr/local/webserver/php/logs/php-fpm.log&lt;/value&gt;      Log level     &lt;value name=”log_level”&gt;notice&lt;/value&gt;      When this amount of php processes exited with SIGSEGV or SIGBUS &#8230;     &lt;value name=”emergency_restart_threshold”&gt;10&lt;/value&gt;      &#8230; in a less than this interval of time, a graceful restart will be initiated.     Useful to work around accidental curruptions in accelerator&#8217;s shared memory.     &lt;value name=”emergency_restart_interval”&gt;1m&lt;/value&gt;      Time limit on waiting child&#8217;s reaction on signals from master     &lt;value name=”process_control_timeout”&gt;5s&lt;/value&gt;      Set to &#8216;no&#8217; to debug fpm     &lt;value name=”daemonize”&gt;yes&lt;/value&gt;    &lt;/section&gt;    &lt;workers&gt;      &lt;section name=”pool”&gt;        Name of pool. Used in logs and stats.       &lt;value name=”name”&gt;default&lt;/value&gt;        Address to accept fastcgi requests on.       Valid syntax is &#8216;ip.ad.re.ss:port&#8217; or just &#8216;port&#8217; or &#8216;/path/to/unix/socket&#8217;       &lt;value name=”listen_address”&gt;127.0.0.1:9000&lt;/value&gt;        &lt;value name=”listen_options”&gt;          Set listen(2) backlog         &lt;value name=”backlog”&gt;-1&lt;/value&gt;          Set permissions for unix socket, if one used.         In Linux read/write permissions must be set in order to allow connections from web server.         Many BSD-derrived systems allow connections regardless of permissions.         &lt;value name=”owner”&gt;&lt;/value&gt;         &lt;value name=”group”&gt;&lt;/value&gt;         &lt;value name=”mode”&gt;0666&lt;/value&gt;       &lt;/value&gt;        Additional php.ini defines, specific to this pool of workers.       &lt;value name=”php_defines”&gt;         &lt;value name=”sendmail_path”&gt;/usr/sbin/sendmail -t -i&lt;/value&gt;         &lt;value name=”display_errors”&gt;1&lt;/value&gt;       &lt;/value&gt;        Unix user of processes         &lt;value name=”user”&gt;www&lt;/value&gt;        Unix group of processes         &lt;value name=”group”&gt;www&lt;/value&gt;        Process manager settings       &lt;value name=”pm”&gt;          Sets style of controling worker process count.         Valid values are &#8216;static&#8217; and &#8216;apache-like&#8217;         &lt;value name=”style”&gt;static&lt;/value&gt;          Sets the limit on the number of simultaneous requests that will be served.         Equivalent to Apache MaxClients directive.         Equivalent to PHP_FCGI_CHILDREN environment in original php.fcgi         Used with any pm_style.         &lt;value name=”max_children”&gt;128&lt;/value&gt;          Settings group for &#8216;apache-like&#8217; pm style         &lt;value name=”apache_like”&gt;            Sets the number of server processes created on startup.           Used only when &#8216;apache-like&#8217; pm_style is selected           &lt;value name=”StartServers”&gt;20&lt;/value&gt;            Sets the desired minimum number of idle server processes.           Used only when &#8216;apache-like&#8217; pm_style is selected           &lt;value name=”MinSpareServers”&gt;5&lt;/value&gt;            Sets the desired maximum number of idle server processes.           Used only when &#8216;apache-like&#8217; pm_style is selected           &lt;value name=”MaxSpareServers”&gt;35&lt;/value&gt;          &lt;/value&gt;        &lt;/value&gt;        The timeout (in seconds) for serving a single request after which the worker process will be terminated       Should be used when &#8216;max_execution_time&#8217; ini option does not stop script execution for some reason       &#8217;0s&#8217; means &#8216;off&#8217;       &lt;value name=”request_terminate_timeout”&gt;0s&lt;/value&gt;        The timeout (in seconds) for serving of single request after which a php backtrace will be dumped to slow.log file       &#8217;0s&#8217; means &#8216;off&#8217;       &lt;value name=”request_slowlog_timeout”&gt;0s&lt;/value&gt;        The log file for slow requests       &lt;value name=”slowlog”&gt;logs/slow.log&lt;/value&gt;        Set open file desc rlimit       &lt;value name=”rlimit_files”&gt;51200&lt;/value&gt;        Set max core size rlimit       &lt;value name=”rlimit_core”&gt;0&lt;/value&gt;        Chroot to this directory at the start, absolute path       &lt;value name=”chroot”&gt;&lt;/value&gt;        Chdir to this directory at the start, absolute path       &lt;value name=”chdir”&gt;&lt;/value&gt;        Redirect workers&#8217; stdout and stderr into main error log.       If not set, they will be redirected to /dev/null, according to FastCGI specs       &lt;value name=”catch_workers_output”&gt;yes&lt;/value&gt;        How much requests each process should execute before respawn.       Useful to work around memory leaks in 3rd party libraries.       For endless request processing please specify 0       Equivalent to PHP_FCGI_MAX_REQUESTS       &lt;value name=”max_requests”&gt;10240&lt;/value&gt;        Comma separated list of ipv4 addresses of FastCGI clients that allowed to connect.       Equivalent to FCGI_WEB_SERVER_ADDRS environment in original php.fcgi (5.2.2+)       Makes sense only with AF_INET listening socket.       &lt;value name=”allowed_clients”&gt;127.0.0.1&lt;/value&gt;        Pass environment variables like LD_LIBRARY_PATH       All $VARIABLEs are taken from current environment       &lt;value name=”environment”&gt;         &lt;value name=”HOSTNAME”&gt;$HOSTNAME&lt;/value&gt;         &lt;value name=”PATH”&gt;/usr/local/bin:/usr/bin:/bin&lt;/value&gt;         &lt;value name=”TMP”&gt;/tmp&lt;/value&gt;         &lt;value name=”TMPDIR”&gt;/tmp&lt;/value&gt;         &lt;value name=”TEMP”&gt;/tmp&lt;/value&gt;         &lt;value name=”OSTYPE”&gt;$OSTYPE&lt;/value&gt;         &lt;value name=”MACHTYPE”&gt;$MACHTYPE&lt;/value&gt;         &lt;value name=”MALLOC_CHECK_”&gt;2&lt;/value&gt;       &lt;/value&gt;      &lt;/section&gt;    &lt;/workers&gt;  &lt;/configuration&gt;</textarea> 9、启动php-cgi进程，监听127.0.0.1的9000端口，进程数为200（如果服务器内存小于3GB，可以只开启64个进程），用户为www：</p>
<div style="border: 1px dashed #00a0c6; margin: 5px 5px 0px; padding: 3px; background-color: #ffffff;">ulimit -SHn 51200<br />
/usr/local/webserver/php/sbin/php-fpm start</div>
<p>注：/usr/local/webserver/php/sbin/php-fpm还有其他参数，包 括：start|stop|quit|restart|reload|logrotate，修改php.ini后不重启php-cgi，重新加载配置文件 使用reload。</p>
<hr /><strong>三、安装Nginx 0.7.19</strong><br />
1、安装Nginx所需的pcre库：</p>
<div style="border: 1px dashed #00a0c6; margin: 5px 5px 0px; padding: 3px; background-color: #ffffff;">tar zxvf pcre-7.7.tar.gz<br />
cd pcre-7.7/<br />
./configure<br />
make &amp;&amp; make install<br />
cd ../</div>
<p>2、安装Nginx</p>
<div style="border: 1px dashed #00a0c6; margin: 5px 5px 0px; padding: 3px; background-color: #ffffff;">tar zxvf nginx-0.7.19.tar.gz<br />
cd nginx-0.7.19/<br />
./configure &#8211;user=www &#8211;group=www &#8211;prefix=/usr/local/webserver/nginx &#8211;with-http_stub_status_module &#8211;with-http_ssl_module<br />
make &amp;&amp; make install<br />
cd ../</div>
<p>3、创建Nginx日志目录</p>
<div style="border: 1px dashed #00a0c6; margin: 5px 5px 0px; padding: 3px; background-color: #ffffff;">mkdir -p /data1/logs<br />
chmod +w /data1/logs<br />
chown -R www:www /data1/logs</div>
<p>4、创建Nginx配置文件<br />
①、在/usr/local/webserver/nginx/conf/目录中创建nginx.conf文件：</p>
<div style="border: 1px dashed #00a0c6; margin: 5px 5px 0px; padding: 3px; background-color: #ffffff;">rm -f /usr/local/webserver/nginx/conf/nginx.conf<br />
vi /usr/local/webserver/nginx/conf/nginx.conf</div>
<p>输入以下内容：</p>
<div class="quote">
<div class="quote-title">引用</div>
<div class="quote-content">user  www www;</p>
<p>worker_processes 8;</p>
<p>error_log  /data1/logs/nginx_error.log  crit;</p>
<p>pid        /usr/local/webserver/nginx/nginx.pid;</p>
<p>#Specifies the value for maximum file descriptors that can be opened by this process.<br />
worker_rlimit_nofile 51200;</p>
<p>events<br />
{<br />
use epoll;<br />
worker_connections 51200;<br />
}</p>
<p>http<br />
{<br />
include       mime.types;<br />
default_type  application/octet-stream;</p>
<p>#charset  gb2312;</p>
<p>server_names_hash_bucket_size 128;<br />
client_header_buffer_size 32k;<br />
large_client_header_buffers 4 32k;</p>
<p>sendfile on;<br />
tcp_nopush     on;</p>
<p>keepalive_timeout 60;</p>
<p>tcp_nodelay on;</p>
<p>fastcgi_connect_timeout 300;<br />
fastcgi_send_timeout 300;<br />
fastcgi_read_timeout 300;<br />
fastcgi_buffer_size 64k;<br />
fastcgi_buffers 4 64k;<br />
fastcgi_busy_buffers_size 128k;<br />
fastcgi_temp_file_write_size 128k;</p>
<p>gzip on;<br />
gzip_min_length  1k;<br />
gzip_buffers     4 16k;<br />
gzip_http_version 1.0;<br />
gzip_comp_level 2;<br />
gzip_types       text/plain application/x-javascript text/css application/xml;<br />
gzip_vary on;</p>
<p>#limit_zone  crawler  $binary_remote_addr  10m;</p>
<p>server<br />
{<br />
listen       80;<br />
server_name  blog.s135.com;<br />
index index.<a href="http://www.ptubuntu.com/tag/html" class="st_tag internal_tag" rel="tag" title="标签 html 下的日志">html</a> index.htm index.php;<br />
root  /data0/htdocs/blog;</p>
<p>#limit_conn   crawler  20;</p>
<p>location ~ .*\.(php|php5)?$<br />
{<br />
#fastcgi_pass  unix:/tmp/php-cgi.sock;<br />
fastcgi_pass  127.0.0.1:9000;<br />
fastcgi_index index.php;<br />
include fcgi.conf;<br />
}</p>
<p>location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$<br />
{<br />
expires      30d;<br />
}</p>
<p>location ~ .*\.(js|css)?$<br />
{<br />
expires      1h;<br />
}</p>
<p>log_format  access  &#8217;$remote_addr &#8211; $remote_user [$time_local] “$request” &#8216;<br />
&#8216;$status $body_bytes_sent “$http_referer” &#8216;<br />
&#8216;”$http_user_agent” $http_x_forwarded_for&#8217;;<br />
access_log  /data1/logs/access.log  access;<br />
}</p>
<p>server<br />
{<br />
listen       80;<br />
server_name  <a href="http://www.s135.com/;" target="_blank">www.s135.com;</a><br />
index index.html index.htm index.php;<br />
root  /data0/htdocs/www;</p>
<p>location ~ .*\.(php|php5)?$<br />
{<br />
#fastcgi_pass  unix:/tmp/php-cgi.sock;<br />
fastcgi_pass  127.0.0.1:9000;<br />
fastcgi_index index.php;<br />
include fcgi.conf;<br />
}</p>
<p>log_format  wwwlogs  &#8217;$remote_addr &#8211; $remote_user [$time_local] “$request” &#8216;<br />
&#8216;$status $body_bytes_sent “$http_referer” &#8216;<br />
&#8216;”$http_user_agent” $http_x_forwarded_for&#8217;;<br />
access_log  /data1/logs/wwwlogs.log  wwwlogs;<br />
}</p>
<p>server<br />
{<br />
listen  80;<br />
server_name  status.blog.s135.com;</p>
<p>location / {<br />
stub_status on;<br />
access_log   off;<br />
}<br />
}<br />
}</p></div>
</div>
<p>②、在/usr/local/webserver/nginx/conf/目录中创建fcgi.conf文件：</p>
<div style="border: 1px dashed #00a0c6; margin: 5px 5px 0px; padding: 3px; background-color: #ffffff;">vi /usr/local/webserver/nginx/conf/fcgi.conf</div>
<p>输入以下内容：</p>
<div class="quote">
<div class="quote-title">引用</div>
<div class="quote-content">fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;<br />
fastcgi_param  SERVER_SOFTWARE    nginx;</p>
<p>fastcgi_param  QUERY_STRING       $query_string;<br />
fastcgi_param  REQUEST_METHOD     $request_method;<br />
fastcgi_param  CONTENT_TYPE       $content_type;<br />
fastcgi_param  CONTENT_LENGTH     $content_length;</p>
<p>fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;<br />
fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;<br />
fastcgi_param  REQUEST_URI        $request_uri;<br />
fastcgi_param  DOCUMENT_URI       $document_uri;<br />
fastcgi_param  DOCUMENT_ROOT      $document_root;<br />
fastcgi_param  SERVER_PROTOCOL    $server_protocol;</p>
<p>fastcgi_param  REMOTE_ADDR        $remote_addr;<br />
fastcgi_param  REMOTE_PORT        $remote_port;<br />
fastcgi_param  SERVER_ADDR        $server_addr;<br />
fastcgi_param  SERVER_PORT        $server_port;<br />
fastcgi_param  SERVER_NAME        $server_name;</p>
<p># PHP only, required if PHP was built with &#8211;enable-force-cgi-redirect<br />
fastcgi_param  REDIRECT_STATUS    200;</p></div>
</div>
<p>5、启动Nginx</p>
<div style="border: 1px dashed #00a0c6; margin: 5px 5px 0px; padding: 3px; background-color: #ffffff;">ulimit -SHn 51200<br />
/usr/local/webserver/nginx/sbin/nginx</div>
<hr /><strong>四、配置开机自动启动Nginx + PHP</strong></p>
<div style="border: 1px dashed #00a0c6; margin: 5px 5px 0px; padding: 3px; background-color: #ffffff;">vi /etc/rc.local</div>
<p>在末尾增加以下内容：</p>
<div class="quote">
<div class="quote-title">引用</div>
<div class="quote-content">ulimit -SHn 51200<br />
/usr/local/webserver/php/sbin/php-fpm start<br />
/usr/local/webserver/nginx/sbin/nginx</div>
</div>
<hr /><strong>五、优化Linux内核参数</strong></p>
<div style="border: 1px dashed #00a0c6; margin: 5px 5px 0px; padding: 3px; background-color: #ffffff;">vi /etc/sysctl.conf</div>
<p>在末尾增加以下内容：</p>
<div class="quote">
<div class="quote-title">引用</div>
<div class="quote-content">net.ipv4.tcp_fin_timeout = 30<br />
net.ipv4.tcp_keepalive_time = 300<br />
net.ipv4.tcp_syncookies = 1<br />
net.ipv4.tcp_tw_reuse = 1<br />
net.ipv4.tcp_tw_recycle = 1<br />
net.ipv4.ip_local_port_range = 5000    65000</div>
</div>
<p>使配置立即生效：</p>
<div style="border: 1px dashed #00a0c6; margin: 5px 5px 0px; padding: 3px; background-color: #ffffff;">/sbin/sysctl -p</div>
<hr /><strong>六、在不停止Nginx服务的情况下平滑变更Nginx配置</strong><br />
1、修改/usr/local/webserver/nginx/conf/nginx.conf配置文件后，请执行以下命令检查配置文件是否正确：</p>
<div style="border: 1px dashed #00a0c6; margin: 5px 5px 0px; padding: 3px; background-color: #ffffff;">/usr/local/webserver/nginx/sbin/nginx -t</div>
<p>如果屏幕显示以下两行信息，说明配置文件正确：<br />
<span style="color: #008000;">the configuration file /usr/local/webserver/nginx/conf/nginx.conf syntax is ok<br />
the configuration file /usr/local/webserver/nginx/conf/nginx.conf was tested successfully</span></p>
<p>2、这时，输入以下命令查看Nginx主进程号：</p>
<div style="border: 1px dashed #00a0c6; margin: 5px 5px 0px; padding: 3px; background-color: #ffffff;">ps -ef | grep “nginx: master process” | grep -v “grep” | awk -F &#8216; &#8216; &#8216;{print $2}&#8217;</div>
<p>屏幕显示的即为Nginx主进程号，例如：<br />
<span style="color: #008000;">6302</span><br />
这时，执行以下命令即可使修改过的Nginx配置文件生效：</p>
<div style="border: 1px dashed #00a0c6; margin: 5px 5px 0px; padding: 3px; background-color: #ffffff;">kill -HUP 6302</div>
<p>或者无需这么麻烦，找到Nginx的Pid文件：</p>
<div style="border: 1px dashed #00a0c6; margin: 5px 5px 0px; padding: 3px; background-color: #ffffff;">kill -HUP `cat /usr/local/webserver/nginx/nginx.pid`</div>
<hr /><strong>七、编写每天定时切割Nginx日志的脚本</strong><br />
1、创建脚本/usr/local/webserver/nginx/sbin/cut_nginx_log.sh</p>
<div style="border: 1px dashed #00a0c6; margin: 5px 5px 0px; padding: 3px; background-color: #ffffff;">vi /usr/local/nginx/sbin/cut_nginx_log.sh</div>
<p>输入以下内容：</p>
<div class="quote">
<div class="quote-title">引用</div>
<div class="quote-content">#!/bin/bash<br />
# This script run at 00:00</p>
<p># The Nginx logs path<br />
logs_path=”/usr/local/webserver/nginx/logs/”</p>
<p>mkdir -p ${logs_path}$(date -d “yesterday” +”%Y”)/$(date -d “yesterday” +”%m”)/<br />
mv ${logs_path}access.log ${logs_path}$(date -d “yesterday” +”%Y”)/$(date -d “yesterday” +”%m”)/access_$(date -d “yesterday” +”%Y%m%d”).log<br />
kill -USR1 `cat /usr/local/webserver/nginx/nginx.pid`</p></div>
</div>
<p>2、设置crontab，每天凌晨00:00切割nginx访问日志</p>
<div style="border: 1px dashed #00a0c6; margin: 5px 5px 0px; padding: 3px; background-color: #ffffff;">crontab -e</div>
<p>输入以下内容：</p>
<div class="quote">
<div class="quote-title">引用</div>
<div class="quote-content">00 00 * * * /bin/bash  /usr/local/webserver/nginx/sbin/cut_nginx_log.sh</div>
</div>
<hr />本文若有小的修改，会第一时间在以下网址发布：<br />
<a href="http://blog.s135.com/post/366.htm" target="_blank">http://blog.s135.com/post/366.htm</a></p>
<hr /><strong>附：文章修改历史</strong></p>
<p>● [2008年08月29日] [Version 4.0] 撰写本文</p>
<p>● [2008年09月03日] [Version 4.1] 修改了nginx.conf文件有关gzip压缩的项，“gzip_http_version 1.1;”改为“gzip_http_version 1.0;”，增加一项“gzip_vary on;”，目的是为了让Nginx前端的Squid 2.5/2.6缓存服务器能够缓存经过gzip压缩的页面。另外，将nginx版本由0.7.13升级到最新的0.7.14。</p>
<p>● [2008年10月06日] [Version 4.2] 增加第七章──“编写每天定时切割Nginx日志的脚本”；升级Nginx版本到0.7.17；升级PHP FastCGI补丁到php-5.2.6-fpm-0.5.9.diff.gz；修改php-fpm.conf配置文件。</p>
<p>● [2008年10月26日] [Version 4.3] 升级Nginx版本到0.7.19。</p>
<p>● [2008年11月02日] [Version 4.4] 升级MySQL版本到5.1.29-rc。对文中涉及到的开源软件增加blog.s135.com下载点。</p>
<p>[文章作者：张宴 本文版本：v4.4 最后修改：<span style="color: #ff0000;">2008.11.02</span> 转载请注明原文链接：<a href="http://blog.s135.com/post/366.htm" target="_blank">http://blog.s135.com/post/366.htm</a>]<!--more--></p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.ptubuntu.com%2F2008%2F11%2F330.html&amp;title=%E6%9E%B6%E8%AE%BENginx%200.7.x%20%2B%20PHP%205.2.6%EF%BC%88FastCGI%EF%BC%89" id="wpa2a_8"><img src="http://www.ptubuntu.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.ptubuntu.com/2008/11/330.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

