<?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>Observer Life &#187; apache</title>
	<atom:link href="http://observerlife.com/tag/apache/feed/" rel="self" type="application/rss+xml" />
	<link>http://observerlife.com</link>
	<description>To be a better man (Observer)</description>
	<lastBuildDate>Sun, 05 Sep 2010 16:21:09 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Apache服务器TIME_WAIT过多的解决办法</title>
		<link>http://observerlife.com/apache%e6%9c%8d%e5%8a%a1%e5%99%a8time_wait%e8%bf%87%e5%a4%9a%e7%9a%84%e8%a7%a3%e5%86%b3%e5%8a%9e%e6%b3%95/</link>
		<comments>http://observerlife.com/apache%e6%9c%8d%e5%8a%a1%e5%99%a8time_wait%e8%bf%87%e5%a4%9a%e7%9a%84%e8%a7%a3%e5%86%b3%e5%8a%9e%e6%b3%95/#comments</comments>
		<pubDate>Sun, 28 Oct 2007 10:52:34 +0000</pubDate>
		<dc:creator>ycg</dc:creator>
				<category><![CDATA[Unix/Linux]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[time_wait]]></category>

		<guid isPermaLink="false">http://www.kedy.cn/blog/?p=297</guid>
		<description><![CDATA[默认安装的FreeBSD6.2，优化比较少，这几天服务器访问量涨了些，于是就出了N多问题。问题之一是TIME_WAIT的数过大，观察发现，TIME_WAIT达到5148(参考下面netstat的结果)以后就再也涨不上去。这样的话，其他用户访问就会受到影响。 FIN_WAIT_1 135 FIN_WAIT_2 41 LAST_ACK 15 CLOSING 7 TIME_WAIT 5148 ESTABLISHED 97 在Unix和Linux系统下，这个连接的时间默认值是3000，减小这个值则可以使这个time_wait的时间减小，然后netstat的结果 里，time_wati的值就会小很多。具体做法如下(只在FreeBSD下试用，其他系统下未经验证，不过从网上资料看，应该部分适用)： 在/etc/sysctl.conf文件里添加如下几行： net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_tw_recycle = 1 net.inet.tcp.msl = 2000 net.inet.tcp.always_keepalive = 0 然后要使之生效，有两种办法（两种办法都需要在super权限下）： 一是在super权限命令行下:sysctl -p 二是使用sysctl name=value 下面附上TIME_WAIT状态的意义： 客户端与服务器端建立TCP/IP连接后关闭SOCKET后，服务器端连接的端口 状态为TIME_WAIT 是不是所有执行主动关闭的socket都会进入TIME_WAIT状态呢？ 有没有什么情况使主动关闭的socket直接进入CLOSED状态呢？ 主动关闭的一方在发送最后一个 ack 后 就会进入 TIME_WAIT 状态 停留2MSL（max segment lifetime）时间 这个是TCP/IP必不可少的，也就是&#8220;解决&#8221;不了的。 也就是TCP/IP设计者本来是这么设计的 主要有两个原因 1。防止上一次连接中的包，迷路后重新出现，影响新连接 （经过2MSL，上一次连接中所有的重复包都会消失） 2。可靠的关闭TCP连接 在主动关闭方发送的最后一个 ack(fin) [...]]]></description>
			<content:encoded><![CDATA[<p id="fp"><span style="color: rgb(0, 0, 0); font-family: SimSun;">默认安装的FreeBSD6.2，优化比较少，</span><span style="color: rgb(0, 0, 0); font-family: SimSun;">这几天服务器访问量涨了些，于是就出了N多问题。问题之一是TIME_WAIT的数过大，观察发现，TIME_WAIT达到5148(参考下面netstat的结果)以后就再也涨不上去。这样的话，其他用户访问就会受到影响。</span><strong><span style="color: rgb(0, 0, 0); font-family: SimSun;"><br />
FIN_WAIT_1 135<br />
FIN_WAIT_2 41<br />
LAST_ACK 15<br />
CLOSING 7<br />
TIME_WAIT 5148<br />
ESTABLISHED 97</span></strong></p>
<p>在Unix和Linux系统下，这个连接的时间默认值是3000，减小这个值则可以使这个time_wait的时间减小，然后netstat的结果 里，time_wati的值就会小很多。具体做法如下(只在FreeBSD下试用，其他系统下未经验证，不过从网上资料看，应该部分适用)：</p>
<p>在/etc/sysctl.conf文件里添加如下几行：</p>
<p>net.ipv4.tcp_tw_reuse = 1<br />
net.ipv4.tcp_tw_recycle = 1<br />
net.inet.tcp.msl = 2000<br />
net.inet.tcp.always_keepalive = 0</p>
<p>然后要使之生效，有两种办法（两种办法都需要在super权限下）：<br />
一是在super权限命令行下:sysctl -p<br />
二是使用sysctl name=value</p>
<p>下面附上TIME_WAIT状态的意义：</p>
<p>客户端与服务器端建立TCP/IP连接后关闭SOCKET后，服务器端连接的端口<br />
状态为TIME_WAIT</p>
<p>是不是所有执行主动关闭的socket都会进入TIME_WAIT状态呢？<br />
有没有什么情况使主动关闭的socket直接进入CLOSED状态呢？</p>
<p>主动关闭的一方在发送最后一个 ack 后<br />
就会进入 TIME_WAIT 状态 停留2MSL（max segment lifetime）时间<br />
这个是TCP/IP必不可少的，也就是&ldquo;解决&rdquo;不了的。</p>
<p>也就是TCP/IP设计者本来是这么设计的<br />
主要有两个原因<br />
1。防止上一次连接中的包，迷路后重新出现，影响新连接<br />
（经过2MSL，上一次连接中所有的重复包都会消失）<br />
2。可靠的关闭TCP连接<br />
在主动关闭方发送的最后一个 ack(fin) ，有可能丢失，这时被动方会重新发<br />
fin, 如果这时主动方处于 CLOSED 状态 ，就会响应 rst 而不是 ack。所以<br />
主动方要处于 TIME_WAIT 状态，而不能是 CLOSED 。</p>
<p>TIME_WAIT 并不会占用很大资源的，除非受到攻击。</p>
<p>还有，如果一方 send 或 recv 超时，就会直接进入 CLOSED 状态</p>
<div id="crp_related"><h3>Related Posts:</h3><ul><li><a href="http://observerlife.com/%e7%88%b1%e8%bf%87%ef%bc%8c%e6%8b%bc%e8%bf%87%ef%bc%8c%e7%8e%a9%e8%bf%87%ef%bc%8c%e5%93%ad%e8%bf%87%e4%ba%8c-%e5%a4%a7%e5%ad%a6%e6%af%95%e4%b8%9a%e6%97%b6%e7%9a%84%e5%9b%9e%e9%a1%be/" rel="bookmark" class="crp_title">爱过，拼过，玩过，哭过(二) 大学毕业时的回顾</a></li><li><a href="http://observerlife.com/%e7%88%b1%e8%bf%87%ef%bc%8c%e6%8b%bc%e8%bf%87%ef%bc%8c%e7%8e%a9%e8%bf%87%ef%bc%8c%e5%93%ad%e8%bf%87%e4%b8%89-%e5%a4%a7%e5%ad%a6%e6%af%95%e4%b8%9a%e6%97%b6%e7%9a%84%e5%9b%9e%e9%a1%be/" rel="bookmark" class="crp_title">爱过，拼过，玩过，哭过(三) 大学毕业时的回顾</a></li><li><a href="http://observerlife.com/squid%e8%af%b7%e6%b1%82%e5%a4%84%e7%90%86%e7%9a%84%e5%85%b8%e5%9e%8b%e6%b5%81%e7%a8%8b/" rel="bookmark" class="crp_title">Squid请求处理的典型流程</a></li><li><a href="http://observerlife.com/%e7%88%b1%e8%bf%87%ef%bc%8c%e6%8b%bc%e8%bf%87%ef%bc%8c%e7%8e%a9%e8%bf%87%ef%bc%8c%e5%93%ad%e8%bf%87%e5%9b%9b-%e5%a4%a7%e5%ad%a6%e6%af%95%e4%b8%9a%e6%97%b6%e7%9a%84%e5%9b%9e%e9%a1%be/" rel="bookmark" class="crp_title">爱过，拼过，玩过，哭过(四) 大学毕业时的回顾</a></li><li><a href="http://observerlife.com/%e7%88%b1%e8%bf%87%ef%bc%8c%e6%8b%bc%e8%bf%87%ef%bc%8c%e7%8e%a9%e8%bf%87%ef%bc%8c%e5%93%ad%e8%bf%87%e4%b8%80-%e5%a4%a7%e5%ad%a6%e6%af%95%e4%b8%9a%e6%97%b6%e7%9a%84%e5%9b%9e%e9%a1%be/" rel="bookmark" class="crp_title">爱过，拼过，玩过，哭过(一) 大学毕业时的回顾</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://observerlife.com/apache%e6%9c%8d%e5%8a%a1%e5%99%a8time_wait%e8%bf%87%e5%a4%9a%e7%9a%84%e8%a7%a3%e5%86%b3%e5%8a%9e%e6%b3%95/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>关于Apache的TimeOut</title>
		<link>http://observerlife.com/%e5%85%b3%e4%ba%8eapache%e7%9a%84timeout/</link>
		<comments>http://observerlife.com/%e5%85%b3%e4%ba%8eapache%e7%9a%84timeout/#comments</comments>
		<pubDate>Sun, 28 Oct 2007 09:44:24 +0000</pubDate>
		<dc:creator>ycg</dc:creator>
				<category><![CDATA[Unix/Linux]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[timeout]]></category>

		<guid isPermaLink="false">http://www.kedy.cn/blog/?p=296</guid>
		<description><![CDATA[搞互联网开发也有好几年了，关于Apache的Timeout以前还真没有认真看过。羞!!! 今天一位网友访问不了魔秀， 刚开始没在意，还以为是网络的问题，因为我自己访问着非常正常。打开QQ的远程协助，登陆到对方电脑上，设置了hosts，不管用；ping 也ping不通。在准备放弃并告诉对方是网络原因，没有任何办法的时候，偶尔试着tracert了一下服务器所在机房的网关，发现可以到达，但我们的服务 器就不行。于是猜到是不是TimeOut的问题，增大这个值，重启Apache之后发现果然可以了。FT一下自己。下面把手册里关于timeout这一切 粘到这里来，以后得长个记性。这些天为服务器的负载能力发愁，看手册的时候不少，真的发现有好多之前被自己忽视的却是非常有用的东东。 &#160; TimeOut Directive Description: Amount of time the server will wait for certain events before failing a request Syntax: TimeOut seconds Default: TimeOut 300 Context: server config Status: Core Module: core The TimeOut directive currently defines the amount of time Apache will wait for three things: The total amount [...]]]></description>
			<content:encoded><![CDATA[<p id="fp">搞互联网开发也有好几年了，关于Apache的Timeout以前还真没有认真看过。羞!!! 今天一位网友访问不了<a href="http://www.moxiu.com/" target="_blank">魔秀</a>， 刚开始没在意，还以为是网络的问题，因为我自己访问着非常正常。打开QQ的远程协助，登陆到对方电脑上，设置了hosts，不管用；ping 也ping不通。在准备放弃并告诉对方是网络原因，没有任何办法的时候，偶尔试着tracert了一下服务器所在机房的网关，发现可以到达，但我们的服务 器就不行。于是猜到是不是TimeOut的问题，增大这个值，重启Apache之后发现果然可以了。FT一下自己。下面把手册里关于timeout这一切 粘到这里来，以后得长个记性。这些天为服务器的负载能力发愁，看手册的时候不少，真的发现有好多之前被自己忽视的却是非常有用的东东。</p>
<p class="directive-section">&nbsp;</p>
<h2><a title="TimeOut" id="TimeOut" name="TimeOut"></a>TimeOut <a title="timeout" id="timeout" name="timeout"></a>Directive</h2>
<table class="directive">
<tbody>
<tr>
<th><a href="../../../wp-admin/directive-dict.html#Description">Description:</a></th>
<td>Amount of time the server will wait for certain events before failing a  request</td>
</tr>
<tr>
<th><a href="../../../wp-admin/directive-dict.html#Syntax">Syntax:</a></th>
<td><code>TimeOut  <var>seconds</var></code></td>
</tr>
<tr>
<th><a href="../../../wp-admin/directive-dict.html#Default">Default:</a></th>
<td><code>TimeOut  300</code></td>
</tr>
<tr>
<th><a href="../../../wp-admin/directive-dict.html#Context">Context:</a></th>
<td>server config</td>
</tr>
<tr>
<th><a href="../../../wp-admin/directive-dict.html#Status">Status:</a></th>
<td>Core</td>
</tr>
<tr>
<th><a href="../../../wp-admin/directive-dict.html#Module">Module:</a></th>
<td>core</td>
</tr>
</tbody>
</table>
<p>The <code class="directive">TimeOut</code> directive currently defines the amount of  time Apache will wait for three things:</p>
<ol>
<li>The total amount of time it takes to receive a GET request.</li>
<li>The amount of time between receipt of TCP packets on a POST or PUT request.</li>
<li>The amount of time between ACKs on transmissions of TCP packets in  responses.</li>
</ol>
<p>We plan on making these separately configurable at some point down the road. The timer used to default to 1200 before 1.2, but has been lowered to 300 which is still far more than necessary in most situations. It is not set any lower by default because there may still be odd places in the code where the timer is not reset when a packet is sent.</p>
<p>最后再BS一下中国各个网络运营商，看看从天津铁通tracert的结果吧，无语了：<br />
Tracing route to www.moxiu.com [219.238.235.48]<br />
over a maximum of 30 hops:</p>
<p>1    92 ms    46 ms    49 ms  123.57.144.1<br />
2    47 ms    55 ms    49 ms  222.36.97.137<br />
3     *       45 ms    45 ms  222.36.96.17<br />
4    44 ms    45 ms    46 ms  222.36.96.126<br />
5    44 ms    43 ms    46 ms  202.131.16.78<br />
6    83 ms    83 ms   102 ms  219.72.0.25<br />
7    97 ms    82 ms    83 ms  219.72.0.1<br />
8    86 ms    82 ms    83 ms  219.72.0.6<br />
9    78 ms    78 ms     *     202.131.16.74<br />
10    82 ms    80 ms   228 ms  202.131.16.73<br />
11     *       82 ms    81 ms  202.101.187.137<br />
12    83 ms    81 ms    80 ms  220.191.133.141<br />
13    80 ms    76 ms    79 ms  61.130.125.37<br />
14    86 ms    87 ms    92 ms  202.97.41.237<br />
15   179 ms   117 ms   178 ms  202.97.36.38<br />
16   181 ms   114 ms     *     221.238.222.210<br />
17   114 ms   114 ms   178 ms  221.239.7.50<br />
18   114 ms   180 ms   181 ms  221.239.18.34<br />
19   121 ms   186 ms     *     202.99.57.190<br />
20   117 ms   186 ms   118 ms  219.238.235.48</p>
<p>Trace complete.</p>
<div id="crp_related"><h3>Related Posts:</h3><ul><li><a href="http://observerlife.com/xargs%e7%94%a8%e6%b3%95%e4%b8%80%e4%be%8b/" rel="bookmark" class="crp_title">Xargs用法一例</a></li><li><a href="http://observerlife.com/http-1-1%e7%8a%b6%e6%80%81%e4%bb%a3%e7%a0%81%e5%8f%8a%e5%85%b6%e5%90%ab%e4%b9%89/" rel="bookmark" class="crp_title">HTTP 1.1状态代码及其含义</a></li><li><a href="http://observerlife.com/http1-1-cache-control-header-field/" rel="bookmark" class="crp_title">HTTP/1.1 Cache-Control header field</a></li><li><a href="http://observerlife.com/preg_replace_callback%e6%80%8e%e6%a0%b7%e4%bd%bf%e7%94%a8%e7%b1%bb%e4%b8%ad%e7%9a%84%e5%9b%9e%e8%b0%83%e5%87%bd%e6%95%b0/" rel="bookmark" class="crp_title">preg_replace_callback()怎样使用类中的回调函数</a></li><li><a href="http://observerlife.com/%e5%87%a0%e7%82%b9%e4%b8%8d%e5%b8%b8%e8%a7%81%e7%9a%84mysql%e4%bc%98%e5%8c%96%e7%9f%a5%e8%af%86/" rel="bookmark" class="crp_title">几点不常见的MySQL优化知识</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://observerlife.com/%e5%85%b3%e4%ba%8eapache%e7%9a%84timeout/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Wap中常用的MIME Type</title>
		<link>http://observerlife.com/wap%e4%b8%ad%e5%b8%b8%e7%94%a8%e7%9a%84mime-type/</link>
		<comments>http://observerlife.com/wap%e4%b8%ad%e5%b8%b8%e7%94%a8%e7%9a%84mime-type/#comments</comments>
		<pubDate>Wed, 22 Aug 2007 03:01:55 +0000</pubDate>
		<dc:creator>ycg</dc:creator>
				<category><![CDATA[Unix/Linux]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[mime]]></category>
		<category><![CDATA[sis]]></category>
		<category><![CDATA[wap]]></category>
		<category><![CDATA[wml]]></category>

		<guid isPermaLink="false">http://www.kedy.cn/blog/?p=220</guid>
		<description><![CDATA[Apache 是一个优秀的应用服务器程序，已经提供了对一般WAP的支持。 如果你不确定你的Apache是否配置好了WAP支持，可以看一下Apache的配置文件&#34;mime.types&#34;。如果配置文件中这么一行： text/vnd.wap.wml&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; wml 如果没有的话，也不用着急，加上这一行就行了。如果你要配置全面一些的话还要加上以下几行： image/vnd.wap.wbmp&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; wbmp text/vnd.wap.wmls&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; wmls application/vnd.wap.wmlc&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; wmlc application/vnd.wap.wmlscriptc&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;wmlsc text/vnd.wap.wmlscript&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; wsc text/vnd.wap.wmlscript&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; wmlscript 修改好以后，重新启动Apache就可以了。 如果要系统支持index.wml的话，还得配置Apache的httpd.conf，类似添加index.php的配置了，略。 只所以说支持的是一般WAP，像一些安装文件jar，jad，sis之类的安装文件就没有默认支持。 如果要使Apache支持OTA（WAP PUSH）下载的话，还得在mime.types中添加下面几行： AddType image/vnd.nokia.ota-bitmap ota AddType text/vnd.sun.j2me.app-descriptor jad AddType application/java-archive jar AddType application/vnd.Nokie.ringing-tone rng AddType application/vnd.symbian.install sis （不加的话，下载类似sis的安装文件会直接打开该文件，而不会直接执行。） 更详细的文件类型配置如下： AddType text/vnd.sun.j2me.app-descriptor jad AddType application/java-archive jar AddType text/vnd.wap.wml wml AddType audio/amr amr AddType audio/midi mid AddType [...]]]></description>
			<content:encoded><![CDATA[<p>Apache 是一个优秀的应用服务器程序，已经提供了对<strong>一般</strong>WAP的支持。</p>
<p>如果你不确定你的Apache是否配置好了WAP支持，可以看一下Apache的配置文件&quot;mime.types&quot;。如果配置文件中这么一行：</p>
<p>text/vnd.wap.wml&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; wml</p>
<p>如果没有的话，也不用着急，加上这一行就行了。如果你要配置全面一些的话还要加上以下几行：</p>
<p>image/vnd.wap.wbmp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; wbmp<br />
text/vnd.wap.wmls&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; wmls<br />
application/vnd.wap.wmlc&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; wmlc<br />
application/vnd.wap.wmlscriptc&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wmlsc<br />
text/vnd.wap.wmlscript&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; wsc<br />
text/vnd.wap.wmlscript&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; wmlscript</p>
<p>修改好以后，重新启动Apache就可以了。</p>
<p>如果要系统支持index.wml的话，还得配置Apache的httpd.conf，类似添加index.php的配置了，略。</p>
<p>只所以说支持的是一般WAP，像一些安装文件jar，jad，sis之类的安装文件就没有默认支持。</p>
<p>如果要使Apache支持OTA（WAP PUSH）下载的话，还得在mime.types中添加下面几行：</p>
<p>AddType image/vnd.nokia.ota-bitmap ota<br />
AddType text/vnd.sun.j2me.app-descriptor jad<br />
AddType application/java-archive jar<br />
AddType application/vnd.Nokie.ringing-tone rng<br />
AddType application/vnd.symbian.install sis</p>
<p>（不加的话，下载类似sis的安装文件会直接打开该文件，而不会直接执行。）</p>
<p>更详细的文件类型配置如下：<br />
AddType text/vnd.sun.j2me.app-descriptor jad<br />
AddType application/java-archive jar<br />
AddType text/vnd.wap.wml wml<br />
AddType audio/amr amr<br />
AddType audio/midi mid<br />
AddType audio/midi midi<br />
AddType application/vnd.Nokie.ringing-tone rng<br />
AddType application/vnd.symbian.install sis<br />
AddType application/vnd.wap.wmlc wmlc<br />
AddType text/vnd.wap.wmlscript wmls<br />
AddType text/vnd.wap.wmlscript wmlsc<br />
AddType application/vnd.wap.sic sic<br />
AddType text/vnd.wap.si si<br />
AddType text/vnd.wap.sl sl<br />
AddType application/vnd.wap.slc slc<br />
AddType text/x-vCalendar vcs<br />
AddType text/v-vCard vcf<br />
AddType application/vnd.nokia.gamedata nqd<br />
AddType application/x-nokiagamedata ngd<br />
AddType image/vnd.wap.wmbp wbmp<br />
AddType image/x-bmp bmp<br />
AddType image/x-epoc-mbm mbm<br />
AddType image/vnd.nok-3dscreensaver n3a<br />
AddType text/x-co-desc cod<br />
AddType image/vnd.nok-oplogo-colornokia-op-logo nok<br />
AddType application/x-pmd .pmd<br />
AddType audio/vnd.qcelp .qcp<br />
AddType application/x-smaf .mmf<br />
AddType application/vnd.smaf</p>
<p>保存后，重启下Apache，OK了！</p>
<div id="crp_related"><h3>Related Posts:</h3><ul><li><a href="http://observerlife.com/%e5%bf%83%e6%9c%ac%e6%97%a0%e5%a3%b0%e9%9f%b3%e5%b0%bd%e6%9c%89/" rel="bookmark" class="crp_title">心本无声音尽有</a></li><li><a href="http://observerlife.com/2009%e5%b9%b4%e7%9a%84%e5%85%83%e5%ae%b5%e8%8a%82/" rel="bookmark" class="crp_title">2009年的元宵节&#8230;</a></li><li><a href="http://observerlife.com/%e4%b8%ad%e3%80%8a%e5%a3%ab%e5%85%b5%e7%aa%81%e5%87%bb%e3%80%8b%e7%9a%84%e2%80%9c%e6%af%92%e2%80%9d%e7%9a%84%e4%b8%bb%e8%a6%81%e7%97%87%e7%8a%b6-%e7%9c%8b%e4%bd%a0%e6%9c%89%e5%87%a0%e6%9d%a1%ef%bc%9f/" rel="bookmark" class="crp_title">中《士兵突击》的“毒”的主要症状 看你有几条？？</a></li><li><a href="http://observerlife.com/%e6%88%91%e7%9a%842006/" rel="bookmark" class="crp_title">我的2006</a></li><li><a href="http://observerlife.com/%e5%9b%bd%e5%ae%89vs%e7%94%b3%e8%8a%b1-23-%e9%83%81%e9%97%b7/" rel="bookmark" class="crp_title">国安vs申花 2:3&#8211;郁闷</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://observerlife.com/wap%e4%b8%ad%e5%b8%b8%e7%94%a8%e7%9a%84mime-type/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>apache 定制日志</title>
		<link>http://observerlife.com/apache-%e5%ae%9a%e5%88%b6%e6%97%a5%e5%bf%97/</link>
		<comments>http://observerlife.com/apache-%e5%ae%9a%e5%88%b6%e6%97%a5%e5%bf%97/#comments</comments>
		<pubDate>Thu, 09 Aug 2007 07:54:22 +0000</pubDate>
		<dc:creator>ycg</dc:creator>
				<category><![CDATA[Unix/Linux]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[定制]]></category>
		<category><![CDATA[日志]]></category>

		<guid isPermaLink="false">http://www.kedy.cn/blog/?p=206</guid>
		<description><![CDATA[有时候我们需要定制Apache默认日志的格式和内容，比如增加或减少日志所记录的信息、改变默认日志文件的格式等。本文介绍可以用日志记录的所有信息，以及如何设置Apache使其记录这些信息。 一、定义日志格式 很久以前，日志文件只有一种格式，这就是&#8220;公共格式&#8221;，许多人已经习惯于使用这种格式。随后出现了定制日志格式，而且看起来定制日志格式更很受欢迎，即使 公共日志格式本身也重新用定制日志格式定义。本文介绍的就是如何随心所欲地定制日志文件的格式、如何让日志文件记录自己想要的信息。 定制日志文件的格式涉及到两个指令，即LogFormat指令和CustomLog指令，默认httpd.conf文件提供了关于这两个指令的几个示例。 LogFormat指令定义格式并为格式指定一个名字，以后我们就可以直接引用这个名字。CustomLog指令设置日志文件，并指明日志文件所用的格式（通常通过格式的名字）。 LogFormat指令的功能是定义日志格式并为它指定一个名字。例如，在默认的httpd.conf文件中，我们可以找到下面这行代码： LogFormat &#34;%h %l %u %t \&#34;%r\&#34; %&#62;s %b&#34; common 该指令创建了一种名为&#8220;common&#8221;的日志格式，日志的格式在双引号包围的内容中指定。格式字符串中的每一个变量代表着一项特定的信息，这些信息按照格式串规定的次序写入到日志文件。 Apache文档已经给出了所有可用于格式串的变量及其含义，下面是其译文： &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;- %&#8230;a: 远程IP地址 %&#8230;A: 本地IP地址 %&#8230;B: 已发送的字节数，不包含HTTP头 %&#8230;b: CLF格式的已发送字节数量，不包含HTTP头。 例如当没有发送数据时，写入&#8216;-&#8217;而不是0。 %&#8230;{FOOBAR}e: 环境变量FOOBAR的内容 %&#8230;f: 文件名字 %&#8230;h: 远程主机 %&#8230;H 请求的协议 %&#8230;{Foobar}i: Foobar的内容，发送给服务器的请求的标头行。 %&#8230;l: 远程登录名字（来自identd，如提供的话） %&#8230;m 请求的方法 %&#8230;{Foobar}n: 来自另外一个模块的注解&#8220;Foobar&#8221;的内容 %&#8230;{Foobar}o: Foobar的内容，应答的标头行 %&#8230;p: 服务器响应请求时使用的端口 %&#8230;P: 响应请求的子进程ID。 %&#8230;q 查询字符串（如果存在查询字符串，则包含&#8220;?&#8221;后面的 部分；否则，它是一个空字符串。） %&#8230;r: 请求的第一行 [...]]]></description>
			<content:encoded><![CDATA[<p>有时候我们需要定制Apache默认日志的格式和内容，比如增加或减少日志所记录的信息、改变默认日志文件的格式等。本文介绍可以用日志记录的所有信息，以及如何设置Apache使其记录这些信息。 </p>
<p>一、定义日志格式</p>
<p>很久以前，日志文件只有一种格式，这就是&ldquo;公共格式&rdquo;，许多人已经习惯于使用这种格式。随后出现了定制日志格式，而且看起来定制日志格式更很受欢迎，即使 公共日志格式本身也重新用定制日志格式定义。本文介绍的就是如何随心所欲地定制日志文件的格式、如何让日志文件记录自己想要的信息。 </p>
<p>定制日志文件的格式涉及到两个指令，即LogFormat指令和CustomLog指令，默认httpd.conf文件提供了关于这两个指令的几个示例。 </p>
<p>LogFormat指令定义格式并为格式指定一个名字，以后我们就可以直接引用这个名字。CustomLog指令设置日志文件，并指明日志文件所用的格式（通常通过格式的名字）。 </p>
<p>LogFormat指令的功能是定义日志格式并为它指定一个名字。例如，在默认的httpd.conf文件中，我们可以找到下面这行代码： </p>
<p>LogFormat &quot;%h %l %u %t \&quot;%r\&quot; %&gt;s %b&quot; common </p>
<p>该指令创建了一种名为&ldquo;common&rdquo;的日志格式，日志的格式在双引号包围的内容中指定。格式字符串中的每一个变量代表着一项特定的信息，这些信息按照格式串规定的次序写入到日志文件。 </p>
<p>Apache文档已经给出了所有可用于格式串的变量及其含义，下面是其译文： </p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;- </p>
<p>%&#8230;a: 远程IP地址 </p>
<p>%&#8230;A: 本地IP地址 </p>
<p>%&#8230;B: 已发送的字节数，不包含HTTP头 </p>
<p>%&#8230;b: CLF格式的已发送字节数量，不包含HTTP头。 </p>
<p>例如当没有发送数据时，写入&lsquo;-&rsquo;而不是0。 </p>
<p>%&#8230;{FOOBAR}e: 环境变量FOOBAR的内容 </p>
<p>%&#8230;f: 文件名字 </p>
<p>%&#8230;h: 远程主机 </p>
<p>%&#8230;H 请求的协议 </p>
<p>%&#8230;{Foobar}i: Foobar的内容，发送给服务器的请求的标头行。 </p>
<p>%&#8230;l: 远程登录名字（来自identd，如提供的话） </p>
<p>%&#8230;m 请求的方法 </p>
<p>%&#8230;{Foobar}n: 来自另外一个模块的注解&ldquo;Foobar&rdquo;的内容 </p>
<p>%&#8230;{Foobar}o: Foobar的内容，应答的标头行 </p>
<p>%&#8230;p: 服务器响应请求时使用的端口 </p>
<p>%&#8230;P: 响应请求的子进程ID。 </p>
<p>%&#8230;q 查询字符串（如果存在查询字符串，则包含&ldquo;?&rdquo;后面的 </p>
<p>部分；否则，它是一个空字符串。） </p>
<p>%&#8230;r: 请求的第一行 </p>
<p>%&#8230;s: 状态。对于进行内部重定向的请求，这是指*原来*请求 </p>
<p>的状态。如果用%&#8230;&gt;s，则是指后来的请求。 </p>
<p>%&#8230;t: 以公共日志时间格式表示的时间（或称为标准英文格式） </p>
<p>%&#8230;{format}t: 以指定格式format表示的时间 </p>
<p>%&#8230;T: 为响应请求而耗费的时间，以秒计 </p>
<p>%&#8230;u: 远程用户（来自auth；如果返回状态（%s）是401则可能是伪造的） </p>
<p>%&#8230;U: 用户所请求的URL路径 </p>
<p>%&#8230;v: 响应请求的服务器的ServerName </p>
<p>%&#8230;V: 依照UseCanonicalName设置得到的服务器名字 </p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212; <br />
在所有上面列出的变量中，&ldquo;&#8230;&rdquo;表示一个可选的条件。如果没有指定条件，则变量的值将以&ldquo;-&rdquo;取代。分析前面来自默认httpd.conf文件的 LogFormat指令示例，可以看出它创建了一种名为&ldquo;common&rdquo;的日志格式，其中包括：远程主机，远程登录名字，远程用户，请求时间，请求的第一 行代码，请求状态，以及发送的字节数。 </p>
<p>有时候我们只想在日志中记录某些特定的、已定义的信息，这时就要用到&ldquo;&#8230;&rdquo;。如果在&ldquo;%&rdquo;和变量之间放入了一个或者多个HTTP状态代码，则只有当请 求返回的状态代码属于指定的状态代码之一时，变量所代表的内容才会被记录。例如，如果我们想要记录的是网站的所有无效链接，那么可以使用： </p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;- <br />
LogFormat %404{Referer}i BrokenLinks <br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212; </p>
<p>反之，如果我们想要记录那些状态代码不等于指定值的请求，只需加入一个&ldquo;!&rdquo;符号即可： </p>
<p>LogFormat %!200U SomethingWrong (仙人掌工作室 编译)</p>
<div id="crp_related"><h3>Related Posts:</h3><ul><li><a href="http://observerlife.com/%e7%a4%be%e7%be%a4%e7%bd%91%e7%ab%99%ef%bc%8c%e5%a6%82%e4%bd%95%e9%99%8d%e4%bd%8e%e7%94%a8%e6%88%b7%e7%9a%84%e6%8c%ab%e8%b4%a5%e6%84%9f/" rel="bookmark" class="crp_title">社群网站，如何降低用户的挫败感</a></li><li><a href="http://observerlife.com/e50%e7%9a%84%e5%90%8d%e7%89%87%e5%a4%b9%e6%98%af%e5%a6%82%e4%bd%95%e6%8e%92%e5%88%97%e7%9a%84%e7%bb%9d/" rel="bookmark" class="crp_title">E50的名片夹是如何排列的?绝!!</a></li><li><a href="http://observerlife.com/%e8%bd%ac%e8%bd%bd%e4%b8%80%e4%b8%aa%e5%be%b7%e5%9b%bd%e4%b8%8a%e5%8f%b8%e5%af%b9%e8%bf%9f%e5%88%b0%e6%89%a3%e5%b7%a5%e8%b5%84%e7%9a%84%e5%8f%8d%e5%ba%94/" rel="bookmark" class="crp_title">[转载]一个德国上司对迟到扣工资的反应</a></li><li><a href="http://observerlife.com/%e4%bc%81%e4%b8%9a%e6%bf%80%e5%8a%b1%e4%ba%ba%e6%89%8d%e6%9c%80%e5%ae%9e%e7%94%a8%e7%9a%84%e4%b8%83%e7%a7%8d%e6%96%b9%e6%b3%95/" rel="bookmark" class="crp_title">企业激励人才最实用的七种方法</a></li><li><a href="http://observerlife.com/%e3%80%8a%e5%a3%ab%e5%85%b5%e7%aa%81%e5%87%bb%e3%80%8b-%e6%af%8f%e4%b8%aa%e4%ba%ba%e7%9a%84%e5%bf%83%e7%81%b5%e5%8f%b2%ef%bc%88%e7%ac%ac%e4%b8%89%e8%8a%82%ef%bc%89/" rel="bookmark" class="crp_title">《士兵突击》- 每个人的心灵史（第三节）</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://observerlife.com/apache-%e5%ae%9a%e5%88%b6%e6%97%a5%e5%bf%97/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>关于apache的几个参数设置 [keepalive, MaxRequestsPerChild]</title>
		<link>http://observerlife.com/%e5%85%b3%e4%ba%8eapache%e7%9a%84%e5%87%a0%e4%b8%aa%e5%8f%82%e6%95%b0%e8%ae%be%e7%bd%ae-keepalive-maxrequestsperchild/</link>
		<comments>http://observerlife.com/%e5%85%b3%e4%ba%8eapache%e7%9a%84%e5%87%a0%e4%b8%aa%e5%8f%82%e6%95%b0%e8%ae%be%e7%bd%ae-keepalive-maxrequestsperchild/#comments</comments>
		<pubDate>Wed, 25 Jul 2007 01:36:36 +0000</pubDate>
		<dc:creator>ycg</dc:creator>
				<category><![CDATA[Unix/Linux]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[keepalive]]></category>
		<category><![CDATA[marrequest]]></category>

		<guid isPermaLink="false">http://www.kedy.cn/blog/?p=192</guid>
		<description><![CDATA[Copy From : http://www.lostk.com/bbs/thread-872-1-1.html apache的内存使用 apache进程在使用内存时，是&#8220;渐长&#8221;的。也就是说，直到这个进程死掉，使用内存的数量是一直增长而不会减少的。这样的话，apache进程使用内存的多少，就决定于你的应用程序最大使用内存量了。 keepalive参数 KeepAliveTimeout 这个参数决定了，在什么都不做之前，一个http进程能够等待多长时间？设想一下，如果keepalive设置为on,而 keepalivetimeout设置为一个比较大的数字，apache占用内存会很快的增长。这是因为，一个apache进程完成了一个任务（并达到了 一定的内存占用，想一下&#8220;渐进&#8221;模式），并不会马上退出，而是等待一个keepalivetimeout时间。假设用户的链接请求持续不断的到来，则积累 起来的无用的apache进程就会相当多，直到timeout，这些进程才会被杀死。 但是，keepalive的确对于静态的文件，比如图像文件的传送是很有效的，因此，keepalive要设置为on，但是keepalvietimeout要设置的小些，比如5s MaxRequestsPerChild 这个参数是说，apache进程在处理了多少个请求之后，必须退出，重新开始，以免在处理中的内存问题。 对于php脚本来说，把这个参数设置的小一些是有好处的，可以避免程序使用的内存持续增长对apache带来的压力：让这个参数定期释放内存，因为php是在脚本执行完毕后，自动释放只用的资源（内存）的。 比如设置为50？如果太小的话，重新产生一个apache进程也是要消耗资源的，这是一个平衡问题。 Related Posts:爱过，拼过，玩过，哭过(二) 大学毕业时的回顾创业公司的节奏E50的名片夹是如何排列的?绝!!承诺《士兵突击》：教人做人和教人杀人]]></description>
			<content:encoded><![CDATA[<p><span id="message11372" class="t_msgfont postmsg">Copy From : http://www.lostk.com/bbs/thread-872-1-1.html<br />
apache的内存使用</p>
<p>apache进程在使用内存时，是&ldquo;渐长&rdquo;的。也就是说，直到这个进程死掉，使用内存的数量是一直增长而不会减少的。这样的话，apache进程使用内存的多少，就决定于你的应用程序最大使用内存量了。</p>
<p>
keepalive参数</p>
<p>KeepAliveTimeout 这个参数决定了，在什么都不做之前，一个http进程能够等待多长时间？设想一下，如果keepalive设置为on,而 keepalivetimeout设置为一个比较大的数字，apache占用内存会很快的增长。这是因为，一个apache进程完成了一个任务（并达到了 一定的内存占用，想一下&ldquo;渐进&rdquo;模式），并不会马上退出，而是等待一个keepalivetimeout时间。假设用户的链接请求持续不断的到来，则积累 起来的无用的apache进程就会相当多，直到timeout，这些进程才会被杀死。</p>
<p>但是，keepalive的确对于静态的文件，比如图像文件的传送是很有效的，因此，keepalive要设置为on，但是keepalvietimeout要设置的小些，比如5s</p>
<p>MaxRequestsPerChild</p>
<p>这个参数是说，apache进程在处理了多少个请求之后，必须退出，重新开始，以免在处理中的内存问题。</p>
<p>对于php脚本来说，把这个参数设置的小一些是有好处的，可以避免程序使用的内存持续增长对apache带来的压力：让这个参数定期释放内存，因为php是在脚本执行完毕后，自动释放只用的资源（内存）的。</p>
<p>比如设置为50？如果太小的话，重新产生一个apache进程也是要消耗资源的，这是一个平衡问题。</span></p>
<div id="crp_related"><h3>Related Posts:</h3><ul><li><a href="http://observerlife.com/%e7%88%b1%e8%bf%87%ef%bc%8c%e6%8b%bc%e8%bf%87%ef%bc%8c%e7%8e%a9%e8%bf%87%ef%bc%8c%e5%93%ad%e8%bf%87%e4%ba%8c-%e5%a4%a7%e5%ad%a6%e6%af%95%e4%b8%9a%e6%97%b6%e7%9a%84%e5%9b%9e%e9%a1%be/" rel="bookmark" class="crp_title">爱过，拼过，玩过，哭过(二) 大学毕业时的回顾</a></li><li><a href="http://observerlife.com/%e5%88%9b%e4%b8%9a%e5%85%ac%e5%8f%b8%e7%9a%84%e8%8a%82%e5%a5%8f/" rel="bookmark" class="crp_title">创业公司的节奏</a></li><li><a href="http://observerlife.com/e50%e7%9a%84%e5%90%8d%e7%89%87%e5%a4%b9%e6%98%af%e5%a6%82%e4%bd%95%e6%8e%92%e5%88%97%e7%9a%84%e7%bb%9d/" rel="bookmark" class="crp_title">E50的名片夹是如何排列的?绝!!</a></li><li><a href="http://observerlife.com/%e6%89%bf%e8%af%ba/" rel="bookmark" class="crp_title">承诺</a></li><li><a href="http://observerlife.com/%e3%80%8a%e5%a3%ab%e5%85%b5%e7%aa%81%e5%87%bb%e3%80%8b%ef%bc%9a%e6%95%99%e4%ba%ba%e5%81%9a%e4%ba%ba%e5%92%8c%e6%95%99%e4%ba%ba%e6%9d%80%e4%ba%ba/" rel="bookmark" class="crp_title">《士兵突击》：教人做人和教人杀人</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://observerlife.com/%e5%85%b3%e4%ba%8eapache%e7%9a%84%e5%87%a0%e4%b8%aa%e5%8f%82%e6%95%b0%e8%ae%be%e7%bd%ae-keepalive-maxrequestsperchild/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Flickr 的开发者的 Web 应用优化技巧</title>
		<link>http://observerlife.com/flickr-%e7%9a%84%e5%bc%80%e5%8f%91%e8%80%85%e7%9a%84-web-%e5%ba%94%e7%94%a8%e4%bc%98%e5%8c%96%e6%8a%80%e5%b7%a7/</link>
		<comments>http://observerlife.com/flickr-%e7%9a%84%e5%bc%80%e5%8f%91%e8%80%85%e7%9a%84-web-%e5%ba%94%e7%94%a8%e4%bc%98%e5%8c%96%e6%8a%80%e5%b7%a7/#comments</comments>
		<pubDate>Wed, 11 Apr 2007 07:25:17 +0000</pubDate>
		<dc:creator>ycg</dc:creator>
				<category><![CDATA[Unix/Linux]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[优化]]></category>
		<category><![CDATA[服务器]]></category>

		<guid isPermaLink="false">http://www.kedy.cn/blog/?p=148</guid>
		<description><![CDATA[作者：Fenng &#124; English Version 【可以任意转载, 转载时请务必以超链接形式标明文章原始出处和作者信息及本声明】网址：http://www.dbanotes.net/web/flickr_web_tech.html &#160; Cal Henderson　是大名鼎鼎的 Flickr 网站的开发者之一．在一篇名为 Serving JavaScript Fast 的文章中，他介绍了用于 Flickr 站点应用优化的技巧，读罢感觉获益良多．&#34;嚼一下别人的馍&#34;，概括一下该文的主要内容． Flickr 是 Web 2.0 的代表站点。面对的网络问题除了一般 Web 站点都会有的内容优化之外, 还有必须要灵活处理 JavaScript 与 CSS 的频繁变化后部署分发带来的复杂性。 设定文件大小的策略 首先面临的一个问题是把所有的 JavaScript 与 CSS 放到一个文件中好呢，还是分割成多个文件 ? 从减少网络请求的角度上考虑, 前者更好，后者差。但是从并行的角度考虑, IE 与 Firefox 默认情况下都只能同时从一个域请求两个资源. 这会在很多情况下给用户带来不良的使用体验&#8211;必须所有的文件都下载完毕才可以看到像样的页面. Flickr 采用了折衷的办法&#8211;在保持文件数量尽可能少的情况下，把 JavaScript 与 CSS 分成多个子文件. 这在开发上带来了复杂性，但是对性能的收益是巨大的。 压缩的优化问题 毫无疑问，对站点内容进行压缩是一个比较常用的 Web 优化手段．但是并不一定都能达到理想的效果．原因在于 mod-gzip [...]]]></description>
			<content:encoded><![CDATA[<p>作者：<a href="http://www.dbanotes.net/">Fenng</a> | <a class="English" href="http://translate.google.com/translate?langpair=zh-CN%7Cen&amp;hl=zh-CN&amp;ie=UTF8&amp;u=http%3A//www.dbanotes.net/web/flickr_web_tech.html" target="_blank">English Version</a> 【可以任意转载, 转载时请务必以超链接形式标明文章原始出处和作者信息及<a href="http://creativecommons.org/licenses/by-sa/2.5/deed.zh">本声明</a>】<br />网址：<a class="permalink" href="http://www.dbanotes.net/web/flickr_web_tech.html"><font color="#800080">http://www.dbanotes.net/web/flickr_web_tech.html</font></a> </p>
<p class="entry-footer">&nbsp;</p>
<div class="entry-content">
<div class="entry-body">
<p>Cal Henderson　是大名鼎鼎的 <a href="http://www.flickr.com/">Flickr</a> 网站的开发者之一．在一篇名为 <a href="http://www.thinkvitamin.com/features/webapps/serving-%20-fast">Serving JavaScript Fast</a> 的文章中，他介绍了用于 Flickr 站点应用优化的技巧，读罢感觉获益良多．&quot;嚼一下别人的馍&quot;，概括一下该文的主要内容．</p>
<p><a href="http://www.flickr.com/">Flickr</a> 是 Web 2.0 的代表站点。面对的网络问题除了一般 Web 站点都会有的内容优化之外, 还有必须要灵活处理 JavaScript 与 <acronym title="Cascading Style Sheets">CSS</acronym> 的频繁变化后部署分发带来的复杂性。</p>
<p><strong>设定文件大小的策略</strong> 首先面临的一个问题是把所有的 JavaScript 与 <acronym title="Cascading Style Sheets">CSS</acronym> 放到一个文件中好呢，还是分割成多个文件 ? 从减少网络请求的角度上考虑, 前者更好，后者差。但是从并行的角度考虑, <acronym title="Internet Explorer">IE</acronym> 与 Firefox 默认情况下都只能同时从一个域请求两个资源. 这会在很多情况下给用户带来不良的使用体验&#8211;必须所有的文件都下载完毕才可以看到像样的页面. Flickr 采用了折衷的办法&#8211;在保持文件数量尽可能少的情况下，把 JavaScript 与 <acronym title="Cascading Style Sheets">CSS</acronym> 分成多个子文件. 这在开发上带来了复杂性，但是对性能的收益是巨大的。</p>
<p><strong>压缩的优化问题</strong> 毫无疑问，对站点内容进行压缩是一个比较常用的 Web 优化手段．但是并不一定都能达到理想的效果．原因在于 <a href="http://sourceforge.net/projects/mod-gzip/">mod-gzip</a> 模块不但消耗服务器端 <acronym title="Central Processing Unit">CPU</acronym> 资源，也消耗客户端 <acronym title="Central Processing Unit">CPU</acronym> 资源. 而且, mod_gzip 压缩文件后创建的临时文件是放到磁盘上的，这也会给磁盘 <acronym title="Input Output">IO</acronym> 带来严重的问题. Flickr 采用的是 Httpd 2.x 以后支持的　<a href="http://httpd.apache.org/docs/2.0/mod/mod_deflate.html">mod_deflate</a> 模块．压缩操作都在内存中进行．mod_deflate 在 Httpd 1.x 是不可用的, 不过可以通过创建 <acronym title="Random Access Memory">RAM</acronym> 盘的方式来间接提高性能．</p>
<p>当然, mod_gzip 到也不是一无是处, 对于预压缩的文件, 还是有好处的. 而且, 采用压缩的时候,也要注意策略. 图片文件压缩就没什么必要了(Flickr 上图像多, 而且压缩得不到什么好处). Flickr 只对 JavaScript 和 <acronym title="Cascading Style Sheets">CSS</acronym> 进行压缩. mod_gzip 新一点的版本能够自动通过配置 mod_gzip_update_static 选项自动处理 预压缩的文件. Cal 也指出这个特性在一些旧版本的浏览器上会出问题.</p>
<p>压缩的另一个主要手段是内容的压缩. 针对 JavaScript 可以进行通过减少注释、合并空格、使用紧凑的语法等小技巧(Google 的所有脚本都非常难读，而且非常紧凑，思想类似).当然，经过这样处理的 JavaScript 可能带了很多括号不容易解析，<a href="http://www.flickr.com/">Flickr</a> 使用了 <a href="http://dojotoolkit.org/docs/compressor_system.html">Dojo Compressor</a> 来构建解析树。Dojo Compressor 开销很低，而且对于最终用户是透明的. JavaScript 的处理方法介绍过，CSS 处理则相对简单.通过简单的正则表达式替换(比如把多个空格替换为一个空格符), 最高可以获得 50% 的压缩比。</p>
<p><strong>Caching 的优化</strong> <a href="http://www.flickr.com/">Flickr</a> 的开发者充分利用了 Http 1.1 规范定义的 <a href="http://www.dbanotes.net/web/http_11_etag_lastmodified.html">Etag 与 Last-Modified 机制</a> 来提高 Caching 的效率. 值得注意的是，Cal 介绍了一个在负载均衡条件下的 e-Tag 小技巧. 即可以设定 Apache 通过文件调整时间与文件大小获得 E-Tag ,而默认情况下, Apache 是通过文件节点获取 e-Tag 的。当然，这也不是很完美，因为会影响 if-modified-since 。</p>
<p><strong>灵活运用 mod_rewrite</strong> 据说 <a href="http://www.flickr.com/">Flickr</a> 网站应用是进行每日构建的(Daily Build)。 如果没有一个灵活的机制恐怕这是不可想象的。而且，在 Flickr 这样的站点, 内容的修改同步的处理都是很让人头疼的难题. 他们的利器是 <a href="http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html">mod_rewrite</a> 的灵活运用。通过配置 <acronym title="Unified Resource Locator">URL</acronym> 重写规则，很容易切换到不同的环境下。听起来很简单, 但是没有一定的 Web 技术功力谈何容易做到 ?!</p>
<p>通过这几个主要方法的运用，我们看到了如梦幻一般高性能的 <a href="http://www.flickr.com/">Flickr</a> .</p>
<p><acronym title="By The Way">BTW</acronym>: 因为在 Flickr 在国内没有服务器, 大陆用户访问的速度就别提了 <img src='http://observerlife.com/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> </p>
<p>&#8211;End.</p>
</div>
</div>
<div id="crp_related"><h3>Related Posts:</h3><ul><li><a href="http://observerlife.com/msn%e5%8e%bb%e5%b9%bf%e5%91%8a%e8%a1%a5%e4%b8%81%e6%94%af%e6%8c%818-0beta/" rel="bookmark" class="crp_title">MSN去广告补丁(支持8.0Beta)</a></li><li><a href="http://observerlife.com/%e8%bd%ac%e8%bd%bd%e6%96%b0%e7%89%88gtd%e6%b5%81%e7%a8%8b%e5%9b%be-%e4%b8%ad%e6%96%87-%e9%9d%9e%e5%b8%b8%e7%b2%be%e5%bd%a9/" rel="bookmark" class="crp_title">[转载]新版GTD流程图-中文-非常精彩</a></li><li><a href="http://observerlife.com/%e6%94%b6%e8%8e%b7%e4%b8%80%e7%94%9f%e5%ad%a6%e4%b9%a0%e4%b9%a0%e6%83%af%e7%9a%8415%e4%b8%aa%e6%ad%a5%e9%aa%a4/" rel="bookmark" class="crp_title">收获一生学习习惯的15个步骤</a></li><li><a href="http://observerlife.com/php%e9%87%8c%e7%9a%84%e6%96%87%e4%bb%b6%e7%8a%b6%e6%80%81%e7%bc%93%e5%ad%98/" rel="bookmark" class="crp_title">PHP里的文件状态缓存</a></li><li><a href="http://observerlife.com/%e4%bb%8a%e6%97%a5%e9%98%85%e8%af%bb%ef%bc%9a%e6%80%a7%e8%83%bd%e6%89%a9%e5%b1%95%e9%97%ae%e9%a2%98%e8%a6%81%e8%b6%81%e6%97%a9/" rel="bookmark" class="crp_title">今日阅读：性能扩展问题要趁早</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://observerlife.com/flickr-%e7%9a%84%e5%bc%80%e5%8f%91%e8%80%85%e7%9a%84-web-%e5%ba%94%e7%94%a8%e4%bc%98%e5%8c%96%e6%8a%80%e5%b7%a7/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Apache的Mod_rewrite学习（二）</title>
		<link>http://observerlife.com/apache%e7%9a%84mod_rewrite%e5%ad%a6%e4%b9%a0%ef%bc%88%e4%ba%8c%ef%bc%89/</link>
		<comments>http://observerlife.com/apache%e7%9a%84mod_rewrite%e5%ad%a6%e4%b9%a0%ef%bc%88%e4%ba%8c%ef%bc%89/#comments</comments>
		<pubDate>Wed, 11 Apr 2007 07:24:18 +0000</pubDate>
		<dc:creator>ycg</dc:creator>
				<category><![CDATA[Unix/Linux]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[mod_rewrite]]></category>

		<guid isPermaLink="false">http://www.kedy.cn/blog/?p=147</guid>
		<description><![CDATA[　今天学习重写规则的语法。 RewriteRuleSyntax: RewriteRule Pattern Substitution [flags] 　　一条RewriteRule指令，定义一条重写规则，规则间的顺序非常重要。对Apache1.2及以后的版本，模板(pattern)是一个POSIX正则式，用以匹配当前的URL。当前的URL不一定是用记最初提交的URL，因为可能用一些规则在此规则前已经对URL进行了处理。　　对mod_rewrite来说，！是个合法的模板前缀，表示&#8220;非&#8221;的意思，这对描述&#8220;不满足某种匹配条件&#8221;的情况非常方便，或用作最后一条默认规则。当使用！时，不能在模板中有分组的通配符，也不能做后向引用。　　当匹配成功后，Substitution会被用来替换相应的匹配，它除了可以是普通的字符串以外，还可以包括： $N,引用RewriteRule模板中匹配的相关字串，N表示序号,N=0..9 %N,引用最后一个RewriteCond模板中匹配的数据，N表示序号 %{VARNAME},服务器变量 ${mapname:key&#124;default},映射函数调用 这些特殊内容的扩展，按上述顺序进行。　　一个URL的全部相关部分都会被Substitution替换，而且这个替换过程会一直持续到所有的规则都被执行完，除非明确地用L标志中断处理过程。　　当susbstitution有&#8221;-&#8221;前缀时，表示不进行替换，只做匹配检查。　　利用RewriteRule，可定义含有请求串(Query String)的URL，此时只需在Sustitution中加入一个？，表示此后的内容放入QUERY_STRING变量中。如果要清空一个QUERY_STRING变量，只需要以？结束Substitution串即可。　　如果给一个Substitution增加一个http://thishost[:port]的前缀，则mod_rewrite会自动将此前缀去掉。因此，利用http://thisthost做一个无条件的重定向到自己，将难以奏效。要实现这种效果，必须使用R标志。　　Flags是可选参数，当有多个标志同时出现时，彼此间以逗号分隔。 &#8216;redirect&#124;R [=code]&#8216; (强制重定向)　　给当前的URI增加前缀http://thishost[:thisport]/， 从而生成一个新的URL，强制生成一个外部重定向(external redirection，指生的URL发送到客户端，由客户端再次以新的URL发出请求，虽然新URL仍指向当前的服务器). 如果没有指定的code值，则HTTP应答以状态值302 (MOVED TEMPORARILY)，如果想使用300-400（不含400）间的其它值可以通过在code的位置以相应的数字指定，也可以用标志名指定： temp (默认值), permanent, seeother.　　注意，当使用这个标志时，要确实substitution是个合法的URL，这个标志只是在URL前增加http://thishost[:thisport]/前缀而已，重写操作会继续进行。如果要立即将新URL重定向，用L标志来中重写流程。 &#8216;forbidden&#124;F&#8217; (强制禁止访问URL所指的资源)　　立即返回状态值403 (FORBIDDEN)的应答包。将这个标志与合适的RewriteConds 联合使用，可以阻断访问某些URL。 &#8216;gone&#124;G&#8217; (强制返回URL所指资源为不存在(gone))　　立即返回状态值410 (GONE)的应答包。用这个标志来标记URL所指的资源永久消失了. # &#8216;proxy&#124;P&#8217; (强制将当前URL送往代理模块（proxy module）)　　这个标志，强制将substitution当作一个发向代理模块的请求，并立即将共送往代理模块。因此，必须确保substitution串是一个合法的URI (如, 典型的情况是以http://hostname开头)，否则会从代理模块得到一个错误. 这个标志，是ProxyPass指令的一个更强劲的实现，将远程请求(remote stuff)映射到本地服务器的名字空间(namespace)中来。　　注意，使用这个功能必须确保代理模块已经编译到Apache 服务器程序中了. 可以用&#8220;httpd -l &#8221;命令，来检查输出中是否含有mod_proxy.c来确认一下。如果没有，而又需要使用这个功能，则需要重新编译&#8220;httpd&#8221;程序并使用mod_proxy有效。 &#8216;last&#124;L&#8217; (最后一条规则)　　中止重写流程，不再对当前URL施加更多的重写规则。这相当于perl的last命令或C的break命令。 &#8216;next&#124;N&#8217; (下一轮)　　重新从第一条重写规则开始执行重写过程，新开的过程中的URL不应当与最初的URL相同。 这相当于Perl的next命令或C的continue命令. 千万小心不要产生死循环。 # &#8216;chain&#124;C&#8217; (将当前的规则与其后续规则綑绑(chained))　　当规则匹配时，处理过程与没有綑绑一样；如果规则不匹配，则綑绑在一起的后续规则也不在检查和执行。 &#8216;type&#124;T=MIME-type&#8217; (强制MIME类型)　　强制将目标文件的MIME-type为某MIME类型。例如，这可用来模仿mod_alias模块对某目录的ScriptAlias指定，通过强制将该目录下的所有文件的类型改为 [...]]]></description>
			<content:encoded><![CDATA[<p>　今天学习重写规则的语法。<a name="more"></a></p>
<p><strong>RewriteRule</strong><br />Syntax: RewriteRule Pattern Substitution [flags] <br />　　一条RewriteRule指令，定义一条重写规则，规则间的顺序非常重要。对Apache1.2及以后的版本，模板(pattern)是一个POSIX正则式，用以匹配当前的URL。当前的URL不一定是用记最初提交的URL，因为可能用一些规则在此规则前已经对URL进行了处理。<br />　　对mod_rewrite来说，！是个合法的模板前缀，表示&ldquo;非&rdquo;的意思，这对描述&ldquo;不满足某种匹配条件&rdquo;的情况非常方便，或用作最后一条默认规则。当使用！时，不能在模板中有分组的通配符，也不能做后向引用。<br />　　当匹配成功后，Substitution会被用来替换相应的匹配，它除了可以是普通的字符串以外，还可以包括： </p>
<ol>
<li>$N,引用RewriteRule模板中匹配的相关字串，N表示序号,N=0..9 </li>
<li>%N,引用最后一个RewriteCond模板中匹配的数据，N表示序号 </li>
<li>%{VARNAME},服务器变量 </li>
<li>${mapname:key|default},映射函数调用 </li>
</ol>
<p>这些特殊内容的扩展，按上述顺序进行。<br />　　一个URL的全部相关部分都会被Substitution替换，而且这个替换过程会一直持续到所有的规则都被执行完，除非明确地用L标志中断处理过程。<br />　　当susbstitution有&rdquo;-&rdquo;前缀时，表示不进行替换，只做匹配检查。<br />　　利用RewriteRule，可定义含有请求串(Query String)的URL，此时只需在Sustitution中加入一个？，表示此后的内容放入QUERY_STRING变量中。如果要清空一个QUERY_STRING变量，只需要以？结束Substitution串即可。<br />　　如果给一个Substitution增加一个http://thishost[:port]的前缀，则mod_rewrite会自动将此前缀去掉。因此，利用http://thisthost做一个无条件的重定向到自己，将难以奏效。要实现这种效果，必须使用R标志。<br />　　Flags是可选参数，当有多个标志同时出现时，彼此间以逗号分隔。</p>
<ol>
<li>&#8216;redirect|R [=code]&#8216; (强制重定向)<br />　　给当前的URI增加前缀http://thishost[:thisport]/， 从而生成一个新的URL，强制生成一个外部重定向(external redirection，指生的URL发送到客户端，由客户端再次以新的URL发出请求，虽然新URL仍指向当前的服务器). 如果没有指定的code值，则HTTP应答以状态值302 (MOVED TEMPORARILY)，如果想使用300-400（不含400）间的其它值可以通过在code的位置以相应的数字指定，也可以用标志名指定： temp (默认值), permanent, seeother.<br />　　注意，当使用这个标志时，要确实substitution是个合法的URL，这个标志只是在URL前增加http://thishost[:thisport]/前缀而已，重写操作会继续进行。如果要立即将新URL重定向，用L标志来中重写流程。</li>
<li>&#8216;forbidden|F&#8217; (强制禁止访问URL所指的资源)<br />　　立即返回状态值403 (FORBIDDEN)的应答包。将这个标志与合适的RewriteConds 联合使用，可以阻断访问某些URL。</li>
<li>&#8216;gone|G&#8217; (强制返回URL所指资源为不存在(gone))<br />　　立即返回状态值410 (GONE)的应答包。用这个标志来标记URL所指的资源永久消失了.</li>
<li># &#8216;proxy|P&#8217; (强制将当前URL送往代理模块（proxy module）)<br />　　这个标志，强制将substitution当作一个发向代理模块的请求，并立即将共送往代理模块。因此，必须确保substitution串是一个合法的URI (如, 典型的情况是以http://hostname开头)，否则会从代理模块得到一个错误. 这个标志，是ProxyPass指令的一个更强劲的实现，将远程请求(remote stuff)映射到本地服务器的名字空间(namespace)中来。<br />　　注意，使用这个功能必须确保代理模块已经编译到Apache 服务器程序中了. 可以用&ldquo;httpd -l &rdquo;命令，来检查输出中是否含有mod_proxy.c来确认一下。如果没有，而又需要使用这个功能，则需要重新编译&#8220;httpd&#8221;程序并使用mod_proxy有效。</li>
<li>&#8216;last|L&#8217; (最后一条规则)<br />　　中止重写流程，不再对当前URL施加更多的重写规则。这相当于perl的last命令或C的break命令。</li>
<li>&#8216;next|N&#8217; (下一轮)<br />　　重新从第一条重写规则开始执行重写过程，新开的过程中的URL不应当与最初的URL相同。 这相当于Perl的next命令或C的continue命令. 千万小心不要产生死循环。</li>
<li># &#8216;chain|C&#8217; (将当前的规则与其后续规则綑绑(chained))<br />　　当规则匹配时，处理过程与没有綑绑一样；如果规则不匹配，则綑绑在一起的后续规则也不在检查和执行。</li>
<li>&#8216;type|T=MIME-type&#8217; (强制MIME类型)<br />　　强制将目标文件的MIME-type为某MIME类型。例如，这可用来模仿mod_alias模块对某目录的ScriptAlias指定，通过强制将该目录下的所有文件的类型改为 &ldquo;application/x-httpd-cgi&rdquo;.</li>
<li>&#8216;nosubreq|NS&#8217; (used only if no internal sub-request )<br />　　这个标志强制重写引擎跳过为内部sub-request的重写规则.例如，当mod_include试图找到某一目录下的默认文件时 (index.xxx)，sub-requests 会在Apache内部发生. Sub-requests并非总是有用的，在某些情况下如果整个规则集施加到它上面，会产生错误。利用这个标志可排除执行一些规则。</li>
<li>&#8216;nocase|NC&#8217; (模板不区分大小写)<br />　　这个标志会使得模板匹配当前URL时忽略大小写的差别。</li>
<li>&#8216;qsappend|QSA&#8217; (追加请求串(query string))<br />　　这个标志，强制重写引擎为Substitution的请求串追加一部分串，则不是替换掉原来的。借助这个标志，可以使用一个重写规则给请求串增加更多的数据。</li>
<li>&#8216;noescape|NE&#8217; (不对输出结果中的特殊字符进行转义处理)<br />　　通常情况下，mod_write的输出结果中，特殊字符（如&#8217;%', &#8216;$&#8217;, &#8216;;&#8217;, 等)会转义为它们的16进制形式(如分别为&#8217;%25&#8242;, &#8216;%24&#8242;, and &#8216;%3B&#8217;）。这个标志会禁止mod_rewrite对输出结果进行此类操作。 这个标志只能在 Apache 1.3.20及以后的版本中使用。</li>
<li>&#8216;passthrough|PT&#8217; (通过下一个处理器)<br />　　这个标志强制重写引擎用filename字段的值来替换内部request_rec数据结构中uri字段的值。. 使用这个标志，可以使后续的其它URI－to-filename转换器的Alias、ScriptAlias、Redirect等指令，也能正常处理RewriteRule指令的输出结果。用一个小例子来说明它的语义：如果要用mod_rewrite的重写引擎将/abc转换为/def,然后用mod_alas将/def重写为ghi，则要：<br />RewriteRule ^/abc(.*) /def$1 [PT]<br />Alias /def /ghi<br />如果PT标志被忽略，则mod_rewrite也能很好完成工作,如果., 将 uri=/abc/&#8230; 转换为filename=/def/&#8230; ，完全符合一个URI-to-filename转换器的动作。接下来 mod_alias 试图做 URI-to-filename 转换时就会出问题。<br />注意:如果要混合都含有URL－to-filename转换器的不同的模块的指令，必须用这个标志。最典型的例子是mod_alias和mod_rewrite的使用。 </li>
<li>&#8216;skip|S=num&#8217; (跳过后面的num个规则)<br />　　当前规则匹配时，强制重写引擎跳过后续的num个规则。用这个可以来模仿if-then-else结构：then子句的最后一条rule的标志是skip=N，而N是else子句的规则条数。</li>
<li>&#8216;env|E=VAR:VAL&#8217; (设置环境变量)<br />　　设置名为VAR的环境变量的值为VAL,其中VAL中可以含有正则式的后向引用($N或%N)。这个标志可以使用多次，以设置多个环境变量。这儿设置的变量，可以在多种情况下被引用，如在XSSI或CGI中。另外，也可以在RewriteCond模板中以%{ENV:VAR}的形式被引用。</li>
<li>&nbsp;</li>
</ol>
<p>注意：一定不要忘记，在服务器范围内的配置文件中，模板(pattern)用以匹配整个URL;而在目录范围内的配置文件中，目录前缀总是被自动去掉后再进行模板匹配的，且在替换完成后自动再加上这个前缀。这个功能对很多种类的重写是非常重要的，因为如果没有去前缀，则要进行父目录的匹配，而父目录的信息并不是总能得到的。一个例外是，当substitution中有http://打头时，则不再自动增加前缀了，如果P标志出现，则会强制转向代理。<br />注意：如果要在某个目录范围内启动重写引擎，则需要在相应的目录配置文件中设置&ldquo;RewriteEngine on&rdquo;，且目录的&ldquo;Options FollowSymLinks&rdquo;必须设置。如果管理员由于安全原因没有打开FollowSymLinks，则不能使用重写引擎。</p>
<div id="crp_related"><h3>Related Posts:</h3><ul><li><a href="http://observerlife.com/apache%e7%9a%84mod_rewrite%e5%ad%a6%e4%b9%a0%ef%bc%88%e4%b8%80%ef%bc%89/" rel="bookmark" class="crp_title">Apache的Mod_rewrite学习（一）</a></li><li><a href="http://observerlife.com/e50%e7%9a%84%e5%90%8d%e7%89%87%e5%a4%b9%e6%98%af%e5%a6%82%e4%bd%95%e6%8e%92%e5%88%97%e7%9a%84%e7%bb%9d/" rel="bookmark" class="crp_title">E50的名片夹是如何排列的?绝!!</a></li><li><a href="http://observerlife.com/%e4%bc%81%e4%b8%9a%e6%bf%80%e5%8a%b1%e4%ba%ba%e6%89%8d%e6%9c%80%e5%ae%9e%e7%94%a8%e7%9a%84%e4%b8%83%e7%a7%8d%e6%96%b9%e6%b3%95/" rel="bookmark" class="crp_title">企业激励人才最实用的七种方法</a></li><li><a href="http://observerlife.com/%e3%80%8a%e5%a3%ab%e5%85%b5%e7%aa%81%e5%87%bb%e3%80%8b-%e6%af%8f%e4%b8%aa%e4%ba%ba%e7%9a%84%e5%bf%83%e7%81%b5%e5%8f%b2%ef%bc%88%e7%ac%ac%e4%b8%89%e8%8a%82%ef%bc%89/" rel="bookmark" class="crp_title">《士兵突击》- 每个人的心灵史（第三节）</a></li><li><a href="http://observerlife.com/%e3%80%8a%e5%a3%ab%e5%85%b5%e7%aa%81%e5%87%bb%e3%80%8b-%e6%af%8f%e4%b8%aa%e4%ba%ba%e7%9a%84%e5%bf%83%e7%81%b5%e5%8f%b2%ef%bc%88%e7%ac%ac%e4%ba%8c%e8%8a%82%ef%bc%89/" rel="bookmark" class="crp_title">《士兵突击》- 每个人的心灵史（第二节）</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://observerlife.com/apache%e7%9a%84mod_rewrite%e5%ad%a6%e4%b9%a0%ef%bc%88%e4%ba%8c%ef%bc%89/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Apache的Mod_rewrite学习（一）</title>
		<link>http://observerlife.com/apache%e7%9a%84mod_rewrite%e5%ad%a6%e4%b9%a0%ef%bc%88%e4%b8%80%ef%bc%89/</link>
		<comments>http://observerlife.com/apache%e7%9a%84mod_rewrite%e5%ad%a6%e4%b9%a0%ef%bc%88%e4%b8%80%ef%bc%89/#comments</comments>
		<pubDate>Wed, 11 Apr 2007 07:23:22 +0000</pubDate>
		<dc:creator>ycg</dc:creator>
				<category><![CDATA[Unix/Linux]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[mod_rewrite]]></category>

		<guid isPermaLink="false">http://www.kedy.cn/blog/?p=146</guid>
		<description><![CDATA[　　车东很早就写了一篇文章来介绍利用mod_rewrite模块来达到用静态页面形式的链接隐藏后台的动态页面。　　Apache的rewrite模块，提供了一个基于规则的重写(rewrite,也许译为重构更为合适)引擎，来实时重写发送到Apache的请求URL。因功能极其强大，被称为URL重写的&#8220;瑞士军刀&#8221;。 　　这个模块使用一个基于正则表达式解析器开发的重写引擎，根据web管理员定义的规则来实时(on the fly)重写请求URL。它支持任意数目的重写规则，以及附加到一条规则上的任意数目的规则条件，从而提供了一套非常灵活和功能强大的URL处理机制。URL处理操作的实施与否，依赖于各种各样的条件检查，如检查服务器变量、环境变量、HTTP头字段、时间戳的值，甚至外部数据库的检索结果。这个模块可以在服务器范围内(http.conf)、目录范围内(.htaccess)或请求串(query-string)的一部分处理有关的URL。重写的结果URL，可以指向一个站内的处理程序、指向站外的重定向或者一个站内的代理。与灵活和功能强大相随的是设置的复杂，别指望一天内弄明白整个模块。(所以，这个学习笔记也分了几部分：)　　 内部处理过程 API阶段　　首先，Apache处理HTTP请求是分阶段进行的,Apache API为每个阶段提供了一个钩子(hook)。Mod_rewrite使用了其中的两个钩子：一个用来在HTTP请求被读取但还没有访问授权验证之前进行URL_to_filename转换，一个用来在授权验证完成且目录设置文件(.htaccess)读取之后、但内容处理器(content handler)被调用之前激化，进行修补(fixup).因此，当一个请求到达，Apache决定了相关的服务器（或虚拟服务器）以后进行URL_to_filename阶段，重写引擎(rewrite engine)开始处理服务器设置中的重写指令(mod_rewrite directives).接下来几个阶段过后进入修补阶段，此时最终的数据所在的物理目录已经找到，目录配置中的重写指令开始执行。在这两个阶段，mod_rewrite都是将URL重写为新的URL或文件名，所以看起来并没有明显的区别。对API的这种应用，并不是一开始就是这样设计的，而是Apache1.x不得已而为之。为了搞清这个问题，以下两点需要记住。　　1)虽然mod_rewrite能进行URL到URL、URL到文件名字甚至文件名字到文件名字的转换，API(1.x)目前提供了一个URL_to_filename转换。在Apache2.0中，这两个钩子会被加进去，整个过程会更加清晰。一个事实必须清楚的记得：Apache在URL_to_filename钩子中，做得比API设计的功能更多。　　2)不可思议的是，mod_rewrite能在目录范围内（如根据.htaccess文件的指令配置）进行URL处理，虽然URL很早就已经被转换为文件名字了。只所以会如此，是因为.htaccess文件存在于文件系统中。也就是说，在这个阶段来进行URL处理，是非常晚的时候了。为了解决这个&#34;先有鸡还是先有蛋&#34;的问题，mod_rewrite用了一个小技巧：当在目录范围内处理URL/filename时，mod_rewrite先将文件名逆转回相关的URL(虽然通常是不可能的，但请参见下面用以实现这个技巧的RewriteBase指令)，然后据这个新URL生成一个站内的子请求(internal sub-request)，这又重开始了API进程。Mod_rewrite尽量使这些复杂的步骤对用户透明，但应要记住：虽然目录范围URL的真正处理过程很快很高效，但这一阶段会因为这个&#34;鸡和蛋&#34;的问题而变得很慢和低效。从另一方面来看，这也是mod_rewrite提供给普通用户进行目录范围内的URL处理的唯一途径.规则集(RewriteRule指令集合)处理过程　　当mod_rewrite在上述的两个API阶段被激活时，它会从它的配置数据结构（在开始服务器上下文(per-server context)或目录上下文(per-directory context)时创建的）中读取配置的规则集，然后URL重写引擎启动来执行包含的规则集（一个或多条规则以及它们的条件）。两种上下文中的处理过程都是一样的，差别只是在最后的结果处理过程上。　　规则集中规则的顺序是非常重要的，因为重写引擎以特定的顺序来处理它们。重写引擎顺序遍历规则集，当一条规则匹配时，引擎会去遍历与它相关的条件集(RewriteCond指令集合).由于历史的原因，条件集先被列出来，因此控制流流程有点曲折(long-winded).如图一所示：　　正如所看到的，首先URL会与每条规则的模板(pattern)比较，当匹配失败时，立即停止对当前规则的处理进入下一条规则。当匹配成功时，mod_rewrite寻找相关的规则条件。如果找不到相关的条件，则直接执行规则中定义的替换，然后回到规则遍历的过程。如果找到了相关的条件，则启动一个内部循环，依次检查各个条件。对于检查，我们不是拿一个模板来匹配当前的URL，而是先创建一个TestString串，将串内的变量、后向引用(bakc-reference)、查询结果(map lookups)等展开，然后用这个TestString和条件式中的CondPattern进行匹配，如果匹配失败，则整个条件集且这个规则都不再执行，重要回到规则遍历中；如果匹配成功，则检查下一个条件，如果所有的条件都满足，则执行规则中定义的替换动作。　　特殊字符的转义　　既然基于正则式，则当然会有特殊字符的问题。在1.3.20版本的Apache中，通过在特殊字符前加一个&#8220;&#8221;来将TestString或Sustitution串的特殊字符转义。正则式的后向引用　　有一点需要记住：一旦在模板(pattern)或条件模板(CondPattern)中使用了括号，则后向引用已经自动产生了，你可以在Sustitution或TestString中通过$N或%N来引用相关的值。如图，描述了后向引用的值可以传到的位置。 配置指令(Configuration Directives) 指令 语法 默认值 说明 备注 RewriteEngine RewriteEngine on&#124;off Off 开关重构引擎 默认时不能继承，故每个虚拟主机都要有自己的开关指令。 RewriteOptions RewriteOptions Option MaxRedirects=10 设置一些特殊参数 inherit:配置是否继承，MaxRedirects=number:内部重定向次数 RewriteLog RewriteLog file-path None 设定重写log文件 用RewriteLogLevel 0来禁止日志 RewriteLogLevel RewriteLogLevel Level RewriteLogLevel 0 设置日志级别 0表示没有，2以上用于debug，9及以上表示全部信息 RewriteLock RewriteLock file-path None 设置RewriteMap程序的同步锁文件 要求是本地文件，此文件只对rewriting map-program有效。 RewriteMap [...]]]></description>
			<content:encoded><![CDATA[<table style="table-layout: fixed;">
<tbody>
<tr>
<td>
<div class="cnt">
<p><img width="500" height="62" border="0" align="left" alt="apachelogo.gif" src="http://hedong.3322.org/archives/pics/apachelogo.gif" />　　<a href="http://www.chedong.com/">车东</a>很早就写了一篇文章来介绍<a title="面向Google(Search Engine Friendly)的URL设计 " href="http://www.chedong.com/tech/google_url.html">利用mod_rewrite模块来达到用静态页面形式的链接隐藏后台的动态页面</a>。<br />　　Apache的rewrite模块，提供了一个基于规则的重写(rewrite,也许译为重构更为合适)引擎，来实时重写发送到Apache的请求URL。因功能极其强大，被称为URL重写的&ldquo;瑞士军刀&rdquo;。</p>
<p>            <a name="more"></a></p>
<p>　　这个模块使用一个基于正则表达式解析器开发的重写引擎，根据web管理员定义的规则来实时(on the fly)重写请求URL。它支持任意数目的重写规则，以及附加到一条规则上的任意数目的规则条件，从而提供了一套非常灵活和功能强大的URL处理机制。URL处理操作的实施与否，依赖于各种各样的条件检查，如检查服务器变量、环境变量、HTTP头字段、时间戳的值，甚至外部数据库的检索结果。这个模块可以在服务器范围内(http.conf)、目录范围内(.htaccess)或请求串(query-string)的一部分处理有关的URL。重写的结果URL，可以指向一个站内的处理程序、指向站外的重定向或者一个站内的代理。与灵活和功能强大相随的是设置的复杂，别指望一天内弄明白整个模块。(所以，这个学习笔记也分了几部分：)<br />　　 </p>
<h4>内部处理过程</h4>
<p>            <strong>API阶段</strong><br />　　首先，Apache处理HTTP请求是分阶段进行的,Apache API为每个阶段提供了一个钩子(hook)。Mod_rewrite使用了其中的两个钩子：一个用来在HTTP请求被读取但还没有访问授权验证之前进行URL_to_filename转换，一个用来在授权验证完成且目录设置文件(.htaccess)读取之后、但内容处理器(content handler)被调用之前激化，进行修补(fixup).因此，当一个请求到达，Apache决定了相关的服务器（或虚拟服务器）以后进行URL_to_filename阶段，重写引擎(rewrite engine)开始处理服务器设置中的重写指令(mod_rewrite directives).接下来几个阶段过后进入修补阶段，此时最终的数据所在的物理目录已经找到，目录配置中的重写指令开始执行。在这两个阶段，mod_rewrite都是将URL重写为新的URL或文件名，所以看起来并没有明显的区别。对API的这种应用，并不是一开始就是这样设计的，而是Apache1.x不得已而为之。为了搞清这个问题，以下两点需要记住。<br />　　1)虽然mod_rewrite能进行URL到URL、URL到文件名字甚至文件名字到文件名字的转换，API(1.x)目前提供了一个URL_to_filename转换。在Apache2.0中，这两个钩子会被加进去，整个过程会更加清晰。一个事实必须清楚的记得：Apache在URL_to_filename钩子中，做得比API设计的功能更多。<br />　　2)不可思议的是，mod_rewrite能在目录范围内（如根据.htaccess文件的指令配置）进行URL处理，虽然URL很早就已经被转换为文件名字了。只所以会如此，是因为.htaccess文件存在于文件系统中。也就是说，在这个阶段来进行URL处理，是非常晚的时候了。为了解决这个&quot;先有鸡还是先有蛋&quot;的问题，mod_rewrite用了一个小技巧：当在目<ins>录</ins>范围内处理URL/filename时，mod_rewrite先将文件名逆转回相关的URL(虽然通常是不可能的，但请参见下面用以实现这个技巧的RewriteBase指令)，然后据这个新URL生成一个站内的子请求(internal sub-request)，这又重开始了API进程。Mod_rewrite尽量使这些复杂的步骤对用户透明，但应要记住：虽然目录范围URL的真正处理过程很快很高效，但这一阶段会因为这个&quot;鸡和蛋&quot;的问题而变得很慢和低效。从另一方面来看，这也是mod_rewrite提供给普通用户进行目录范围内的URL处理的唯一途径.<br /><strong>规则集(RewriteRule指令集合)处理过程</strong><br />　　当mod_rewrite在上述的两个API阶段被激活时，它会从它的配置数据结构（在开始服务器上下文(per-server context)或目录上下文(per-directory context)时创建的）中读取配置的规则集，然后URL重写引擎启动来执行包含的规则集（一个或多条规则以及它们的条件）。两种上下文中的处理过程都是一样的，差别只是在最后的结果处理过程上。<br />　　规则集中规则的顺序是非常重要的，因为重写引擎以特定的顺序来处理它们。重写引擎顺序遍历规则集，当一条规则匹配时，引擎会去遍历与它相关的条件集(RewriteCond指令集合).由于历史的原因，条件集先被列出来，因此控制流流程有点曲折(long-winded).如图一所示：<img width="428" height="385" border="0" align="right" alt="mod_rewrite_fig1.gif" src="http://hedong.3322.org/archives/pics/mod_rewrite_fig1.gif" /><br />　　正如所看到的，首先URL会与每条规则的模板(pattern)比较，当匹配失败时，立即停止对当前规则的处理进入下一条规则。当匹配成功时，mod_rewrite寻找相关的规则条件。如果找不到相关的条件，则直接执行规则中定义的替换，然后回到规则遍历的过程。如果找到了相关的条件，则启动一个内部循环，依次检查各个条件。对于检查，我们不是拿一个模板来匹配当前的URL，而是先创建一个TestString串，将串内的变量、后向引用(bakc-reference)、查询结果(map lookups)等展开，然后用这个TestString和条件式中的CondPattern进行匹配，如果匹配失败，则整个条件集且这个规则都不再执行，重要回到规则遍历中；如果匹配成功，则检查下一个条件，如果所有的条件都满足，则执行规则中定义的替换动作。　　<br /><strong>特殊字符的转义</strong><br />　　既然基于正则式，则当然会有特殊字符的问题。在1.3.20版本的Apache中，通过在特殊字符前加一个&ldquo;&rdquo;来将TestString或Sustitution串的特殊字符转义。<br /><strong>正则式的后向引用</strong><br /><img width="381" height="179" border="0" align="left" alt="mod_rewrite_fig2.gif" src="http://hedong.3322.org/archives/pics/mod_rewrite_fig2.gif" />　　有一点需要记住：一旦在模板(pattern)或条件模板(CondPattern)中使用了括号，则后向引用已经自动产生了，你可以在Sustitution或TestString中通过$N或%N来引用相关的值。如图，描述了后向引用的值可以传到的位置。</p></div>
</td>
</tr>
</tbody>
</table>
<h4>配置指令(Configuration Directives)</h4>
<table border="1" style="width: 624px; height: 704px;">
<tbody>
<tr>
<td>指令</td>
<td>语法</td>
<td>默认值</td>
<td>说明</td>
<td>备注</td>
</tr>
<tr>
<td>RewriteEngine</td>
<td>RewriteEngine on|off</td>
<td>Off</td>
<td>开关重构引擎</td>
<td>默认时不能继承，故每个虚拟主机都要有自己的开关指令。</td>
</tr>
<tr>
<td>RewriteOptions</td>
<td>RewriteOptions Option</td>
<td>MaxRedirects=10</td>
<td>设置一些特殊参数</td>
<td>inherit:配置是否继承，MaxRedirects=number:内部重定向次数</td>
</tr>
<tr>
<td>RewriteLog</td>
<td>RewriteLog file-path</td>
<td>None</td>
<td>设定重写log文件</td>
<td>用RewriteLogLevel 0来禁止日志</td>
</tr>
<tr>
<td>RewriteLogLevel</td>
<td>RewriteLogLevel Level</td>
<td>RewriteLogLevel 0</td>
<td>设置日志级别</td>
<td>0表示没有，2以上用于debug，9及以上表示全部信息</td>
</tr>
<tr>
<td>RewriteLock</td>
<td>RewriteLock file-path</td>
<td>None</td>
<td>设置RewriteMap程序的同步锁文件</td>
<td>要求是本地文件，此文件只对rewriting map-program有效。</td>
</tr>
<tr>
<td>RewriteMap</td>
<td>RewriteMap MapName MapType:MapSource</td>
<td>Notused per default</td>
<td>定义重写影射</td>
<td>具体说明参见<a href="http://hedong.3322.org/archives/000346.html">文档</a></td>
</tr>
<tr>
<td>RewriteBase</td>
<td>RewriteBase URL-path</td>
<td>physical directory path</td>
<td>设置目录范围内重写的基本URL</td>
<td>具体说明参见<a href="http://hedong.3322.org/archives/000346.html">文档</a></td>
</tr>
<tr>
<td>RewriteCond</td>
<td>RewriteCond TestString CondPattern</td>
<td>None</td>
<td>定义规则条件</td>
<td>具体说明参见<a href="http://hedong.3322.org/archives/000345.html">文档</a></td>
</tr>
<tr>
<td>RewriteRule</td>
<td>RewriteRule Pattern Substitution</td>
<td>None</td>
<td>定义重写规则</td>
<td>具体说明参见<a href="http://hedong.3322.org/archives/000344.html">文档</a></td>
</tr>
</tbody>
</table>
<p>参考资料：<br />http://httpd.apache.org/docs/mod/mod_rewrite.html</p>
<div id="crp_related"><h3>Related Posts:</h3><ul><li><a href="http://observerlife.com/%e6%8a%80%e5%b7%a7-%e4%bd%bf%e7%94%a8truss%e3%80%81strace%e6%88%96ltrace%e8%af%8a%e6%96%ad%e8%bd%af%e4%bb%b6%e7%9a%84%e7%96%91%e9%9a%be%e6%9d%82%e7%97%87/" rel="bookmark" class="crp_title">技巧: 使用truss、strace或ltrace诊断软件的&quot;疑难杂症&quot;</a></li><li><a href="http://observerlife.com/freebsd7%e5%ae%89%e8%a3%85%e6%89%8b%e5%86%8c-%e6%9b%b4%e6%96%b0ports-%e5%92%8csrc/" rel="bookmark" class="crp_title">freebsd7安装手册-更新ports 和src</a></li><li><a href="http://observerlife.com/lighttpdsquidapache%e6%90%ad%e5%bb%ba%e9%ab%98%e6%95%88%e7%8e%87web%e6%9c%8d%e5%8a%a1%e5%99%a8/" rel="bookmark" class="crp_title">Lighttpd+Squid+Apache搭建高效率Web服务器</a></li><li><a href="http://observerlife.com/%e7%ae%80%e5%8d%95%e6%a3%80%e6%b5%8b%e6%93%8d%e4%bd%9c%e7%b3%bb%e7%bb%9f%e6%98%af%e5%90%a6%e6%98%af64%e4%bd%8d%e7%b3%bb%e7%bb%9f%e7%9a%84%e6%96%b9%e6%b3%95php%e7%89%88/" rel="bookmark" class="crp_title">简单检测操作系统是否是64位系统的方法php版</a></li><li><a href="http://observerlife.com/%e5%85%b3%e4%ba%8eapache%e7%9a%84timeout/" rel="bookmark" class="crp_title">关于Apache的TimeOut</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://observerlife.com/apache%e7%9a%84mod_rewrite%e5%ad%a6%e4%b9%a0%ef%bc%88%e4%b8%80%ef%bc%89/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
