<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>OurApache</title>
	
	<link>http://ourapache.com</link>
	<description>我们致力于一个Apache知识的分享网站</description>
	<lastBuildDate>Tue, 13 Apr 2010 05:18:24 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/ourapache" /><feedburner:info uri="ourapache" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>解决linux下安装ssl后，apache重启时需要密码</title>
		<link>http://feedproxy.google.com/~r/ourapache/~3/nxDuKJ436mM/326</link>
		<comments>http://ourapache.com/archives/326#comments</comments>
		<pubDate>Tue, 13 Apr 2010 05:18:24 +0000</pubDate>
		<dc:creator>OurApache</dc:creator>
				<category><![CDATA[Apache解错方案]]></category>
		<category><![CDATA[ssl]]></category>
		<category><![CDATA[密码]]></category>

		<guid isPermaLink="false">http://www.ourapache.com/?p=326</guid>
		<description><![CDATA[解决linux下安装ssl后，apache重启时需要密码的问题。]]></description>
			<content:encoded><![CDATA[<p><strong>解决linux下安装ssl后，apache重启时需要密码的问题。</strong></p>
<p>在帮客户购买的vps上面<a href="http://www.kuaissl.com/support/SSLins/Apache_ins.htm">安装完SSL</a>以后，每次启动apache时都需要输入密码，觉得维护起来非常的麻烦。</p>
<p>客户的vps是ubuntu Sever，其他linux服务器找到相关文件修改</p>
<p>编辑：<a href="http://ourapache.com/archives/tag/ssl" class="st_tag internal_tag" rel="tag" title="标签 ssl 下的日志">ssl</a>.conf ,</p>
<p>ubuntu下面的目录：</p>
<p>/etc/apache2/mods-available/ssl.conf</p>
<p>修改ssl.conf</p>
<p># SSLPassPhraseDialog builtin</p>
<p>SSLPassPhraseDialog exec:/ect/apache2/key.sh</p>
<p>编辑：/ect/apache2/key.sh</p>
<p>!/bin/bash</p>
<p>echo ‘your pass phrase’</p>
<p>注意key.sh的权限755</p>
<p>重启服务器</p>
<p>问题解决</p>
<h3  class="related_post_title">无相关文章，以下随机显示</h3><ul class="related_post"><li>2009年02月17号 -- <a href="http://ourapache.com/archives/142" title="在64位机器上关于Apache 2.2.3版的编译问题">在64位机器上关于Apache 2.2.3版的编译问题</a></li><li>2009年02月10号 -- <a href="http://ourapache.com/archives/123" title="Apache高级配置中文详解">Apache高级配置中文详解</a></li><li>2009年08月13号 -- <a href="http://ourapache.com/archives/281" title="Linux下Apache并发连接数和带宽控制">Linux下Apache并发连接数和带宽控制</a></li><li>2009年08月16号 -- <a href="http://ourapache.com/archives/288" title="Apache两种常用工作模式比较:prefork和worker">Apache两种常用工作模式比较:prefork和worker</a></li><li>2009年01月6号 -- <a href="http://ourapache.com/archives/29" title="Apache 中KeepAlive 配置的合理使用(优化) ">Apache 中KeepAlive 配置的合理使用(优化) </a></li><li>2010年04月13号 -- <a href="http://ourapache.com/archives/324" title="HTTP 状态代码解释">HTTP 状态代码解释</a></li><li>2009年08月13号 -- <a href="http://ourapache.com/archives/273" title="Apache和IIS共享80端口的四个方法">Apache和IIS共享80端口的四个方法</a></li><li>2009年02月7号 -- <a href="http://ourapache.com/archives/92" title="在Apache下限制每个虚拟主机的并发数">在Apache下限制每个虚拟主机的并发数</a></li><li>2009年02月18号 -- <a href="http://ourapache.com/archives/146" title="apache和tomcat集成的总结">apache和tomcat集成的总结</a></li><li>2009年02月25号 -- <a href="http://ourapache.com/archives/165" title="Apache 设置web 缓存">Apache 设置web 缓存</a></li></ul>
	标签：<a href="http://ourapache.com/archives/category/debug" title="Apache解错方案" rel="tag">Apache解错方案</a>, <a href="http://ourapache.com/archives/tag/ssl" title="ssl" rel="tag">ssl</a>, <a href="http://ourapache.com/archives/tag/%e5%af%86%e7%a0%81" title="密码" rel="tag">密码</a><br />
<img src="http://feeds.feedburner.com/~r/ourapache/~4/nxDuKJ436mM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://ourapache.com/archives/326/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://ourapache.com/archives/326</feedburner:origLink></item>
		<item>
		<title>HTTP 状态代码解释</title>
		<link>http://feedproxy.google.com/~r/ourapache/~3/lowKWbT4JAY/324</link>
		<comments>http://ourapache.com/archives/324#comments</comments>
		<pubDate>Tue, 13 Apr 2010 05:17:23 +0000</pubDate>
		<dc:creator>OurApache</dc:creator>
				<category><![CDATA[Apache基础知识]]></category>
		<category><![CDATA[HTTP相关知识]]></category>
		<category><![CDATA[状态]]></category>

		<guid isPermaLink="false">http://www.ourapache.com/?p=324</guid>
		<description><![CDATA[    如果向您的服务器发出了某项请求要求显示您网站上的某个网页（例如，当用户通过浏览器访问您的网页或在 Googlebot 抓取该网页时），那么，您的服务器会返回 HTTP 状态代码以响应该请求。

    此状态代码提供了有关请求状态的信息，且为 Googlebot 提供了有关您网站和请求的网页的信息。]]></description>
			<content:encoded><![CDATA[<h2>HTTP 状态代码</h2>
<p>如果向您的服务器发出了某项请求要求显示您网站上的某个网页（例如，当用户通过浏览器访问您的网页或在 Googlebot 抓取该网页时），那么，您的服务器会返回 HTTP 状态代码以响应该请求。</p>
<p>此状态代码提供了有关请求状态的信息，且为 Googlebot 提供了有关您网站和请求的网页的信息。</p>
<p>一些常见的状态代码为：</p>
<p><strong>200</strong> &#8211; 服务器成功返回网页<strong>404</strong> &#8211; 请求的网页不存在<strong>503</strong> &#8211; 服务器暂时不可用以下提供了 HTTP 状态代码的完整列表。点击链接可了解详细信息。您也可以访问<a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html">有关 HTTP 状态代码的 W3C 页来了解详细信息</a>。</p>
<p><strong>1xx</strong><strong>（临时响应）</strong></p>
<p>用于表示临时响应并需要请求者执行操作才能继续的状态代码。</p>
<table border="1" cellspacing="1" cellpadding="1" summary="1xx status codes indicating a provisional response">
<tbody>
<tr>
<th scope="col">代码</th>
<th scope="col">说明</th>
</tr>
<tr>
<td>100（继续）</td>
<td>请求者应当继续提出请求。服务器返回此代码则意味着，服务器已收到了请求的第一部分，现正在等待接收其余部分。</td>
</tr>
<tr>
<td>101（切换协议）</td>
<td>请求者已要求服务器切换协议，服务器已确认并准备进行切换。</td>
</tr>
</tbody>
</table>
<p><strong>2xx</strong><strong>（成功）</strong></p>
<p>用于表示服务器已成功处理了请求的状态代码。</p>
<table border="1" cellspacing="1" cellpadding="1" summary="2xx status codes indicating successful requests">
<tbody>
<tr>
<th scope="col">代码</th>
<th scope="col">说明</th>
</tr>
<tr>
<td>200（成功）</td>
<td>服务器已成功处理了请求。通常，这表示服务器提供了请求的网页。如果您的 robots.txt 文件显示为此状态，那么，这表示 Googlebot 已成功检索到该文件。</td>
</tr>
<tr>
<td>201（已创建）</td>
<td>请求成功且服务器已创建了新的资源。</td>
</tr>
<tr>
<td>202（已接受）</td>
<td>服务器已接受了请求，但尚未对其进行处理。</td>
</tr>
<tr>
<td>203（非授权信息）</td>
<td>服务器已成功处理了请求，但返回了可能来自另一来源的信息。</td>
</tr>
<tr>
<td>204（无内容）</td>
<td>服务器成功处理了请求，但未返回任何内容。</td>
</tr>
<tr>
<td>205（重置内容）</td>
<td>服务器成功处理了请求，但未返回任何内容。与 204 响应不同，此响应要求请求者重置文档视图（例如清除表单内容以输入新内容）。</td>
</tr>
<tr>
<td>206（部分内容）</td>
<td>服务器成功处理了部分 GET 请求。</td>
</tr>
</tbody>
</table>
<p><strong>3xx</strong><strong>（已重定向）</strong></p>
<p>要完成请求，您需要进一步进行操作。通常，这些状态代码是永远重定向的。Google 建议您在每次请求时使用的重定向要少于 5 个。您可以使用网站管理员工具来查看 Googlebot 在抓取您已重定向的网页时是否会遇到问题。<strong>诊断</strong>下的<a href="http://www.google.com/support/webmasters/bin/answer.py?answer=35156">抓取错误</a>页中列出了 Googlebot 由于重定向错误而无法抓取的网址。</p>
<table border="1" cellspacing="1" cellpadding="1" summary="3xx status codes requiring further action">
<tbody>
<tr>
<th scope="col">代码</th>
<th scope="col">说明</th>
</tr>
<tr>
<td>300（多种选择）</td>
<td>服务器根据请求可执行多种操作。服务器可根据请求者 (User agent) 来选择一项操作，或提供操作列表供请求者选择。</td>
</tr>
<tr>
<td><a href="http://ourapache.com/archives/tag/301" class="st_tag internal_tag" rel="tag" title="标签 301 下的日志">301</a>（永久移动）</td>
<td>请求的网页已被永久移动到新位置。服务器返回此响应（作为对 GET 或 HEAD 请求的响应）时，会自动将请求者转到新位置。您应使用此代码通知 Googlebot 某个网页或网站已被永久移动到新位置。</td>
</tr>
<tr>
<td>302（临时移动）</td>
<td>服务器目前正从不同位置的网页响应请求，但请求者应继续使用原有位置来进行以后的请求。此代码与响应 GET 和 HEAD 请求的 301 代码类似，会自动将请求者转到不同的位置。但由于 Googlebot 会继续抓取原有位置并将其编入索引，因此您不应使用此代码来通知 Googlebot 某个页面或网站已被移动。</td>
</tr>
<tr>
<td>303（查看其他位置）</td>
<td>当请求者应对不同的位置进行单独的 GET 请求以检索响应时，服务器会返回此代码。对于除 HEAD 请求之外的所有请求，服务器会自动转到其他位置。</td>
</tr>
<tr>
<td>304（未修改）</td>
<td>自从上次请求后，请求的网页未被修改过。服务器返回此响应时，不会返回网页内容。</p>
<p>如果网页自请求者上次请求后再也没有更改过，您应当将服务器配置为返回此响应（称为 If-Modified-Since HTTP 标头）。由于服务器可以告诉 Googlebot 自从上次抓取后网页没有更改过，因此可节省带宽和开销</p>
<p>。</td>
</tr>
<tr>
<td>305（使用代理）</td>
<td>请求者只能使用代理访问请求的网页。如果服务器返回此响应，那么，服务器还会指明请求者应当使用的代理。</td>
</tr>
<tr>
<td>307（临时重定向）</td>
<td>服务器目前正从不同位置的网页响应请求，但请求者应继续使用原有位置来进行以后的请求。此代码与响应 GET 和 HEAD 请求的 301 代码类似，会自动将请求者转到不同的位置。但由于 Googlebot 会继续抓取原有位置并将其编入索引，因此您不应使用此代码来通知 Googlebot 某个页面或网站已被移动。</td>
</tr>
</tbody>
</table>
<p><strong>4xx（请求错误）</strong></p>
<p>这些状态代码表示，请求可能出错，已妨碍了服务器对请求的处理。</p>
<table border="1" cellspacing="1" cellpadding="1" summary="4xx status codes indicating that the server could not process the request">
<tbody>
<tr>
<th scope="col">代码</th>
<th scope="col">说明</th>
</tr>
<tr>
<td>400（错误请求）</td>
<td>服务器不理解请求的语法。</td>
</tr>
<tr>
<td>401（未授权）</td>
<td>请求要求进行身份验证。登录后，服务器可能会返回对页面的此响应。</td>
</tr>
<tr>
<td>403（已禁止）</td>
<td>服务器拒绝请求。如果在 Googlebot 尝试抓取您网站上的有效网页时显示此状态代码（您可在 Google 网站管理员工具中<strong>诊断</strong>下的<strong>网络抓取</strong>页面上看到此状态代码），那么，这可能是您的服务器或主机拒绝 Googlebot 对其进行访问。</td>
</tr>
<tr>
<td>404（未找到）</td>
<td>服务器找不到请求的网页。例如，如果请求是针对服务器上不存在的网页进行的，那么，服务器通常会返回此代码。</p>
<p>如果您的网站上没有 robots.txt 文件，而您在 Google 网站管理员工具<a href="http://www.google.com/support/webmasters/bin/answer.py?answer=35237">“诊断”标签的 robots.txt 页</a>上发现此状态，那么，这是正确的状态。然而，如果您有 robots.txt 文件而又发现了此状态，那么，这说明您的 robots.txt 文件可能是命名错误或位于错误的位置。（该文件应当位于顶级域名上，且应当名为 robots.txt）。</p>
<p>如果您在 Googlebot 尝试抓取的网址上发现此状态（位于”诊断”标签的 HTTP 错误页上），那么，这表示 Googlebot 所追踪的可能是另一网页中的无效链接（旧链接或输入有误的链接）。</td>
</tr>
<tr>
<td>405（方法禁用）</td>
<td>禁用请求中所指定的方法。</td>
</tr>
<tr>
<td>406（不接受）</td>
<td>无法使用请求的内容特性来响应请求的网页。</td>
</tr>
<tr>
<td>407（需要代理授权）</td>
<td>此状态代码与 401（未授权）类似，但却指定了请求者应当使用代理进行授权。如果服务器返回此响应，那么，服务器还会指明请求者应当使用的代理。</td>
</tr>
<tr>
<td>408（请求超时）</td>
<td>服务器等候请求时超时。</td>
</tr>
<tr>
<td>409（冲突）</td>
<td>服务器在完成请求时发生冲突。服务器必须包含有关响应中所发生的冲突的信息。服务器在响应与前一个请求相冲突的 PUT 请求时可能会返回此代码，同时会提供两个请求的差异列表。</td>
</tr>
<tr>
<td>410（已删除）</td>
<td>如果请求的资源已被永久删除，那么，服务器会返回此响应。该代码与 404（未找到）代码类似，但在资源以前有但现在已经不复存在的情况下，有时会替代 404 代码出现。如果资源已被永久删除，那么，您应当使用 301 代码指定该资源的新位置。</td>
</tr>
<tr>
<td>411（需要有效长度）</td>
<td>服务器不会接受包含无效内容长度标头字段的请求。</td>
</tr>
<tr>
<td>412（未满足前提条件）</td>
<td>服务器未满足请求者在请求中设置的其中一个前提条件。</td>
</tr>
<tr>
<td>413（请求实体过大）</td>
<td>服务器无法处理请求，因为请求实体过大，已超出服务器的处理能力。</td>
</tr>
<tr>
<td>414（请求的 URI 过长）</td>
<td>请求的 URI（通常为网址）过长，服务器无法进行处理。</td>
</tr>
<tr>
<td>415（不支持的媒体类型）</td>
<td>请求的格式不受请求页面的支持。</td>
</tr>
<tr>
<td>416（请求范围不符合要求）</td>
<td>如果请求是针对网页的无效范围进行的，那么，服务器会返回此状态代码。</td>
</tr>
<tr>
<td>417（未满足期望值）</td>
<td>服务器未满足”期望”请求标头字段的要求。</td>
</tr>
</tbody>
</table>
<p><strong>5xx</strong><strong>（服务器错误）</strong></p>
<p>这些状态代码表示，服务器在尝试处理请求时发生内部错误。这些错误可能是服务器本身的错误，而不是请求出错。</p>
<table border="1" cellspacing="1" cellpadding="1" summary="5xx status codes indicating that the server had an internal error">
<tbody>
<tr>
<th scope="col">代码</th>
<th scope="col">说明</th>
</tr>
<tr>
<td>500（服务器内部错误）</td>
<td>服务器遇到错误，无法完成请求。</td>
</tr>
<tr>
<td>501（尚未实施）</td>
<td>服务器不具备完成请求的功能。例如，当服务器无法识别请求方法时，服务器可能会返回此代码。</td>
</tr>
<tr>
<td>502（错误网关）</td>
<td>服务器作为网关或代理，从上游服务器收到了无效的响应。</td>
</tr>
<tr>
<td>503（服务不可用）</td>
<td>目前无法使用服务器（由于超载或进行停机维护）。通常，这只是一种暂时的状态。</td>
</tr>
<tr>
<td>504（网关超时）</td>
<td>服务器作为网关或代理，未及时从上游服务器接收请求。</td>
</tr>
<tr>
<td>505（HTTP 版本不受支持）</td>
<td>服务器不支持请求中所使用的 HTTP 协议版本。</td>
</tr>
</tbody>
</table>
<h3  class="related_post_title">无相关文章，以下随机显示</h3><ul class="related_post"><li>2009年01月6号 -- <a href="http://ourapache.com/archives/29" title="Apache 中KeepAlive 配置的合理使用(优化) ">Apache 中KeepAlive 配置的合理使用(优化) </a></li><li>2009年08月13号 -- <a href="http://ourapache.com/archives/286" title="linux下查看nginx，apache，mysql，php的编译参数">linux下查看nginx，apache，mysql，php的编译参数</a></li><li>2009年08月13号 -- <a href="http://ourapache.com/archives/275" title="Apache+Django性能优化之mod_wsgi篇">Apache+Django性能优化之mod_wsgi篇</a></li><li>2009年02月27号 -- <a href="http://ourapache.com/archives/211" title="Apache common-pool, common-dbcp源码解读与对象池原理剖析">Apache common-pool, common-dbcp源码解读与对象池原理剖析</a></li><li>2009年02月16号 -- <a href="http://ourapache.com/archives/140" title="Apache、resin、rewrite泛域名、多域名设置">Apache、resin、rewrite泛域名、多域名设置</a></li><li>2009年01月15号 -- <a href="http://ourapache.com/archives/38" title="Apache服务器安全防范">Apache服务器安全防范</a></li><li>2009年02月25号 -- <a href="http://ourapache.com/archives/170" title="Apache 两种虚拟主机方式的区别">Apache 两种虚拟主机方式的区别</a></li><li>2010年03月9号 -- <a href="http://ourapache.com/archives/318" title="Apache2中俩种设置PHP的异同">Apache2中俩种设置PHP的异同</a></li><li>2009年06月15号 -- <a href="http://ourapache.com/archives/259" title="16个简单实用的.htaccess小贴示">16个简单实用的.htaccess小贴示</a></li><li>2009年02月10号 -- <a href="http://ourapache.com/archives/119" title="Apache2运用mod_deflate提升网络页面浏览速度">Apache2运用mod_deflate提升网络页面浏览速度</a></li></ul>
	标签：<a href="http://ourapache.com/archives/category/basic" title="Apache基础知识" rel="tag">Apache基础知识</a>, <a href="http://ourapache.com/archives/tag/http" title="HTTP相关知识" rel="tag">HTTP相关知识</a>, <a href="http://ourapache.com/archives/tag/%e7%8a%b6%e6%80%81" title="状态" rel="tag">状态</a><br />
<img src="http://feeds.feedburner.com/~r/ourapache/~4/lowKWbT4JAY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://ourapache.com/archives/324/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://ourapache.com/archives/324</feedburner:origLink></item>
		<item>
		<title>apache 的AcceptMutex 的理解</title>
		<link>http://feedproxy.google.com/~r/ourapache/~3/g4J6FRtGFQM/322</link>
		<comments>http://ourapache.com/archives/322#comments</comments>
		<pubDate>Tue, 13 Apr 2010 05:15:48 +0000</pubDate>
		<dc:creator>OurApache</dc:creator>
				<category><![CDATA[Apache基础知识]]></category>
		<category><![CDATA[AcceptMutex]]></category>

		<guid isPermaLink="false">http://www.ourapache.com/?p=322</guid>
		<description><![CDATA[当apache监听多个端口或多个ip上的端口时，多个子进程是怎么分工的呢？和只监听一个端口有什么区别吗？]]></description>
			<content:encoded><![CDATA[<p>当apache监听多个端口或多个ip上的端口时，多个子进程是怎么分工的呢？和只监听一个端口有什么区别吗？</p>
<p>1. 如果apache的多个进程只监听一个端口，则不需要AcceptMutex，每个apache进程都在执行accept操作，发现请求后就开始执行，执行完继续accept，多个进程之间不会相互干扰，这是由accept的机制来完成的。</p>
<p>2. 如果apache的多个进程只监听socket多于一个，则不能直接accept了，就必须使用select或poll机制来发现知否有请求需要执行，发现之后，再由accept来接受请求；然而select或poll没有accept那么能自动处理互斥的问题，这时候就需要一个“锁”了，就是所谓的AcceptMutex，AcceptMutex的实现形式有多种，这个不属于本文讨论的范围。</p>
<p>下面是apache在监听三个socket（[16 17 18]）时，其中一个进程的表现：</p>
<p>semop(524288, 0x81dd334, 1)             = 0</p>
<p>select(19, [16 17 18], NULL, NULL, NULL) = 1 (in [17])</p>
<p>accept(17, {sa_family=AF_INET, sin_port=htons(52932), sin_addr=inet_addr(“10.55.38.9&#8243;)}, [16]) = 29</p>
<p>semop(524288, 0x81dd33a, 1)             = 0</p>
<p>第一步：先获取锁（0x81dd334）， 同一时刻只有一个进程能获取锁</p>
<p>第二步：开始select（对于apache2这里好像是poll，poll的效率更高一些），并且发现17需要处理了</p>
<p>第三步：accept 17</p>
<p>第四步：释放锁，这样其它进程就可以获取锁并处理后续的请求了</p>
<h3  class="related_post_title">无相关文章，以下随机显示</h3><ul class="related_post"><li>2009年02月10号 -- <a href="http://ourapache.com/archives/111" title="Apache 中内存管理的三种境界 ">Apache 中内存管理的三种境界 </a></li><li>2009年02月25号 -- <a href="http://ourapache.com/archives/181" title="Apache并发控制、查看进程数、TCP连接、压缩功能说明">Apache并发控制、查看进程数、TCP连接、压缩功能说明</a></li><li>2009年02月10号 -- <a href="http://ourapache.com/archives/121" title="apache 无法启动故障排查">apache 无法启动故障排查</a></li><li>2009年02月10号 -- <a href="http://ourapache.com/archives/109" title="谈谈Apache的优化">谈谈Apache的优化</a></li><li>2009年02月26号 -- <a href="http://ourapache.com/archives/184" title="Apache日志文件（配置和管理）">Apache日志文件（配置和管理）</a></li><li>2009年01月6号 -- <a href="http://ourapache.com/archives/32" title="htaccess学习笔记">htaccess学习笔记</a></li><li>2009年02月6号 -- <a href="http://ourapache.com/archives/72" title="gzip 与 deflate">gzip 与 deflate</a></li><li>2009年02月6号 -- <a href="http://ourapache.com/archives/82" title="YouTube 架构学习">YouTube 架构学习</a></li><li>2009年03月9号 -- <a href="http://ourapache.com/archives/224" title="监视并记录Apache网站服务器的运行">监视并记录Apache网站服务器的运行</a></li><li>2009年02月6号 -- <a href="http://ourapache.com/archives/79" title="TCP 相关参数解释">TCP 相关参数解释</a></li></ul>
	标签：<a href="http://ourapache.com/archives/tag/acceptmutex" title="AcceptMutex" rel="tag">AcceptMutex</a>, <a href="http://ourapache.com/archives/category/basic" title="Apache基础知识" rel="tag">Apache基础知识</a><br />
<img src="http://feeds.feedburner.com/~r/ourapache/~4/g4J6FRtGFQM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://ourapache.com/archives/322/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://ourapache.com/archives/322</feedburner:origLink></item>
		<item>
		<title>Apache2中俩种设置PHP的异同</title>
		<link>http://feedproxy.google.com/~r/ourapache/~3/iivc6jAjp0A/318</link>
		<comments>http://ourapache.com/archives/318#comments</comments>
		<pubDate>Tue, 09 Mar 2010 01:38:09 +0000</pubDate>
		<dc:creator>OurApache</dc:creator>
				<category><![CDATA[Apache高级应用]]></category>
		<category><![CDATA[apache2handler]]></category>
		<category><![CDATA[Hook]]></category>
		<category><![CDATA[配置]]></category>

		<guid isPermaLink="false">http://www.ourapache.com/?p=318</guid>
		<description><![CDATA[Apache2开始引入了Hook方式, 对应的在PHP中也提供了apache2handler这种sapi. 

和我之前介绍过的PHP lifecycle不同, 这种情况下的PHP, 通过注册handler钩子, 从而可以在handler hook阶段有机会处理请求, 通过判断请求的handler, 来确定是否需要处理, 如果需要就会调用自身的处理器.
]]></description>
			<content:encoded><![CDATA[<p>Apache2开始引入了Hook方式, 对应的在PHP中也提供了apache2handler这种sapi.</p>
<p>和我之前介绍过的PHP lifecycle不同, 这种情况下的PHP, 通过注册handler钩子, 从而可以在handler hook阶段有机会处理请求, 通过判断请求的handler, 来确定是否需要处理, 如果需要就会调用自身的处理器.</p>
<p>那么, 这种情况下也就有了多种配置方法, 主要考虑如下俩种方式(第二种可以有多种变种):</p>
<blockquote><p>
第一种: AddType application/x-httpd-<a href="http://ourapache.com/archives/tag/php" class="st_tag internal_tag" rel="tag" title="标签 php 下的日志">php</a> .<a href="http://ourapache.com/archives/tag/php" class="st_tag internal_tag" rel="tag" title="标签 php 下的日志">php</a><br />
第二种:<br />
      &lt;FilesMatch \.php$&gt;<br />
          SetHandler application/x-httpd-php</p></blockquote>
<p>首先来说, 这俩中方式的起作用的时刻不同, 对于第一种方式来说, 他是在type_check钩子阶段起作用的, 也就是在apache2src/modules/http/mod_mime.c中, 通过注册type_checker钩子, 加入find_ct(content_type), 在find_ct中, 通过配置文件中的mime映射, 或者是通过addType指令增加的映射, 根据文件的扩展来填充请求中的handler字段:</p>
<p>而对于第二种方式, 是在fixup钩子阶段, 通过注册fixups钩子阶段加入core_override_type(apache2src/server/core.c)函数, 来将目录级的配置指令生效.</p>
<p>而fixups钩子是晚于type_checker钩子的, 也是handler钩子之前最后的一个可以利用的钩子. 所以如果同时采用1,2俩种方式, 那么第二种方式会覆盖第一种方式设置的handler.</p>
<p>其次, 俩种方式依赖的数据结构不同, 第一种方式依赖的是一个全局的mime对照表extension_mappings, 这个表由mime配置文件和AddType指令而来.</p>
<p>而对于第二种方式, 它是根据配置文件构造的dir_config而来:</p>
<blockquote><p>
&#8230;.<br />
  core_dir_config *conf =<br />
        (core_dir_config *)ap_get_module_config(r-&gt;per_dir_config,<br />
                                                &amp;core_module);<br />
 <br />
    /* Check for overrides with ForceType / SetHandler<br />
*/<br />
    if (conf-&gt;mime_type &amp;&amp; strcmp(conf-&gt;mime_type, “none”))<br />
        ap_set_content_type(r, (char*) conf-&gt;mime_type);<br />
 <br />
    if (conf-&gt;handler &amp;&amp; strcmp(conf-&gt;handler, “none”))<br />
        r-&gt;handler = conf-&gt;handler;</p></blockquote>
<h3  class="related_post_title">相关文章</h3><ul class="related_post"><li>2009年02月26号 -- <a href="http://ourapache.com/archives/184" title="Apache日志文件（配置和管理）">Apache日志文件（配置和管理）</a></li><li>2009年02月10号 -- <a href="http://ourapache.com/archives/123" title="Apache高级配置中文详解">Apache高级配置中文详解</a></li><li>2009年01月22号 -- <a href="http://ourapache.com/archives/66" title="Apache配置文件(httpd.conf)中文说明">Apache配置文件(httpd.conf)中文说明</a></li><li>2008年12月27号 -- <a href="http://ourapache.com/archives/9" title="apache禁止使用IP访问的实现方法">apache禁止使用IP访问的实现方法</a></li><li>2008年12月27号 -- <a href="http://ourapache.com/archives/7" title="apache中.htaccess的功能及写法">apache中.htaccess的功能及写法</a></li><li>2008年12月27号 -- <a href="http://ourapache.com/archives/3" title="apache的配置优化">apache的配置优化</a></li><li>2008年12月25号 -- <a href="http://ourapache.com/archives/1" title="使用gzip将你的Apache速度提高十倍">使用gzip将你的Apache速度提高十倍</a></li></ul>
	标签：<a href="http://ourapache.com/archives/tag/apache2handler" title="apache2handler" rel="tag">apache2handler</a>, <a href="http://ourapache.com/archives/category/advanced" title="Apache高级应用" rel="tag">Apache高级应用</a>, <a href="http://ourapache.com/archives/tag/hook" title="Hook" rel="tag">Hook</a>, <a href="http://ourapache.com/archives/tag/%e9%85%8d%e7%bd%ae" title="配置" rel="tag">配置</a><br />
<img src="http://feeds.feedburner.com/~r/ourapache/~4/iivc6jAjp0A" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://ourapache.com/archives/318/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://ourapache.com/archives/318</feedburner:origLink></item>
		<item>
		<title>htaccess二级目录重写找不到路径</title>
		<link>http://feedproxy.google.com/~r/ourapache/~3/eryzeAZ8oAo/316</link>
		<comments>http://ourapache.com/archives/316#comments</comments>
		<pubDate>Tue, 09 Mar 2010 01:36:35 +0000</pubDate>
		<dc:creator>OurApache</dc:creator>
				<category><![CDATA[Apache初级应用]]></category>
		<category><![CDATA[htaccess]]></category>
		<category><![CDATA[路径]]></category>

		<guid isPermaLink="false">http://www.ourapache.com/?p=316</guid>
		<description><![CDATA[首先申明一下：使用.htaccess文件，会降低httpd服务器的一点性能.h]]></description>
			<content:encoded><![CDATA[<p>首先申明一下：使用.htaccess文件，会降低httpd服务器的一点性能.h<br />
我们一般会把客户的网站放在自己的网站的目录下面，<br />
比如FTP：/home/ftp/www，<br />
有一个网站http://www.example.com，<br />
那么新建一个网站的目录为http://www.example.com/newsite/，<br />
我们这个项目是使用qeephp开发的，使用<a href="http://www.qeephp.com/"><span style="color: #0059b3;">qeephp</span></a>的路由重写功能，在把网站上传到服务器上，<br />
使用了虚拟目录Alias，因为不想看到类似http://www.example.com/newsite/public/这样的路径，<br />
于是外部访问地址是http://www.example.com/newsite,<br />
在我启用了qeephp的rewrite时，一直说找不到路径，/home/ftp/www/newsite/,很奇怪。<br />
仔细阅读htaccess的文档，发现有一个BaseDir参数<br />
在htaccess 中添加</p>
<div class="wp_syntax" style="padding-bottom: 0px;">
<div class="code">
<pre class="ini" style="font-family: monospace;">RewriteEngine on
RewriteBase /twosisters
 
RewriteCond %<span>{</span>REQUEST_FILENAME<span>}</span> -s <span style="font-weight: bold; color: #000066;"><span style="color: #000066;"><span>[</span>OR<span>]</span></span></span>
RewriteCond %<span>{</span>REQUEST_FILENAME<span>}</span> -l <span style="font-weight: bold; color: #000066;"><span style="color: #000066;"><span>[</span>OR<span>]</span></span></span>
RewriteCond %<span>{</span>REQUEST_FILENAME<span>}</span> -d
RewriteRule ^.*$ - <span style="font-weight: bold; color: #000066;"><span style="color: #000066;"><span>[</span>NC,L<span>]</span></span></span>
RewriteRule ^.*$ index.<a href="http://ourapache.com/archives/tag/php" class="st_tag internal_tag" rel="tag" title="标签 php 下的日志">php</a> <span style="font-weight: bold; color: #000066;"><span style="color: #000066;"><span>[</span>NC,L<span>]</span></span></span></pre>
</div>
</div>
<p>问题就解决.<br />
估计把index.php改成绝对路径也没有问题。</p>
<h3  class="related_post_title">相关文章</h3><ul class="related_post"><li>2009年12月12号 -- <a href="http://ourapache.com/archives/310" title=".htaccess的301跳转">.htaccess的301跳转</a></li><li>2009年06月15号 -- <a href="http://ourapache.com/archives/259" title="16个简单实用的.htaccess小贴示">16个简单实用的.htaccess小贴示</a></li><li>2009年01月6号 -- <a href="http://ourapache.com/archives/32" title="htaccess学习笔记">htaccess学习笔记</a></li><li>2009年01月6号 -- <a href="http://ourapache.com/archives/25" title="Apache服务器使用.htaccess实现图片防盗链方法教程">Apache服务器使用.htaccess实现图片防盗链方法教程</a></li><li>2008年12月27号 -- <a href="http://ourapache.com/archives/7" title="apache中.htaccess的功能及写法">apache中.htaccess的功能及写法</a></li></ul>
	标签：<a href="http://ourapache.com/archives/category/primary" title="Apache初级应用" rel="tag">Apache初级应用</a>, <a href="http://ourapache.com/archives/tag/htaccess" title="htaccess" rel="tag">htaccess</a>, <a href="http://ourapache.com/archives/tag/%e8%b7%af%e5%be%84" title="路径" rel="tag">路径</a><br />
<img src="http://feeds.feedburner.com/~r/ourapache/~4/eryzeAZ8oAo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://ourapache.com/archives/316/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://ourapache.com/archives/316</feedburner:origLink></item>
		<item>
		<title>使用Apache做负载均衡</title>
		<link>http://feedproxy.google.com/~r/ourapache/~3/-aJ5tACFzLc/314</link>
		<comments>http://ourapache.com/archives/314#comments</comments>
		<pubDate>Sat, 12 Dec 2009 15:38:45 +0000</pubDate>
		<dc:creator>OurApache</dc:creator>
				<category><![CDATA[Apache高级应用]]></category>
		<category><![CDATA[负载均衡]]></category>

		<guid isPermaLink="false">http://www.ourapache.com/?p=314</guid>
		<description><![CDATA[第一次看到这个标题时我也很惊讶，Apache居然还能做负载均衡？真是太强大了。经过一番调查后发现的确可以，而且功能一点都不差。这都归功于 mod_proxy 这个模块。不愧是强大的Apache啊。]]></description>
			<content:encoded><![CDATA[<p>    第一次看到这个标题时我也很惊讶，Apache居然还能做负载均衡？真是太强大了。经过一番调查后发现的确可以，而且功能一点都不差。这都归功于 <a href="http://ourapache.com/archives/tag/mod_proxy" class="st_tag internal_tag" rel="tag" title="标签 mod_proxy 下的日志">mod_proxy</a> 这个模块。不愧是强大的Apache啊。</p>
<p>    废话少说，下面就来解释一下负载均衡的设置方法。</p>
<p>    一般来说，负载均衡就是将客户端的请求分流给后端的各个真实服务器，达到负载均衡的目的。还有一种方式是用两台服务器，一台作为主服务器(Master)，另一台作为热备份(Hot Standby)，请求全部分给主服务器，在主服务器当机时，立即切换到备份服务器，以提高系统的整体可靠性。</p>
<p>    <strong>负载均衡的设置</strong></p>
<p>    Apache可以应对上面这两种需求。先来讨论一下如何做负载均衡。首先需要启用Apache的几个模块：</p>
<pre>
<table style="table-layout: fixed; border: #cccccc 1px dotted;" border="0" cellspacing="0" cellpadding="6" width="95%" align="center">
<tbody>
<tr>
<td style="word-wrap: break-word;" bgcolor="#f3f3f3"><span style="font-weight: bold;">以下是引用片段：</span>
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule proxy_http_module modules/mod_proxy_http.so</td>
</tr>
</tbody>
</table>
</pre>
<p>    mod_proxy提供代理服务器功能，mod_proxy_balancer提供负载均衡功能， mod_proxy_http让代理服务器能支持HTTP协议。如果把mod_proxy_http换成其他协议模块（如mod_proxy_ftp），或许能支持其他协议的负载均衡，有兴趣的朋友可以自己尝试一下。</p>
<pre>  然后要添加以下配置：</pre>
<pre>
<table style="table-layout: fixed; border: #cccccc 1px dotted;" border="0" cellspacing="0" cellpadding="6" width="95%" align="center">
<tbody>
<tr>
<td style="word-wrap: break-word;" bgcolor="#f3f3f3"><span style="font-weight: bold;">以下是引用片段：</span>
ProxyRequests Off
&lt;Proxy balancer://mycluster&gt;
    BalancerMember http://node-a.myserver.com:8080
    BalancerMember http://node-b.myserver.com:8080
&lt;/Proxy&gt;
ProxyPass / balancer://mycluster 

# 警告：以下这段配置仅用于调试，绝不要添加到生产环境中！！！
&lt;Location /balancer-manager&gt;
    SetHandler balancer-manager
    Order Deny,Allow
    Deny from all
    Allow from localhost
&lt;/Location&gt; </td>
</tr>
</tbody>
</table>
</pre>
<p>    从上面的 ProxyRequests Off 这条可以看出，实际上负载均衡器就是一个反向代理，只不过它的代理转发地址不是某台具体的服务器，而是一个 balancer:// 协议：</p>
<pre>
<table style="table-layout: fixed; border: #cccccc 1px dotted;" border="0" cellspacing="0" cellpadding="6" width="95%" align="center">
<tbody>
<tr>
<td style="word-wrap: break-word;" bgcolor="#f3f3f3"><span style="font-weight: bold;">以下是引用片段：</span>
ProxyPass / balancer://mycluster</td>
</tr>
</tbody>
</table>
</pre>
<p>    协议地址可以随便定义。然后，在段中设置该balancer协议的内容即可。BalancerMember指令可以添加负载均衡组中的真实服务器地址。</p>
<p>    下面那段是用来监视负载均衡的工作情况的，调试时可以加上（生产环境中禁止使用！），然后访问 <a href="http://localhost/balancer-manager/">http://localhost/balancer-manager/</a> 即可看到负载均衡的工作状况。</p>
<p>    OK，改完之后重启服务器，访问你的Apache所在服务器的地址，即可看到负载均衡的效果了。打开 balancer-manager 的界面，可以看到请求是平均分配的。</p>
<p>    如果不想平均分配怎么办？给 BalancerMember 加上 loadfactor 参数即可，取值范围为1-100。比如你有三台服务器，负载分配比例为 7:2:1，只需这样设置：</p>
<pre>
<table style="table-layout: fixed; border: #cccccc 1px dotted;" border="0" cellspacing="0" cellpadding="6" width="95%" align="center">
<tbody>
<tr>
<td style="word-wrap: break-word;" bgcolor="#f3f3f3"><span style="font-weight: bold;">以下是引用片段：</span>
ProxyRequests Off
&lt;Proxy balancer://mycluster&gt;
    BalancerMember http://node-a.myserver.com:8080 loadfactor=7
    BalancerMember http://node-b.myserver.com:8080 loadfactor=2
    BalancerMember http://node-c.myserver.com:8080 loadfactor=1
&lt;/Proxy&gt;
ProxyPass / balancer://mycluster</td>
</tr>
</tbody>
</table>
</pre>
<pre>    默认情况下，负载均衡会尽量让各个服务器接受的请求次数满足预设的比例。如果要改变算法，可以使用 lbmethod 属性。如：</pre>
<pre>
<table style="table-layout: fixed; border: #cccccc 1px dotted;" border="0" cellspacing="0" cellpadding="6" width="95%" align="center">
<tbody>
<tr>
<td style="word-wrap: break-word;" bgcolor="#f3f3f3"><span style="font-weight: bold;">以下是引用片段：</span>
ProxyRequests Off
&lt;Proxy balancer://mycluster&gt;
    BalancerMember http://node-a.myserver.com:8080 loadfactor=7
    BalancerMember http://node-b.myserver.com:8080 loadfactor=2
    BalancerMember http://node-c.myserver.com:8080 loadfactor=1
&lt;/Proxy&gt;
ProxyPass / balancer://mycluster
ProxySet lbmethod=bytraffic</td>
</tr>
</tbody>
</table>
</pre>
<p>    lbmethod可能的取值有：</p>
<div class="ie5">
<table style="table-layout: fixed; border: #cccccc 1px dotted;" border="0" cellspacing="0" cellpadding="6" width="95%" align="center">
<tbody>
<tr>
<td style="word-wrap: break-word;" bgcolor="#f3f3f3"><span style="font-weight: bold;">以下是引用片段：</span><br />
lbmethod=byrequests按照请求次数均衡(默认)<br />
lbmethod=bytraffic按照流量均衡<br />
lbmethod=bybusyness按照繁忙程度均衡(总是分配给活跃请求数最少的服务器)</td>
</tr>
</tbody>
</table>
</div>
<p>    各种算法的原理请参见<a href="http://httpd.apache.org/docs/2.2/en/mod/mod_proxy_balancer.html">Apache的文档</a>。</p>
<p>    <strong>热备份(Hot Standby)</strong></p>
<p>    热备份的实现很简单，只需添加 status=+H 属性，就可以把某台服务器指定为备份服务器：</p>
<pre>
<table style="table-layout: fixed; border: #cccccc 1px dotted;" border="0" cellspacing="0" cellpadding="6" width="95%" align="center">
<tbody>
<tr>
<td style="word-wrap: break-word;" bgcolor="#f3f3f3"><span style="font-weight: bold;">以下是引用片段：</span>
ProxyRequests Off
&lt;Proxy balancer://mycluster&gt;
    BalancerMember http://node-a.myserver.com:8080
    BalancerMember http://node-b.myserver.com:8080 status=+H
&lt;/Proxy&gt;
ProxyPass / balancer://mycluster</td>
</tr>
</tbody>
</table>
</pre>
<p>    从 balancer-manager 界面中可以看到，请求总是流向 node-a ，一旦node-a挂掉，Apache会检测到错误并把请求分流给 node-b。Apache会每隔几分钟检测一下 node-a 的状况，如果node-a恢复，就继续使用node-a。</p>
<h3  class="related_post_title">无相关文章，以下随机显示</h3><ul class="related_post"><li>2009年02月10号 -- <a href="http://ourapache.com/archives/109" title="谈谈Apache的优化">谈谈Apache的优化</a></li><li>2009年02月10号 -- <a href="http://ourapache.com/archives/111" title="Apache 中内存管理的三种境界 ">Apache 中内存管理的三种境界 </a></li><li>2009年02月25号 -- <a href="http://ourapache.com/archives/170" title="Apache 两种虚拟主机方式的区别">Apache 两种虚拟主机方式的区别</a></li><li>2009年03月9号 -- <a href="http://ourapache.com/archives/222" title="Apache 2.0中prefork.c模块和worker.c模块的比较">Apache 2.0中prefork.c模块和worker.c模块的比较</a></li><li>2009年02月10号 -- <a href="http://ourapache.com/archives/114" title="apache + resin的多机部署方案实现方法">apache + resin的多机部署方案实现方法</a></li><li>2009年02月27号 -- <a href="http://ourapache.com/archives/203" title="使用mod_headers或mod_expires落实缓存">使用mod_headers或mod_expires落实缓存</a></li><li>2009年02月27号 -- <a href="http://ourapache.com/archives/193" title="header Content-Type类型">header Content-Type类型</a></li><li>2009年02月7号 -- <a href="http://ourapache.com/archives/97" title="使用apache下的301设置来做域名的更换转移">使用apache下的301设置来做域名的更换转移</a></li><li>2010年03月9号 -- <a href="http://ourapache.com/archives/316" title="htaccess二级目录重写找不到路径">htaccess二级目录重写找不到路径</a></li><li>2008年12月27号 -- <a href="http://ourapache.com/archives/11" title="apxs &#8211; Apache 扩展工具">apxs &#8211; Apache 扩展工具</a></li></ul>
	标签：<a href="http://ourapache.com/archives/category/advanced" title="Apache高级应用" rel="tag">Apache高级应用</a>, <a href="http://ourapache.com/archives/tag/%e8%b4%9f%e8%bd%bd%e5%9d%87%e8%a1%a1" title="负载均衡" rel="tag">负载均衡</a><br />
<img src="http://feeds.feedburner.com/~r/ourapache/~4/-aJ5tACFzLc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://ourapache.com/archives/314/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://ourapache.com/archives/314</feedburner:origLink></item>
		<item>
		<title>apache配置（如何禁止列出目录内容）</title>
		<link>http://feedproxy.google.com/~r/ourapache/~3/kKMOnRb1pR4/312</link>
		<comments>http://ourapache.com/archives/312#comments</comments>
		<pubDate>Sat, 12 Dec 2009 15:37:21 +0000</pubDate>
		<dc:creator>OurApache</dc:creator>
				<category><![CDATA[Apache基础知识]]></category>
		<category><![CDATA[目录]]></category>

		<guid isPermaLink="false">http://www.ourapache.com/?p=312</guid>
		<description><![CDATA[只需要将访问目录的Options 内部的Indexes去掉即可。]]></description>
			<content:encoded><![CDATA[<p>只需要将访问目录的Options 内部的Indexes去掉即可。</p>
<table style="table-layout: fixed; border: #cccccc 1px dotted;" border="0" cellspacing="0" cellpadding="6" width="95%" align="center">
<tbody>
<tr>
<td style="word-wrap: break-word;" bgcolor="#fdfddf"><span style="font-weight: bold;">以下是代码片段：</span><br />
        &lt;Directory /home/blog/piwigo-2.0.5&gt;<br />
                #Options Indexes FollowSymLinks MultiViews<br />
                Options FollowSymLinks MultiViews<br />
                AllowOverride all<br />
                Order allow,deny<br />
                allow from all<br />
        &lt;/Directory&gt;</td>
</tr>
</tbody>
</table>
<h3  class="related_post_title">无相关文章，以下随机显示</h3><ul class="related_post"><li>2009年01月6号 -- <a href="http://ourapache.com/archives/35" title="不再为Apache进程淤积、耗尽内存而困扰">不再为Apache进程淤积、耗尽内存而困扰</a></li><li>2009年02月25号 -- <a href="http://ourapache.com/archives/178" title="Apache缓存系统">Apache缓存系统</a></li><li>2009年09月6号 -- <a href="http://ourapache.com/archives/306" title="网络流量尽在掌控">网络流量尽在掌控</a></li><li>2009年02月27号 -- <a href="http://ourapache.com/archives/200" title="header常用指令">header常用指令</a></li><li>2009年02月7号 -- <a href="http://ourapache.com/archives/97" title="使用apache下的301设置来做域名的更换转移">使用apache下的301设置来做域名的更换转移</a></li><li>2009年02月27号 -- <a href="http://ourapache.com/archives/211" title="Apache common-pool, common-dbcp源码解读与对象池原理剖析">Apache common-pool, common-dbcp源码解读与对象池原理剖析</a></li><li>2008年12月27号 -- <a href="http://ourapache.com/archives/15" title="Apache服务器限制并发连接和下载速度">Apache服务器限制并发连接和下载速度</a></li><li>2009年04月8号 -- <a href="http://ourapache.com/archives/238" title="apache软件体系结构  ">apache软件体系结构  </a></li><li>2009年02月6号 -- <a href="http://ourapache.com/archives/82" title="YouTube 架构学习">YouTube 架构学习</a></li><li>2009年08月13号 -- <a href="http://ourapache.com/archives/281" title="Linux下Apache并发连接数和带宽控制">Linux下Apache并发连接数和带宽控制</a></li></ul>
	标签：<a href="http://ourapache.com/archives/category/basic" title="Apache基础知识" rel="tag">Apache基础知识</a>, <a href="http://ourapache.com/archives/tag/%e7%9b%ae%e5%bd%95" title="目录" rel="tag">目录</a><br />
<img src="http://feeds.feedburner.com/~r/ourapache/~4/kKMOnRb1pR4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://ourapache.com/archives/312/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://ourapache.com/archives/312</feedburner:origLink></item>
		<item>
		<title>.htaccess的301跳转</title>
		<link>http://feedproxy.google.com/~r/ourapache/~3/7UlHAZQnIEQ/310</link>
		<comments>http://ourapache.com/archives/310#comments</comments>
		<pubDate>Sat, 12 Dec 2009 15:35:29 +0000</pubDate>
		<dc:creator>OurApache</dc:creator>
				<category><![CDATA[Apache基础知识]]></category>
		<category><![CDATA[301]]></category>
		<category><![CDATA[htaccess]]></category>
		<category><![CDATA[跳转]]></category>

		<guid isPermaLink="false">http://www.ourapache.com/?p=310</guid>
		<description><![CDATA[.htaccess的301跳转]]></description>
			<content:encoded><![CDATA[<p>server:linux(ubuntu)</p>
<p>add <a href="http://ourapache.com/archives/tag/mod_rewrite" class="st_tag internal_tag" rel="tag" title="标签 mod_rewrite 下的日志">mod_rewrite</a>:1、sudo a2enmod rewrite 2、udo vim /etc/apache2/sites-enabled/000-default</p>
<p>将其中的：</p>
<p>AllowOverride None</p>
<p>修改为：</p>
<p>AllowOverride All</p>
<p>重启生效。</p>
<p>将 htmldata.cn 转换为 www.htmldata.cn</p>
<div class="codecolorer-container text " style="overflow: auto; white-space: nowrap;">
<div class="text codecolorer" style="white-space: nowrap;">
<table style="table-layout: fixed; border: #cccccc 1px dotted;" border="0" cellspacing="0" cellpadding="6" width="95%" align="center">
<tbody>
<tr>
<td style="word-wrap: break-word;" bgcolor="#f3f3f3"><span style="font-weight: bold;">以下是引用片段：</span><br />
Options +FollowSymlinks<br />
RewriteEngine on<br />
rewritecond %{http_host} ^htmldata.cn [nc]<br />
rewriterule ^(.*)$ http://www.htmldata.cn/$1 [r=<a href="http://ourapache.com/archives/tag/301" class="st_tag internal_tag" rel="tag" title="标签 301 下的日志">301</a>,nc]</td>
</tr>
</tbody>
</table>
</div>
</div>
<h3  class="related_post_title">相关文章</h3><ul class="related_post"><li>2010年03月9号 -- <a href="http://ourapache.com/archives/316" title="htaccess二级目录重写找不到路径">htaccess二级目录重写找不到路径</a></li><li>2009年06月15号 -- <a href="http://ourapache.com/archives/259" title="16个简单实用的.htaccess小贴示">16个简单实用的.htaccess小贴示</a></li><li>2009年02月7号 -- <a href="http://ourapache.com/archives/97" title="使用apache下的301设置来做域名的更换转移">使用apache下的301设置来做域名的更换转移</a></li><li>2009年01月6号 -- <a href="http://ourapache.com/archives/32" title="htaccess学习笔记">htaccess学习笔记</a></li><li>2009年01月6号 -- <a href="http://ourapache.com/archives/25" title="Apache服务器使用.htaccess实现图片防盗链方法教程">Apache服务器使用.htaccess实现图片防盗链方法教程</a></li><li>2008年12月27号 -- <a href="http://ourapache.com/archives/7" title="apache中.htaccess的功能及写法">apache中.htaccess的功能及写法</a></li></ul>
	标签：<a href="http://ourapache.com/archives/tag/301" title="301" rel="tag">301</a>, <a href="http://ourapache.com/archives/category/basic" title="Apache基础知识" rel="tag">Apache基础知识</a>, <a href="http://ourapache.com/archives/tag/htaccess" title="htaccess" rel="tag">htaccess</a>, <a href="http://ourapache.com/archives/tag/%e8%b7%b3%e8%bd%ac" title="跳转" rel="tag">跳转</a><br />
<img src="http://feeds.feedburner.com/~r/ourapache/~4/7UlHAZQnIEQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://ourapache.com/archives/310/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://ourapache.com/archives/310</feedburner:origLink></item>
		<item>
		<title>网络流量尽在掌控</title>
		<link>http://feedproxy.google.com/~r/ourapache/~3/Dl_kXITVs1M/306</link>
		<comments>http://ourapache.com/archives/306#comments</comments>
		<pubDate>Sat, 05 Sep 2009 16:17:12 +0000</pubDate>
		<dc:creator>OurApache</dc:creator>
				<category><![CDATA[未分类]]></category>
		<category><![CDATA[流量]]></category>

		<guid isPermaLink="false">http://www.ourapache.com/?p=306</guid>
		<description><![CDATA[导读:了解网络流量的分布、找到优化网络性能的方法、通过网络管理技术来提升网络效能，同时做好网络流量信息安全方面的防护工作，这是网络流量管理的主要工作内容。]]></description>
			<content:encoded><![CDATA[<p><span>导读:了解网络流量的分布、找到优化网络性能的方法、通过网络管理技术来提升网络效能，同时做好网络流量信息安全方面的防护工作，这是网络流量管理的主要工作内容。</span></p>
<p><span style="color: #990000;">中国移动研究院 李洋博士</span></p>
<p>近十几年来，互联网得到了飞速发展。据统计，互联网目前已成为人类社会最重要的信息基础设施，占人类信息交流的80%。在这种大背景下，面对日益复杂的网络联机及逐渐增加的网络流量，系统和网络管理者必须花更多时间和精力来了解这些网络设备的运作状况，以维持一个企业网络的正常运作。一般来说，网络管理者需要了解各个网段频宽的使用率、网络问题的瓶颈发生于何处，一旦网络发生问题，必须能够很快地分析和判断出问题的发生原因，这些就是网络流量管理的主要工作内容。那么，管理<span style="color: #0000ff;">网络流量</span>的时候应该基于什么样的依据，通过什么手段和策略有效地把流量进行识别、分析和管理呢？</p>
<p><strong>网络流量管理的目标</strong></p>
<p>随着网络流量的不断增长以及网络应用的日趋纷繁复杂化，我们不难看到，简单、无限制地增加网络带宽是不能解决网络流量的根本问题的。我们需要对网络流量进行管理，从而保证网络的健康和网络应用的正常服务。</p>
<p>在网络流量管理的过程中，我们首要的问题就要明确网络管理目标。在网络流量管理主要有4个目标： 首先，我们要<span style="color: #0000ff;">了解网络流量</span>的使用情况； 其次，要<span style="color: #0000ff;">找到优化</span>网络性能的<span style="color: #0000ff;">途径</span>；第三，要通过网络管理技术来<span style="color: #0000ff;">提升网络效能</span>；最后，还需要做好网络<span style="color: #0000ff;">流量信息安全</span>方面的<span style="color: #0000ff;">防护</span>工作。</p>
<p>要达到上述4个目标，网络管理员首先要通过有效的分类方式非常明确地知道，我们需要的带宽到底哪些是实际使用的。其次是找到网络性能的瓶颈。<span style="color: #0000ff;">网络性能</span>有两个很重要的指标，一个是<span style="color: #990000;">吞吐量</span>，即网络能够传输的最大数据量，另一个是<span style="color: #990000;">延迟</span>等。第三，应用成熟的流量监控及控制软件来提升网络性能，从而满足不同的网络应用需求。最后，网管们还可以综合运用<span style="color: #0000ff;">入侵检测系统</span>（IDS）、<span style="color: #0000ff;">防火墙</span>、<span style="color: #0000ff;">统一威胁管理</span>（UTM）设备来对网络流量进行信息安全方面的防护工作。</p>
<p>在日常的网络流量管理中，为了有效实现网络管理4个目标，我们需要采取相应的步骤。这个步骤包括网络流量捕捉和分类、网络流量监视（统计和分析）和控制策略。</p>
<p><span style="color: #0000ff;">1. 网络流量捕捉和分类</span>：这是进行网络流量管理的第一步。只有通过设置捕捉点，对网络流量进行捕捉和分类，才能进行后续的分析和控制工作。这里特别需要强调的是，网络流量分类可以非常宏观化，也可以细化。比如TCP、UDP、ICMP等分类就比较宏观，而HTTP、FTP甚至是诸如Kazza、Skype等P2P流量的分类和识别就比较细化了。在日常工作中，网络管理员可以采用<span style="color: #0000ff;">Wireshark</span>、<span style="color: #0000ff;">TCPDump</span>等知名的报文捕捉和分析软件进行流量捕捉和分类工作。</p>
<p><span style="color: #0000ff;">2.网络流量监视（分析）</span>：监视用来显示流量的运行状况，帮助找出问题所在和执行相应的管理策略。应用程序和网络管理能够收集分类、展示和收集信息，包括<span style="color: #0000ff;">带宽利用率</span>、<span style="color: #0000ff;">活跃的主机和网络效率</span>以及<span style="color: #0000ff;">活跃的应用程序</span>。该目标可以通过采用市面上常见的<span style="color: #0000ff;">NTOP</span>等可视化分析管理工具来协助网络管理员在实际工作中实现。</p>
<p><span style="color: #0000ff;">3. 控制策略</span>：网络流量分析的下一步是根据优先级别分配带宽资源。分配的依据可以是主机、应用等等，特别需要考虑的是注意将消耗资源的<span style="color: #0000ff;">P2P程序</span>或者<span style="color: #0000ff;">音频视频下载</span>等进行滞后考虑。具体操作时可以应用流行的流量控制工具来进行和实现，如进行分类监视和控制网络流量，这样，我们就可以将网络流量有效管理起来，将原来无序的网络流量变得有序起来。</p>
<p>以下我们具体介绍如何进行网络流量管理工作，包括网络流量的识别、网络流量的分析和控制。</p>
<p><strong>网络流量的识别</strong></p>
<p><span style="color: #0000ff;">流量识别</span>，也叫<span style="color: #0000ff;">业务识别（Application Awareness）</span>，是网络流量管理的第一步。网络流量识别通过对业务流量从<span style="color: #0000ff;">数据链路层</span>到<span style="color: #0000ff;">应用层</span>的报文深度检查分析，依据<span style="color: #0000ff;">协议类型</span>、<span style="color: #0000ff;">端口号</span>、<span style="color: #0000ff;">特征字符串</span>和<span style="color: #0000ff;">流量行为特征</span>等参数，获取<span style="color: #0000ff;">业务类型</span>、<span style="color: #0000ff;">业务状态</span>、<span style="color: #0000ff;">业务内容</span>和<span style="color: #0000ff;">用户行为</span>等信息，并进行分类统计和存储。业务识别的基本目的是帮助网络管理员获得网络层之上的业务层流量信息，如业务类型、业务状态、业务分布、业务流量流向等。</p>
<p>业务识别是一个相对复杂的过程，需要多个功能模块的协同工作，业务识别的工作过程简单描述如下：</p>
<p>1. 识别处理模块采用<span style="color: #0000ff;">多通道识别处理</span>，通过对网络流量的<span style="color: #0000ff;">源/目的IP地址</span>和<span style="color: #0000ff;">源/目的端口号</span>的<span style="color: #0000ff;">Hash算法</span>，将网络流量均匀地分配到多个处理通道中。</p>
<p>2. 多处理通道并行执行网络流量的<span style="color: #0000ff;">深度报文检查</span>，获取<span style="color: #0000ff;">网络流量的特征信息</span>，并与<span style="color: #0000ff;">业务识别特征库</span>中的特征进行比对。</p>
<p>3. 将匹配结果送往<span style="color: #0000ff;">识别处理模块</span>，并标识特定网络流量。如果存在多个匹配结果，选取<span style="color: #0000ff;">优先级</span>较高的匹配结果进行标识。特定网络流量一经识别确定，该网络流量的后续连接将不再进行深度的报文检查，直接将其网络层和传输层信息与已知识别结果进行比对，以提高执行效率。</p>
<p>4. 识别处理模块将网络流量的业务识别结果存储到识别结果存储模块中，为网络流量的统计分析提供依据。</p>
<p>5. <span style="color: #0000ff;">统计分析模块</span>从识别结果存储模块中读取相关信息，并以曲线、饼图、柱状图或者文本的方式将识别结果信息显示或以文件的形式输出。</p>
<p>6. 在结果存储模块中保存的识别结果信息会输出到网络流量管理功能区，为实施网络流量管理提供依据。</p>
<p>目前常用的业务识别技术有两种，即DPI技术和DFI技术。</p>
<p><strong>DPI技术</strong> DPI是<span style="color: #990000;">深度报文检测（Deep Packet Inspection）</span>的简称。DPI技术之所以称为“深度”的检测技术，是相对于传统的检测技术而言的。<span style="color: #0000ff;">传统的流量检测技术</span>仅获取那些寄存在数据包<span style="color: #0000ff;">网络层和传输层协议头</span>中的基本信息，包括<span style="color: #0000ff;">源/目的IP地址</span>、<span style="color: #000000;">源/目的传输层端口号</span>、<span style="color: #0000ff;">协议号</span>，以及<span style="color: #0000ff;">底层的连接状态</span>等。通过这些参数很难获得足够多的业务应用信息，特别是对于当前<span style="color: #0000ff;">P2P应用</span>、<span style="color: #0000ff;">VoIP应用</span>、<span style="color: #0000ff;">IPTV应用</span>被广泛开展的情况，传统的流量检测技术已经不能满足网络流量管理的需要了。</p>
<p>DPI技术对传统的流量检测技术进行了“深度”扩展，在获取数据包基本信息的同时，对多个相关数据包的<span style="color: #0000ff;">应用层协议头</span>和<span style="color: #0000ff;">协议负荷</span>进行扫描，<span style="color: #990000;">获取</span>保存在<span style="color: #0000ff;">应用层</span>中的<span style="color: #0000ff;">特征</span>信息，对网络流量进行精细的检查、监控和分析。</p>
<p>DPI技术通常采用如下的数据包分析方法：</p>
<p>● 传输层端口分析。许多应用使用默认的传输层端口号，例如HTTP协议使用80端口。</p>
<p>● 特征字匹配分析。一些应用在<span style="color: #0000ff;">应用层协议头</span>或者<span style="color: #0000ff;">应用层负荷</span>中的特定位置包含特征字段，通过特征字段的识别实现数据包检查、监控和分析。</p>
<p>● 通信交互过程分析。对<span style="color: #0000ff;">多个会话的事务交互过程</span>进行监控分析，包括<span style="color: #0000ff;">包长度</span>、<span style="color: #0000ff;">发送的包数目</span>等，实现对网络业务的检查、监控和分析。</p>
<p>该技术如果进行更加详细的划分，还可分为<span style="color: #0000ff;">特征字的识别技术</span>、<span style="color: #0000ff;">应用层网关识别技术</span>、<span style="color: #0000ff;">行为模式识别技术</span>，这三类识别技术分别适用于不同类型的协议，相互之间无法替代，只有综合地运用这三大技术，才能有效、灵活地识别网络上的各类应用，从而实现控制和计费。</p>
<p><strong>DFI技术</strong> DFI是<span style="color: #990000;">深度流行为检测（Deep Flow Inspection）</span>的简称，也是一种典型的业务识别技术。DFI技术是针对DPl技术的不足提出的，为了解决<span style="color: #0000ff;">DPI技术的执行效率</span>、<span style="color: #0000ff;">加密流量识别</span>和<span style="color: #0000ff;">频繁升级</span>等问题。DFI更关注于<span style="color: #990000;">网络流量特征的通用性</span>，因此，DFI技术并不对网络流量进行深度的报文检测，而仅通过对<span style="color: #0000ff;">网络流量的状态</span>、<span style="color: #0000ff;">网络层和传输层信息</span>、<span style="color: #0000ff;">业务流持续时间</span>、<span style="color: #0000ff;">平均流速率</span>、<span style="color: #0000ff;">字节长度</span>分布等参数的统计分析，来获取业务类型、业务状态。</p>
<p><strong>网络流量的统计分析</strong></p>
<p>通过流量统计分析，网络管理者能够知道当前网络中的业务流量的类型、<a href="http://ourapache.com/archives/tag/%e5%b8%a6%e5%ae%bd" class="st_tag internal_tag" rel="tag" title="标签 带宽 下的日志">带宽</a>、时间和空间分布、流向等信息。</p>
<p>在管理的过程中，管理员可以采用常见的<span style="color: #0000ff;">NTOP工具</span>来协助完成。NTOP工具与传统的<span style="color: #0000ff;">tcpdump</span>或<span style="color: #0000ff;">ethereal</span>等网络流量捕捉工具有着极大的差异，它主要是提供<span style="color: #0000ff;">网络报文的统计数据</span>，而不是<span style="color: #0000ff;">报文的内容</span>。此外，NTOP不需要使用<span style="color: #0000ff;">Web服务器</span>，它自身就支持HTTP协议。首先，它提供了一种快速容易的方法来得到网络活动的准确信息，并且不使用<span style="color: #0000ff;">网络探测或侦听设备</span>。在大多数情况下，网络探测器对追踪网络故障是必需的，而在某些时候可能因为探测器正被使用于监测其他设备而无法获得，就可以使用NTOP工具；其次，在某些给定的网络配置下可能无法与探测器连接，比如两个通过WAN互连的Unix系统，在这种情况下，用户可以应用NTOP工具。</p>
<p>一般说来，使用NTOP工具可以辅助网络管理员完成以下一些工作： 自动从网络中识别有用的信息； 将截获的数据包转换成易于识别的格式；对网络环境中通信失败的情况进行分析； 探测网络环境中的通信瓶颈； 记录网络通信的时间和过程。</p>
<p>NTOP工具可以通过<span style="color: #0000ff;">分析网络流量</span>来<span style="color: #0000ff;">确定</span>网络上存在的各种<span style="color: #0000ff;">问题</span>，也可以用来<span style="color: #0000ff;">判断</span>是否有<span style="color: #0000ff;">黑客</span>正在<span style="color: #0000ff;">攻击</span>网络系统，还可以很方便地<span style="color: #0000ff;">显示</span>出<span style="color: #0000ff;">特定</span>的<span style="color: #0000ff;">网络协议</span>、<span style="color: #0000ff;">占用大量带宽</span>的<span style="color: #0000ff;">主机</span>、<span style="color: #0000ff;">各次通信</span>的<span style="color: #0000ff;">目标主机</span>、<span style="color: #0000ff;">数据包</span>的<span style="color: #0000ff;">发送时间</span>、<span style="color: #0000ff;">传递数据包</span>的<span style="color: #0000ff;">延时</span>等详细信息。通过了解这些信息，网管员可以对故障做出及时的响应，对网络进行相应的优化调整，以保证网络运行的效率和安全。</p>
<p><strong>网络流量的控制</strong></p>
<p>将<span style="color: #0000ff;">流量控制能力</span>添加到网络流量管理中，能够帮助网络管理者对<span style="color: #0000ff;">网络资源</span>和<span style="color: #0000ff;">业务资源</span>进行<span style="color: #0000ff;">带宽控制</span>和<span style="color: #0000ff;">资源调度</span>，如对HTTP、FTP、SMTP以及P2P等应用进行管理，尤其是对<span style="color: #990000;">P2P流量</span>进行<span style="color: #0000ff;">抑制</span>来提升传统数据业务的用户体验度。</p>
<p>具备<span style="color: #0000ff;">流量控制</span>能力的<span style="color: #0000ff;">网络流量管理</span>还能够对严重影响<span style="color: #0000ff;">业务运营者收入</span>的未经许可的其他业务进行<span style="color: #990000;">抑制</span>。比如，对于VoIP业务，我们可以通过对<span style="color: #0000ff;">VoIP信令流量</span>和<span style="color: #0000ff;">媒体流量的关联检测</span>和统计分析，以及通过截断媒体数据包、伪装信令报文等方式对流量进行管理。还可以通过综合使用网络层、传输层和应用层检测技术，对未经许可的宽带私接用户采取<span style="color: #0000ff;">中断连接</span>、<span style="color: #0000ff;">主动告警</span>、<span style="color: #0000ff;">分时控制</span>等多种管理动作。</p>
<p>流量控制还能够帮助网络流量管理实现<span style="color: #0000ff;">业务资源的调度</span>，并能够获得<span style="color: #0000ff;">业务资源使用</span>、<span style="color: #0000ff;">业务状态</span>的<span style="color: #990000;">实时情况</span>。当某一网络应用业务服务器负载较大时，可以进行<span style="color: #0000ff;">全局的业务资源负载均衡</span>，以平均地承担业务请求；同时也能够对用户的业务请求进行调度，决定是否继续响应用户新的业务请求，并根据用户的优先级优先响应高优先级用户的业务请求，以提升业务运营效率。</p>
<p>流量控制通常的做法是在<span style="color: #0000ff;">输出端口</span>处建立一个<span style="color: #0000ff;">队列</span>进行<span style="color: #0000ff;">流量控制</span>，控制的方式是<span style="color: #0000ff;">基于路由</span>，亦即<span style="color: #0000ff;">基于目的IP地址</span>或<span style="color: #0000ff;">目的子网的网络号</span>。<span style="color: #0000ff;">流量控制器</span>基本的功能模块为<span style="color: #0000ff;">队列</span>、<span style="color: #0000ff;">分类</span>和<span style="color: #0000ff;">过滤器</span>。由于目前网络流量种类繁多，网络管理员在管理时通常都采用<span style="color: #990000;">分类</span>的方式进行。</p>
<p>对于网络流量管理来说，除了应具有上述的流量识别、流量分析和流量控制的功能之外，我们一般还希望其具有和防火墙等网络安全设备协同构建一个主动的安全威胁防御体系的功能，以提升整个网络的安全防护能力，从而更好地保证网络流量。</p>
<p>比如，流量特征识别分析就是一种必要的流量管理手段。它能够主动发现诸如DDoS攻击、病毒和木马等异常流量，较好地弥补其他网络安全设备如防火墙、入侵防护系统（IPS）和统一威胁管理（UTM）等的不足，提升其主动发现安全威胁的能力，并能够及时向其他网络安全设备发出告警，从安全威胁源头开始就进行主动的防御。此外，具备流量识别能力的网络流量管理还能够获取并保存网络流量的网络层信息（例如，源/目的IP地址、应用端口、用户标识ID等信息），通过这些信息，网络管理者能够对安全威胁进行溯源定位。</p>
<p><strong>链接一 DFI技术与DPI技术比较</strong></p>
<p>DFI与DPI两种技术的设计基本目标都是为了实现业务识别，但是两者在实现的着眼点和技术细节方面还是存在着较大区别的。从两种技术的对比情况看，两者互有优势，也都有短处，<span style="color: #990000;">DPI</span>技术适用于需要<span style="color: #0000ff;">精细和准确识别、精细管理</span>的环境，而<span style="color: #990000;">DFI</span>技术适用于需要<span style="color: #0000ff;">高效识别、粗放管理</span>的环境。</p>
<p>从<span style="color: #0000ff;">处理速度</span>来看： DFI处理速度相对快，而采用DPI技术由于要逐包进行拆包操作，并与后台数据库进行匹配对比，处理速度会慢些。由于采用DFI技术进行流量分析仅需将流量特征与<span style="color: #0000ff;">后台流量模型</span>比较即可，因此，与目前多数基于<span style="color: #0000ff;">DPI的带宽管理</span>系统的<span style="color: #0000ff;">处理能力</span>仅为线速<span style="color: #0000ff;">1Gbit/s</span>相比，<span style="color: #0000ff;">基于DFI的系统</span>可以达到线速<span style="color: #0000ff;">10Gbit/s</span>，完全可以满足企业网络流量管理的需求。</p>
<p>从<span style="color: #0000ff;">维护成本</span>来看： DFI维护成本相对较低，而基于DPI技术的带宽管理系统总是滞后新应用，需要紧跟新协议和新型应用的产生而不断升级后台应用数据库，否则就不能有效识别、管理新技术下的带宽，影响模式匹配效率；而基于DFI技术的系统在管理维护上的工作量要少于DPI系统，因为同一类型的新应用与旧应用的流量特征不会出现大的变化，因此不需要频繁升级流量行为模型。</p>
<p>从<span style="color: #0000ff;">识别准确率</span>来看： 两种技术各有所长。由于DPI采用<span style="color: #0000ff;">逐包分析</span>、<span style="color: #0000ff;">模式匹配</span>技术，因此，可以对流量中的具体应用类型和协议做到比较准确的识别；而DFI仅对<span style="color: #0000ff;">流量行为分析</span>，因此只能对应用类型进行笼统分类，如对满足<span style="color: #0000ff;">P2P流量模型</span>的应用统一识别为P2P流量，对符合<span style="color: #0000ff;">网络语音流量模型</span>的类型统一归类为VoIP流量，但是无法判断该流量是否采用<span style="color: #0000ff;">H.323</span>或其他协议。如果数据包是经过加密传输的，采用DPI方式的流控技术则不能识别其具体应用，而DFI方式的流控技术不受影响，因为应用流的状态行为特征不会因加密而根本改变。</p>
<p><strong>链接二 几种常见的网络流量</strong></p>
<p>当前随着网络应用的不断丰富和发展，网络流量也随之变得复杂和种类繁多起来，下面是最为常见的几种网络流量：</p>
<p>1. HTTP流量： HTTP是互联网上使用最为广泛的协议，早就已经取代传统文件下载的主要应用层协议FTP，如今，随着YouTube等<span style="color: #0000ff;">视频共享</span>网站的拉动，HTTP协议的网络流量在过去四年里首次超过了P2P应用的流量。</p>
<p>2. FTP流量：从互联网出现的开始，FTP就一直是用户使用频率最高的应用服务之一，重要性仅次于HTTP和SMTP。而随着P2P应用的出现，其重要性地位虽然有所降低，但是仍然是用户们下载文件不可替代的重要应用和途径之一。</p>
<p>3. SMTP流量：电子邮件是整个互联网业务重要的组成部分。据统计，3/4以上的用户上网的主要目的是收发邮件，每天有十数亿封电子邮件在全球传递。特别是由于电子邮件的廉价和操作简便，诱使有人将它作为大量散发自己信息的工具，最终导致了互联网世界中垃圾邮件的泛滥。</p>
<p>4. VoIP流量： 2006年全球IP电话用户从1030万增长到1870万，增幅达83%。2007年VoIP通话量已达到全部通话量的75%。因此，互联网上VoIP的流量也是非常值得管理员关注的。</p>
<p>5. P2P流量：目前网络带宽“消费大户”是P2P文件共享，在中东占据了49%，东欧地区占据了84%。从全球来看，夜间时段的网络带宽有95%被P2P占据。</p>
<p>6. Streaming流量：随着诸如PPLive、PPStream等视频软件的出现，视频直播和点播成为广大互联网用户观看节目和网上娱乐的最佳生活方式，因此其流量也在不断地增加。</p>
<h3  class="related_post_title">无相关文章，以下随机显示</h3><ul class="related_post"><li>2009年02月27号 -- <a href="http://ourapache.com/archives/211" title="Apache common-pool, common-dbcp源码解读与对象池原理剖析">Apache common-pool, common-dbcp源码解读与对象池原理剖析</a></li><li>2010年04月13号 -- <a href="http://ourapache.com/archives/326" title="解决linux下安装ssl后，apache重启时需要密码">解决linux下安装ssl后，apache重启时需要密码</a></li><li>2009年12月12号 -- <a href="http://ourapache.com/archives/312" title="apache配置（如何禁止列出目录内容）">apache配置（如何禁止列出目录内容）</a></li><li>2009年02月25号 -- <a href="http://ourapache.com/archives/181" title="Apache并发控制、查看进程数、TCP连接、压缩功能说明">Apache并发控制、查看进程数、TCP连接、压缩功能说明</a></li><li>2009年02月17号 -- <a href="http://ourapache.com/archives/142" title="在64位机器上关于Apache 2.2.3版的编译问题">在64位机器上关于Apache 2.2.3版的编译问题</a></li><li>2009年02月16号 -- <a href="http://ourapache.com/archives/140" title="Apache、resin、rewrite泛域名、多域名设置">Apache、resin、rewrite泛域名、多域名设置</a></li><li>2009年02月10号 -- <a href="http://ourapache.com/archives/106" title="Apache Rewrite 规则详解">Apache Rewrite 规则详解</a></li><li>2009年01月5号 -- <a href="http://ourapache.com/archives/21" title="关于keepalive的解释">关于keepalive的解释</a></li><li>2009年02月25号 -- <a href="http://ourapache.com/archives/168" title="apache ab压力测试收藏">apache ab压力测试收藏</a></li><li>2009年02月12号 -- <a href="http://ourapache.com/archives/136" title="让apache支持自定义404页面错误">让apache支持自定义404页面错误</a></li></ul>
	标签：<a href="http://ourapache.com/archives/category/uncategorized" title="未分类" rel="tag">未分类</a>, <a href="http://ourapache.com/archives/tag/%e6%b5%81%e9%87%8f" title="流量" rel="tag">流量</a><br />
<img src="http://feeds.feedburner.com/~r/ourapache/~4/Dl_kXITVs1M" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://ourapache.com/archives/306/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		<feedburner:origLink>http://ourapache.com/archives/306</feedburner:origLink></item>
		<item>
		<title>基于资源的HTTP Cache的实现介绍</title>
		<link>http://feedproxy.google.com/~r/ourapache/~3/jbgCyftdl0w/303</link>
		<comments>http://ourapache.com/archives/303#comments</comments>
		<pubDate>Sat, 05 Sep 2009 16:02:58 +0000</pubDate>
		<dc:creator>OurApache</dc:creator>
				<category><![CDATA[HTTP相关知识]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[Etag]]></category>

		<guid isPermaLink="false">http://www.ourapache.com/?p=303</guid>
		<description><![CDATA[我们都知道浏览器会缓存访问过网站的网页，浏览器通过URL地址访问一个网页，显示网页内容的同时会在电脑上面缓存网页内容。如果网页没有更新的话，浏览器再次访问这个URL地址的时候，就不会再次下载网页，而是直接使用本地缓存的网页。只有当网站明确标识资源已经更新，浏览器才会再次下载网页。 ]]></description>
			<content:encoded><![CDATA[<p>我们都知道浏览器会缓存访问过网站的网页，浏览器通过URL地址访问一个网页，显示网页内容的同时会在电脑上面缓存网页内容。如果网页没有更新的话，浏览器再次访问这个URL地址的时候，就不会再次下载网页，而是直接使用本地缓存的网页。只有当网站明确标识资源已经更新，浏览器才会再次下载网页。</p>
<p><strong>一、什么是HTTP <a href="http://ourapache.com/archives/tag/cache" class="st_tag internal_tag" rel="tag" title="标签 cache 下的日志">Cache</a></strong></p>
<p>对于浏览器的这种网页缓存机制大家已经耳熟能详了，举个例子来说，JavaEye的新闻订阅地址：http://www.javaeye.com/rss/news ， 当浏览器或者订阅程序访问这个URL地址的时候，JavaEye的服务器在response的header里面会发送给浏览器如下状态标识：</p>
<blockquote><p><a href="http://ourapache.com/archives/tag/etag" class="st_tag internal_tag" rel="tag" title="标签 Etag 下的日志">Etag</a> “427fe7b6442f2096dff4f92339305444&#8243;<br />
Last-Modified Fri, 04 Sep 2009 05:55:43 GMT</p>
<p>Etag “427fe7b6442f2096dff4f92339305444&#8243;<br />
Last-Modified Fri, 04 Sep 2009 05:55:43 GMT</p></blockquote>
<p>这就是告诉浏览器，新闻订阅这个网络资源的最后修改时间和Etag。于是浏览器把这两个状态信息连同网页内容在本地进行缓存，当浏览器再次访问JavaEye新闻订阅地址的时候，浏览器会发送如下两个状态标识给JavaEye服务器：</p>
<blockquote><p>If-None-Match “427fe7b6442f2096dff4f92339305444&#8243;<br />
If-Modified-Since Fri, 04 Sep 2009 05:55:43 GMT</p>
<p>If-None-Match “427fe7b6442f2096dff4f92339305444&#8243;<br />
If-Modified-Since Fri, 04 Sep 2009 05:55:43 GMT</p></blockquote>
<p>就是告诉服务器，我本地缓存的网页最后修改时间和Etag是什么，请问你服务器的资源有没有在我上次访问之后有更新啊？于是JavaEye服务器会核对一下，如果该用户上次访问之后没有更新过新闻，那么根本就不必生成这个RSS了，直接告诉浏览器：“没什么新东西，你还是看自己缓存的网页吧”，于是服务器就发送一个304 Not Modified的消息，其他什么都不用干了。</p>
<p>这就是HTTP层的Cache，使用这种基于资源的缓存机制，不但大大节省服务器程序资源，而且还减少了网页下载次数，节约了很多网络带宽。</p>
<p><strong>二、HTTP Cache究竟有什么作用？</strong></p>
<p>我们通常的动态网站编程，服务器端程序根本就不去处理浏览器发送过来的If-None-Match和If-Modified-Since状态标识，只要有请求就生成网页发送给浏览器。对于一般情况来说，用户不会总是没完没了刷新一个页面，所以大家并不认为这种基于资源的缓存有什么太大的作用，但实际情况并非如此：</p>
<p>1、像Google这种比较智能的网络爬虫可以有效识别资源的状态信息，如果使用这种缓存机制，可以大大减少爬虫的爬取次数。</p>
<p>比方说Google每天爬JavaEye网站大概15万次左右，但实际上JavaEye每天有更新的内容不会超过1万个网页。因为很多内容更新比较快，因此Google就会反复不停的爬取，这样本身就造成了很多资源的浪费。如果我们使用HTTP Cache，那么只有当网页内容发生改变的时候，才会真正进行爬取，其他时候我们直接告诉Google的爬虫304 Not Modified就可以了。这样不但降低了服务器本身的负载和爬虫造成的网络带宽消耗，实际上也大大提高了Google爬虫的工作效率，岂不是皆大欢喜？</p>
<p>2、很多内容更新不频繁的网页，尽管用户不会频繁的刷新，但是从一个比较长的时间段来看使用HTTP Cache，仍然可以起到很大的缓存作用。</p>
<p>比方说一些历史讨论帖子，已经过去了几个月了，这些帖子内容很少更新。用户可能通过搜索，收藏链接，文章关联等方式时不时访问到这个页面。那么只要用户访问过一次以后，后续所有访问服务器直接发送304 Not Modified就可以了，不用真正生成页面。</p>
<p>3、对于历史帖子使用HTTP Cache可以避免爬虫反复的爬取。</p>
<p>比方说JavaEye的论坛帖子列表页面，分页到20页后面的帖子已经很少有人直接访问了，但是从服务器日志去看，每天仍然有大量爬虫反复爬取这些分页到很后面的页面。这些页面由于用户很少去点击，所以基本上没有被应用程序的memcached缓存住，每次访问都会造成很高的资源消耗，爬虫隔一段时间就爬一次，对服务器是很大的负担。如果使用了HTTP Cache，那么只要爬虫爬过一次以后，以后无论爬虫爬多少次，都可以直接返回304 Not Modified了，极大的节省了服务器的负载。</p>
<p><strong>三、如何在应用程序里面使用HTTP Cache</strong></p>
<p>如果我们要在自己的程序里面实现HTTP Cache，是件非常简单的事情，特别是对Rails来说只需要添加一点点代码，以上面的JavaEye新闻订阅来说，只要添加一行代码：</p>
<blockquote><p>def news<br />
fresh_when(:last_modified =&gt; News.last.created_at, :etag =&gt; News.last)<br />
end</p>
<p>def news<br />
fresh_when(:last_modified =&gt; News.last.created_at, :etag =&gt; News.last)<br />
end</p></blockquote>
<p>用最新新闻文章作为Etag，该文章最后修改时间作为资源的最后修改时间，这样就OK了。如果浏览器发送过来的标识和服务器标识一致，说明内容没有更新，直接发送304 Not Modified；如果不一致，说明内容更新，浏览器本地的缓存太古老了，那么就需要服务器真正生成页面了。</p>
<p>以上只是一个最简单的例子，如果我们需要根据状态做一些更多的工作也是很容易的。比方说JavaEye博客的RSS订阅地址： http://robbin.javaeye.com/rss</p>
<blockquote><p>@blogs = @blog_owner.last_blogs<br />
@hash = @blogs.collect{|b| {b.id =&gt; b.post.modified_at.to_i + b.posts_count}}.hash<br />
if stale?(:last_modified =&gt; (@blog_owner.last_blog.post.modified_at || @blog_owner.last_blog.post.created_at), :etag =&gt; @hash)<br />
render :template =&gt; “rss/blog”<br />
end</p>
<p>@blogs = @blog_owner.last_blogs<br />
@hash = @blogs.collect{|b| {b.id =&gt; b.post.modified_at.to_i + b.posts_count}}.hash<br />
if stale?(:last_modified =&gt; (@blog_owner.last_blog.post.modified_at || @blog_owner.last_blog.post.created_at), :etag =&gt; @hash)<br />
render :template =&gt; “rss/blog”<br />
end</p></blockquote>
<p>这个实现稍微复杂一些。我们需要判断博客订阅所有的输出文章是否有更新，所以我们用博客文章内容最后修改时间和博客的评论数量做一个hash，然后用这个hash值作为资源的Etag，那么只要这些博客文章当中任何文章内容被修改，或者有新评论，都会改变Etag值，从而通知浏览器内容有更新了。</p>
<p>除了RSS订阅之外，JavaEye网站还有很多地方适合使用HTTP Cache，比方说JavaEye论坛的版面列表页面，一些经常喜欢泡论坛的用户，可能时不时会上来刷新一下版面， 看看有没有新的帖子，那么我们就不必每次用户请求的时候都去执行程序，生成页面给他。我们判断一下如果没有新帖子的话，直接告诉他304 Not Modified就可以了，在没有使用HTTP Cache之前的版面Action代码：</p>
<blockquote><p>def board<br />
@topics = @forum.topics.paginate&#8230;<br />
@announcements = (params[:page] || 1).to_i == 1 ? Topic.find :all, :conditions =&gt; &#8230;<br />
render :action =&gt; &#8216;show&#8217;<br />
end</p>
<p>def board<br />
@topics = @forum.topics.paginate&#8230;<br />
@announcements = (params[:page] || 1).to_i == 1 ? Topic.find :all, :conditions =&gt; &#8230;<br />
render :action =&gt; &#8216;show&#8217;<br />
end</p></blockquote>
<p>添加HTTP Cache以后，代码如下：</p>
<blockquote><p>def board<br />
@topics = @forum.topics.paginate&#8230;<br />
if logged_in? || stale?(:last_modified =&gt; @topics[0].last_post.created_at, :etag =&gt; @topics.collect{|t| {t.id =&gt; t.posts_count}}.hash)<br />
@announcements = (params[:page] || 1).to_i == 1 ? Topic.find :all, :conditions&#8230;<br />
render :action =&gt; &#8216;show&#8217;<br />
end<br />
end</p>
<p>def board<br />
@topics = @forum.topics.paginate&#8230;<br />
if logged_in? || stale?(:last_modified =&gt; @topics[0].last_post.created_at, :etag =&gt; @topics.collect{|t| {t.id =&gt; t.posts_count}}.hash)<br />
@announcements = (params[:page] || 1).to_i == 1 ? Topic.find :all, :conditions&#8230;<br />
render :action =&gt; &#8216;show&#8217;<br />
end<br />
end</p></blockquote>
<p>对于登录用户，不使用HTTP Cache，这是因为登录用户需要实时接收站内短信通知和订阅通知，因此我们只能对匿名用户使用HTTP Cache，然后我们使用当前所有帖子id和回帖数构造hash作Etag，这样只要当前分页列表页面有任何帖子发生改变或者有了新回帖，就更新页面，否则就不必重新生成页面。</p>
<p>Rails的Controller提供了fresh_when和stale?方法帮助我们实现HTTP Cahe功能，代码写起来已经非常简单了。但是直接在action里面添加Cache代码还是有点难看，所以我们可以用一个第三方插件：easy http cache来进一步简化工作，这样我们仅仅需要添加一个声明就可以了，如下例：</p>
<blockquote><p>class ListsController &lt; ApplicationController<br />
http_cache :show, :last_modified =&gt; :list, :etag =&gt; :current_user<br />
enddef show<br />
# expensive stuff<br />
endprotected<br />
def list<br />
@list ||= List.find(params[:id])<br />
enddef current_user<br />
@current_user ||= User.find(params[:user_id])<br />
end</p>
<p>class ListsController &lt; ApplicationController<br />
http_cache :show, :last_modified =&gt; :list, :etag =&gt; :current_user<br />
enddef show<br />
# expensive stuff<br />
endprotected<br />
def list<br />
@list ||= List.find(params[:id])<br />
enddef current_user<br />
@current_user ||= User.find(params[:user_id])<br />
end</p></blockquote>
<p>Easy Http Cache插件更多用法可以参考：http://github.com/josevalim/easy_http_cache/tree/master</p>
<p>在给JavaEye网站所有的RSS订阅输出添加了HTTP Cache以后，通过一天的观察发现，超过一半的RSS订阅请求已经被缓存了，直接返回304 Not Modified，所以效果非常明显，由于JavaEye网站每天RSS订阅的动态请求就超过了10万次，因此添加HTTP Cache可以减轻不少服务器的负担和带宽消耗。</p>
<h3  class="related_post_title">相关文章</h3><ul class="related_post"><li>2009年08月12号 -- <a href="http://ourapache.com/archives/268" title="Etag和Expires">Etag和Expires</a></li><li>2009年02月25号 -- <a href="http://ourapache.com/archives/178" title="Apache缓存系统">Apache缓存系统</a></li><li>2009年02月25号 -- <a href="http://ourapache.com/archives/165" title="Apache 设置web 缓存">Apache 设置web 缓存</a></li></ul>
	标签：<a href="http://ourapache.com/archives/tag/cache" title="cache" rel="tag">cache</a>, <a href="http://ourapache.com/archives/tag/etag" title="Etag" rel="tag">Etag</a>, <a href="http://ourapache.com/archives/category/http" title="HTTP相关知识" rel="tag">HTTP相关知识</a><br />
<img src="http://feeds.feedburner.com/~r/ourapache/~4/jbgCyftdl0w" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://ourapache.com/archives/303/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://ourapache.com/archives/303</feedburner:origLink></item>
		<item>
		<title>针对$_SERVER['PHP_SELF']的跨站脚本攻击（XSS）</title>
		<link>http://feedproxy.google.com/~r/ourapache/~3/NGVqEoZyjqM/299</link>
		<comments>http://ourapache.com/archives/299#comments</comments>
		<pubDate>Wed, 02 Sep 2009 05:39:34 +0000</pubDate>
		<dc:creator>OurApache</dc:creator>
				<category><![CDATA[HTTP相关知识]]></category>
		<category><![CDATA[PHP_SELF]]></category>
		<category><![CDATA[XSS]]></category>

		<guid isPermaLink="false">http://www.ourapache.com/?p=299</guid>
		<description><![CDATA[现在的web服务器和开发工具虽然不会再出现像asp的%81那样明显的漏洞了，但是由于开发人员的疏忽和各种语言特性组合造成的一些奇异的漏洞仍然会存在。今天偶然读到的XSS Woes，就详细讲述了和$_SERVER['PHP_SELF']相关的一个危险漏洞。]]></description>
			<content:encoded><![CDATA[<p>现在的web服务器和开发工具虽然不会再出现像asp的%81那样明显的漏洞了，但是由于开发人员的疏忽和各种语言特性组合造成的一些奇异的漏洞仍然会存在。今天偶然读到的<a href="http://blog.phpdoc.info/archives/13-XSS-Woes.html">XSS Woes</a>，就详细讲述了和$_SERVER['<a href="http://ourapache.com/archives/tag/php" class="st_tag internal_tag" rel="tag" title="标签 php 下的日志">PHP</a>_SELF']相关的一个危险漏洞。</p>
<p>$_SERVER['<a href="http://ourapache.com/archives/tag/php_self" class="st_tag internal_tag" rel="tag" title="标签 PHP_SELF 下的日志">PHP_SELF</a>']在开发的时候常会用到，一般用来引用当前网页地址，并且它是系统自动生成的全局变量，也会有什么问题么？让我们先看看下面的代码吧：</p>
<blockquote><p>&lt;form action=”&lt;?php echo $_SERVER['PHP_SELF']; ?&gt;”&gt;<br />
 &lt;input type=”submit” name=”submit” value=”submit” /&gt;<br />
&lt;/form&gt;</p></blockquote>
<p>这段代码非常简单，我们想用$_SERVER['PHP_SELF']来让网页提交时提交到它自己，假设代码文件名为test.php，在执行的时候就一定会得到我们期望的地址么？首先试试地址http://&#8230;/test.php，结果当然是没有问题的啦，别着急，你再访问一下http://&#8230;/test.php/a=1，将会得到如下客户端代码：</p>
<blockquote><p>&lt;form action=”/fwolf/temp/test.php/a=1&#8243;&gt;<br />
 &lt;input type=”submit” name=”submit” value=”submit” /&gt;<br />
&lt;/form&gt;</p></blockquote>
<p>显然，这已经超出了我们的期望，web服务器居然没有产生诸如404之类的错误，页面正常执行了，并且在生成的html代码中居然有用户可以输入的部分，恐怖的地方就在这里。别小看那个“a=1”，如果把它换成一段js代码，就显得更危险了，比如这么调用：</p>
<blockquote><p>http://&#8230;/test.php/%22%3E%3Cscript%3Ealert(&#8216;<a href="http://ourapache.com/archives/tag/xss" class="st_tag internal_tag" rel="tag" title="标签 XSS 下的日志">xss</a>&#8217;)%3C/script%3E%3Cfoo</p></blockquote>
<p>是不是看到了js的alert函数执行的效果？检查一下生成的html源代码找找原因吧。</p>
<p>通过这种嵌入js代码的方式，攻击者能夠获得512～4k的代码空间，甚至还可以连接外部网站的js代码或者通过image调用来伪装js代码的方式，那样js代码的长度就不受限制了，然后通过js，他们可以轻松的获取用户的cookie，或者更改当前页面的任何内容，比如更改表单提交的目的地，更改显示的内容（比如给一个&lt;a&gt;链接地址增加一个onclick=…的属性，这样用户点击的时候就会执行攻击者指定的代码，甚至连接到并非此链接地址本身的网站），甚至作出一个ajax效果来也不一定，总之，不要忽视js的威力。</p>
<p>那么，再来看看这个漏洞产生的原理，首先test.php/&#8230;.这种调用是web服务器允许的，很多cms系统，比如我以前用过的plog，好像也是采用这种方式，在服务器不支持rewrite的情况下实现诸如http://…/index.php/archive/999这样的固定网址的（我以前还以为是对404错误页下的手），所以带“/”的地址无法从web服务器上禁止。然后再看看php中对$_SERVER['PHP_SELF']的识别，他就是一个包含当前网址值的全局变量，天知道用户会输入什么样的网站，在上面的例子中是恶意的，可是在<a href="http://zh.wikipedia.org/wiki/中国">wikipedia</a>这样的网站上，却又是可以正常使用这种方式的地址的。所以，最终的结论要落在开发人员身上了，没有很好的处理与用户交互的数据。</p>
<p>从安全角度来讲，在开发应用尤其是web应用的时候，<strong>所有用户提交的数据都是不安全的</strong>，这是基本原则，所以我们才不厌其烦的又是客户端验证又是服务端验证。从上面说的这个安全漏洞来讲，不安全的内容中又要增加“网址”一条了。要解决$_SERVER['PHP_SELF']的安全隐患，主要有以下2种方式：</p>
<p>1、htmlentities 用htmlentities($_SERVER['PHP_SELF'])来替代简单的$_SERVER['PHP_SELF']，这样即使网址中包含恶意代码，也会被“转换”为用于显示的html代码，而不是被直接嵌入html代码中执行，简单一点说，就是“&lt;”会变成“&amp;lt;”，变成无害的了。</p>
<p>2、REQUEST_URI 用$_SERVER['REQUEST_URI']来替代$_SERVER['PHP_SELF']，在phpinfo()中可以看到这两个变量的区别：</p>
<blockquote><p>_SERVER["REQUEST_URI"] /fwolf/temp/test.php/%22%3E%3Cscript%3Ealert(&#8216;xss&#8217;)%3C/script%3E%3Cfoo<br />
_SERVER["PHP_SELF"] /fwolf/temp/test.php/”&amp;gt;&amp;lt;script&amp;gt;alert(&#8216;xss&#8217;)&amp;lt;/script&amp;gt;&amp;lt;foo</p></blockquote>
<p>$_SERVER['REQUEST_URI']会原封不动的反映网址本身，网址中如果有%3C，那么你得到的也将会是%3C，而$_SERVER['PHP_SELF']会对网址进行一次urldecode操作，网址中的%3C将会变成字符“&lt;”，所以就产生了漏洞。需要注意的是，在很多情况下，浏览器会对用户输入要提交给web服务器的内容进行encode，然后服务器端程序会自动进行decode，得到相应的原指，在我们进行post或者get操作的时候都是这样。</p>
<p>另外还有两点需要指出，第一是&lt;form action=”"&gt;这种写法虽然没有直接用到$_SERVER['PHP_SELF']，但实际效果却是一样的，只是发生的时间错后到了用户提交之后的下一个页面，所以，form的action还是不要留空的好。第二点，除了PHP_SELF之外，其他的$_SERVER变量也许也会有类似的漏洞，比如SCRIPT_URI, SCRIPT_URL, QUERY_STRING, PATH_INFO, PATH_TRANSLATED等等，在使用他们之前一定要先作htmlentities之类的转换。</p>
<p>最后，提供一个地址，里面有很多XSS的例子，可以作为反面教材或者测试工具： <a href="http://ha.ckers.org/xss.html">XSS (Cross Site Scripting) Cheat Sheet </a></p>
<h4>Update @ 2007-07-31</h4>
<p>SCRIPT_URI在cgi方式下或者在某些虚拟主机上无法使用：</p>
<blockquote><p>Notice: Undefined index: SCRIPT_URI in &#8230;&#8230;</p></blockquote>
<p>所以就只能用REQUEST_URI了：</p>
<blockquote><p>((isset($_SERVER["HTTPS"]) &amp;&amp; &#8216;on&#8217; == $_SERVER["HTTPS"]) ? &#8216;https://&#8217; : &#8216;http://&#8217;) . $_SERVER["HTTP_HOST"] . $_SERVER['REQUEST_URI'];</p></blockquote>
<h3  class="related_post_title">无相关文章，以下随机显示</h3><ul class="related_post"><li>2009年09月6号 -- <a href="http://ourapache.com/archives/306" title="网络流量尽在掌控">网络流量尽在掌控</a></li><li>2009年01月22号 -- <a href="http://ourapache.com/archives/66" title="Apache配置文件(httpd.conf)中文说明">Apache配置文件(httpd.conf)中文说明</a></li><li>2009年08月12号 -- <a href="http://ourapache.com/archives/268" title="Etag和Expires">Etag和Expires</a></li><li>2009年08月13号 -- <a href="http://ourapache.com/archives/270" title="Apache配置之URL重写">Apache配置之URL重写</a></li><li>2009年01月6号 -- <a href="http://ourapache.com/archives/25" title="Apache服务器使用.htaccess实现图片防盗链方法教程">Apache服务器使用.htaccess实现图片防盗链方法教程</a></li><li>2009年08月12号 -- <a href="http://ourapache.com/archives/265" title="关于apache的restart和stop, start的问题">关于apache的restart和stop, start的问题</a></li><li>2009年07月14号 -- <a href="http://ourapache.com/archives/263" title="初识HTTP中的Referer">初识HTTP中的Referer</a></li><li>2008年12月27号 -- <a href="http://ourapache.com/archives/11" title="apxs &#8211; Apache 扩展工具">apxs &#8211; Apache 扩展工具</a></li><li>2009年02月19号 -- <a href="http://ourapache.com/archives/151" title="IE环境下的安全警告汇总收藏">IE环境下的安全警告汇总收藏</a></li><li>2009年02月7号 -- <a href="http://ourapache.com/archives/85" title="apache之404错误页面">apache之404错误页面</a></li></ul>
	标签：<a href="http://ourapache.com/archives/category/http" title="HTTP相关知识" rel="tag">HTTP相关知识</a>, <a href="http://ourapache.com/archives/tag/php_self" title="PHP_SELF" rel="tag">PHP_SELF</a>, <a href="http://ourapache.com/archives/tag/xss" title="XSS" rel="tag">XSS</a><br />
<img src="http://feeds.feedburner.com/~r/ourapache/~4/NGVqEoZyjqM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://ourapache.com/archives/299/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://ourapache.com/archives/299</feedburner:origLink></item>
		<item>
		<title>HTTP Referer二三事</title>
		<link>http://feedproxy.google.com/~r/ourapache/~3/iO37DKWB2dk/294</link>
		<comments>http://ourapache.com/archives/294#comments</comments>
		<pubDate>Wed, 02 Sep 2009 05:29:10 +0000</pubDate>
		<dc:creator>OurApache</dc:creator>
				<category><![CDATA[HTTP相关知识]]></category>
		<category><![CDATA[Referer]]></category>

		<guid isPermaLink="false">http://www.ourapache.com/?p=294</guid>
		<description><![CDATA[简言之，HTTP Referer是header的一部分，当浏览器向web服务器发送请求的时候，一般会带上Referer，告诉服务器我是从哪个页面链接过来的，服务器籍此可以获得一些信息用于处理。比如从我主页上链接到一个朋友那里，他的服务器就能够从HTTP Referer中统计出每天有多少用户点击我主页上的链接访问他的网站。]]></description>
			<content:encoded><![CDATA[<h3>什么是HTTP <a href="http://ourapache.com/archives/tag/referer" class="st_tag internal_tag" rel="tag" title="标签 Referer 下的日志">Referer</a></h3>
<p>简言之，HTTP Referer是header的一部分，当浏览器向web服务器发送请求的时候，一般会带上Referer，告诉服务器我是从哪个页面链接过来的，服务器籍此可以获得一些信息用于处理。比如从我主页上链接到一个朋友那里，他的服务器就能够从HTTP Referer中统计出每天有多少用户点击我主页上的链接访问他的网站。</p>
<p>Referer其实应该是英文单词Referrer，不过拼错的人太多了，所以编写标准的人也就将错就错了。</p>
<h3>我的问题</h3>
<p>我刚刚把feed阅读器改变为<a href="http://gregarius.net/">Gregarius</a>，但他不像我以前用的liferea，访问新浪博客的时候，无法显示其中的图片，提示“此图片仅限于新浪博客用户交流与沟通”，我知道，这就是HTTP Referer导致的。</p>
<p>由于<a href="http://www.ourapache.com/wp-admin/294">我上网客户端配置的特殊性</a>，首先怀疑是squid的问题，但通过实验排除了，不过同时发现了一个<a href="http://wiki.noreply.org/noreply/TheOnionRouter/SquidProxy">Squid和Tor、Privoxy协同使用的隐私泄露问题</a>，留待以后研究。</p>
<h3>Gregarius能处理这个问题么？</h3>
<p><a href="http://forums.gregarius.net/comments.php?DiscussionID=448">答案是否定的</a>，因为Gregarius只是负责输出html代码，而对图像的访问是有客户端浏览器向服务器请求的。</p>
<p>不过，安装个firefox扩展也许能解决问题，文中推荐的”Send Referrer”我没有找到，但发现另外一个可用的：”<a href="https://addons.mozilla.org/en-US/firefox/addon/953">RefControl</a>“，可以根据访问网站的不同，控制使用不同的Referer。</p>
<p>但是我不喜欢用Firefox扩展来解决问题，因为我觉得他效率太低，所以我用更好的方式——Privoxy。</p>
<h3>Privoxy真棒</h3>
<p>在Privoxy的default.action中添加两行：</p>
<blockquote><p>{+hide-referrer{forge}}<br />
.album.sina.com.cn</p></blockquote>
<p>这样Gregarius中新浪博客的图片就出来了吧？+hide-referrer是Privoxy的一个过滤器，设置访问时对HTTP Referer的处理方式，后面的forge代表用访问地址当作Refere的，还可以换成block，代表取消Referer，或者直接把需要用的Referer网址写在这里。</p>
<p>用Privoxy比用Firefox简单的多，赶紧换吧。</p>
<h3>From https to http</h3>
<p>我还发现，从一个https页面上的链接访问到一个非加密的http页面的时候，在http页面上是检查不到HTTP Referer的，比如当我点击自己的https页面下面的w3c xhtml验证图标（网址为<a href="http://validator.w3.org/check?uri=referer">http://validator.w3.org/check?uri=referer</a>），从来都无法完成校验，提示：</p>
<blockquote><p>No Referer header found!</p></blockquote>
<p>原来，在<a href="http://www.ietf.org/rfc/rfc2616.txt">http协议的rfc文档</a>中有定义：</p>
<blockquote><p>15.1.3 Encoding Sensitive Information in URI&#8217;s</p>
<p>&#8230;</p>
<p>Clients SHOULD NOT include a Referer header field in a (non-secure)<br />
HTTP request if the referring page was transferred with a secure<br />
protocol.</p></blockquote>
<p>这样是出于安全的考虑，访问非加密页时，如果来源是加密页，客户端不发送Referer，<a href="http://support.microsoft.com/kb/178066">IE一直都是这样实现的</a>，<a href="http://kb.mozillazine.org/Network.http.sendSecureXSiteReferrer">Firefox浏览器也不例外</a>。但这并不影响从加密页到加密页的访问。</p>
<h3>Firefox中关于Referer的设置</h3>
<p>都在里，有两个键值：</p>
<ul>
<li>network.http.sendRefererHeader (default=2) 设置Referer的发送方式，0为完全不发送，1为只在点击链接时发送，在访问页面中的图像什么的时候不发送，2为始终发送。参见<a href="http://cafe.elharo.com/privacy/privacy-tip-3-block-referer-headers-in-firefox/">Privacy Tip #3: Block Referer Headers in Firefox</a></li>
<li>network.http.sendSecureXSiteReferrer (default=true) 设置从一个加密页访问到另外一个加密页的时候是否发送Referer，true为发送，false为不发送。</li>
</ul>
<h3>利用Referer防止图片盗链</h3>
<p>虽然Referer并不可靠，但用来防止图片盗链还是足够的，毕竟不是每个人都会修改客户端的配置。实现一般都是通过apache的配置文件，首先设置允许访问的地址，标记下来：</p>
<blockquote><p># 只允许来自domain.com的访问，图片可能就放置在domain.com网站的页面上<br />
SetEnvIfNoCase Referer “^http://www.domain.com/” local_ref<br />
# 直接通过地址访问<br />
SetEnvIf Referer “^$” local_ref</p></blockquote>
<p>然后再规定被标记了的访问才被允许：</p>
<blockquote><p>&lt;FilesMatch “.(gif|jpg)”&gt;<br />
Order Allow,Deny<br />
Allow from env=local_ref<br />
&lt;/FilesMatch&gt;</p></blockquote>
<p>或者</p>
<blockquote><p>&lt;Directory /web/images&gt;<br />
Order Deny,Allow<br />
Deny from all<br />
Allow from env=local_ref<br />
&lt;/Directory&gt;</p></blockquote>
<p>这方面的文章网上很多，参考：</p>
<ul>
<li><a href="http://leftleg.hzpub.com/read.php?405">Apache 下防止盗链的解决办法</a></li>
<li><a href="http://blog.51766.com/page/zsc?entry=1144852732034">Apache的环境变量设置</a></li>
<li><a href="http://blog.soueasy.net/post/80.htm">配置 Apache 实现禁止图片盗链</a></li>
</ul>
<h3>不要使用Rerferer的地方</h3>
<p>不要把Rerferer用在身份验证或者其他非常重要的检查上，因为Rerferer非常容易在客户端被改变，不管是通过上面介绍的Firefox扩展，或者是Privoxy，甚至是libcurl的调用，所以Rerferer数据非常之不可信。</p>
<p>如果你想限制用户必须从某个入口页面访问的话，与其使用Referer，不如使用session，在入口页面写入session，然后在其他页面检查，如果用户没有访问过入口页面，那么对应的session就不存在，参见<a href="http://www.thescripts.com/forum/thread3090.html">这里的讨论</a>。不过和上面说的一样，也不要过于相信这种方式的“验证”结果。</p>
<p>个人感觉现在Rerferer除了用在防盗链，其他用途最多的就是访问统计，比如统计用户都是从哪里的链接访问过来的等等。</p>
<h3  class="related_post_title">相关文章</h3><ul class="related_post"><li>2009年07月14号 -- <a href="http://ourapache.com/archives/263" title="初识HTTP中的Referer">初识HTTP中的Referer</a></li></ul>
	标签：<a href="http://ourapache.com/archives/category/http" title="HTTP相关知识" rel="tag">HTTP相关知识</a>, <a href="http://ourapache.com/archives/tag/referer" title="Referer" rel="tag">Referer</a><br />
<img src="http://feeds.feedburner.com/~r/ourapache/~4/iO37DKWB2dk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://ourapache.com/archives/294/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://ourapache.com/archives/294</feedburner:origLink></item>
		<item>
		<title>Apache两种运行方式比较:Standalone和inetd</title>
		<link>http://feedproxy.google.com/~r/ourapache/~3/Tha-EzECtnI/292</link>
		<comments>http://ourapache.com/archives/292#comments</comments>
		<pubDate>Sun, 16 Aug 2009 14:33:57 +0000</pubDate>
		<dc:creator>OurApache</dc:creator>
				<category><![CDATA[Apache基础知识]]></category>
		<category><![CDATA[inetd]]></category>
		<category><![CDATA[Standalone]]></category>

		<guid isPermaLink="false">http://www.ourapache.com/?p=292</guid>
		<description><![CDATA[standalone模式表示Apache进程以一个单独的守护进程方式在后台监听是否有客户端的请求，如果有则生成一个子进程来为其服务。在 standalone模式下，apache进程一次性启动，运行期间一直驻留在内存中，尽管损耗了一定的系统资源，但接入信号反应快；而且子httpd进 程在http请求完毕后并没有直接断掉，这样就可以重新用来接受新的http请求，请参考apache的keepalive指令（请看这里）。由于不存在对每个请求都启动新的apache根进程，所以它的效率更高。
inetd模式表示Apache服务不是以一个单独的守候进程的形式支持。而是由Inetd这个超级守候进程进行代劳，当它监听一个客户端的http请求 的时候，再启动一个httpd进程为其服务。一个由inted运行的服务器进程在它结束对请求服务的同时立刻退出，虽然不占用了系统资源，但是也由此不适 合应用在同时连接数量较多的系统。因为如果请求完毕后就结束httpd进程，会使服务器负担加重。]]></description>
			<content:encoded><![CDATA[<p>那天和大家分享了<a href="http://www.ourapache.com/archives/288" target="_blank">Apache常见两种工作模式</a>的对比。今天和大家分享下Apache的两种运行方式(Standalone和inetd)的比较。</p>
<p><strong>standalone模式</strong>表示Apache进程以一个单独的守护进程方式在后台监听是否有客户端的请求，如果有则生成一个子进程来为其服务。在 standalone模式下，apache进程一次性启动，运行期间一直驻留在内存中，尽管损耗了一定的系统资源，但接入信号反应快；而且子httpd进 程在http请求完毕后并没有直接断掉，这样就可以重新用来接受新的http请求，请参考apache的keepalive指令（<a href="http://www.ourapache.com/archives/tag/keepalive" target="_blank">请看这里</a>）。由于不存在对每个请求都启动新的apache根进程，所以它的效率更高。</p>
<p><strong>inetd模式</strong>表示Apache服务不是以一个单独的守候进程的形式支持。而是由Inetd这个超级守候进程进行代劳，当它监听一个客户端的http请求 的时候，再启动一个httpd进程为其服务。一个由inted运行的服务器进程在它结束对请求服务的同时立刻退出，虽然不占用了系统资源，但是也由此不适 合应用在同时连接数量较多的系统。因为如果请求完毕后就结束httpd进程，会使服务器负担加重。</p>
<p>具体使用如下：</p>
<p><strong>standalone模式</strong></p>
<p>此种模式下，Apache服务器监听特定端口的连接请求。当用户发起特定端口地址的连接请求时，主服务器进程启动子httpd进程来响应该请求。</p>
<p>这样还需要告诉主服务器进程侦听的特定端口地址，使用命令：</p>
<blockquote><p>Port [number] （缺省值为80）</p></blockquote>
<p><strong>inetd模式</strong></p>
<p>inetd是监听所有小于1024的端口连接请求的Internet守护进程(一个服务器进程)。与standalone模式不同，当客户系统发出到Apache服务器的连接请求时，inetd启动一个httpd进程，由此进程服务此请求，完成服务后即退出。</p>
<p>如果选择通过inetd服务器来运行Apache，需要编辑/etc/<a href="http://ourapache.com/archives/tag/inetd" class="st_tag internal_tag" rel="tag" title="标签 inetd 下的日志">inetd</a>.conf文件为Apache添加一条新的记录：</p>
<blockquote><p>httpd stream tcp nowait httpd /etc/httpd/bin/httpd –f /etc/httpd/conf/httpd.conf</p></blockquote>
<p>修改了/etc/inetd.conf文件后，就需要修改/etc/services中添加一行</p>
<blockquote><p>httpd 80/tcp httpd</p></blockquote>
<p>做完以上修改后，需要重新启动inetd进程。首先，使用以下命令取得inetd的进程ID：</p>
<blockquote><p>ps auxw | grep inetd</p></blockquote>
<p>然后执行命令：kill -HUP pid</p>
<h3  class="related_post_title">无相关文章，以下随机显示</h3><ul class="related_post"><li>2009年02月27号 -- <a href="http://ourapache.com/archives/187" title="header中的Cache-control参数说明">header中的Cache-control参数说明</a></li><li>2009年02月10号 -- <a href="http://ourapache.com/archives/123" title="Apache高级配置中文详解">Apache高级配置中文详解</a></li><li>2009年01月22号 -- <a href="http://ourapache.com/archives/64" title="Apache连接数设置prefork">Apache连接数设置prefork</a></li><li>2009年06月15号 -- <a href="http://ourapache.com/archives/259" title="16个简单实用的.htaccess小贴示">16个简单实用的.htaccess小贴示</a></li><li>2009年02月12号 -- <a href="http://ourapache.com/archives/134" title="泛域名与mod_rewrite">泛域名与mod_rewrite</a></li><li>2009年03月30号 -- <a href="http://ourapache.com/archives/232" title="Apache Prefork和Worker模式的性能比较测试">Apache Prefork和Worker模式的性能比较测试</a></li><li>2009年03月9号 -- <a href="http://ourapache.com/archives/222" title="Apache 2.0中prefork.c模块和worker.c模块的比较">Apache 2.0中prefork.c模块和worker.c模块的比较</a></li><li>2009年05月8号 -- <a href="http://ourapache.com/archives/245" title="用apache实现禁止IP段或者主机对某个目录的访问">用apache实现禁止IP段或者主机对某个目录的访问</a></li><li>2009年02月6号 -- <a href="http://ourapache.com/archives/82" title="YouTube 架构学习">YouTube 架构学习</a></li><li>2009年01月6号 -- <a href="http://ourapache.com/archives/25" title="Apache服务器使用.htaccess实现图片防盗链方法教程">Apache服务器使用.htaccess实现图片防盗链方法教程</a></li></ul>
	标签：<a href="http://ourapache.com/archives/category/basic" title="Apache基础知识" rel="tag">Apache基础知识</a>, <a href="http://ourapache.com/archives/tag/inetd" title="inetd" rel="tag">inetd</a>, <a href="http://ourapache.com/archives/tag/standalone" title="Standalone" rel="tag">Standalone</a><br />
<img src="http://feeds.feedburner.com/~r/ourapache/~4/Tha-EzECtnI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://ourapache.com/archives/292/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://ourapache.com/archives/292</feedburner:origLink></item>
		<item>
		<title>Apache两种常用工作模式比较:prefork和worker</title>
		<link>http://feedproxy.google.com/~r/ourapache/~3/7mi22_MtKeg/288</link>
		<comments>http://ourapache.com/archives/288#comments</comments>
		<pubDate>Sun, 16 Aug 2009 14:21:06 +0000</pubDate>
		<dc:creator>OurApache</dc:creator>
				<category><![CDATA[Apache基础知识]]></category>
		<category><![CDATA[prefork]]></category>
		<category><![CDATA[worker]]></category>

		<guid isPermaLink="false">http://www.ourapache.com/?p=288</guid>
		<description><![CDATA[在这里我就prefork和worker两种最为常用的工作模式进行比较：

prefork–Unix平台上的默认（缺省）MPM，使用多个子进程，每个子进程只有一个线程。每个进程在某个确定的时间只能维持一个连接，效率高，但内存占用量比较大。

worker–使用多个子进程，每个子进程有多个线程，每个线程在某个确定的时间只能维持一个连接，内存占用量比较小，适合高流量的http服务器。缺点是假如一个线程崩溃，整个进程就会连同其任何线程一起”死掉”，所以要保证一个程式在运行时必须被系统识别为”每 个线程都是安全的”。]]></description>
			<content:encoded><![CDATA[<p>以前一直在用Apache，却也一直不知道它有那么多的工作模式，看了手册才知道，囧！</p>
<p>在这里我就prefork和worker两种最为常用的工作模式进行比较：</p>
<p><a href="http://ourapache.com/archives/tag/prefork" class="st_tag internal_tag" rel="tag" title="标签 prefork 下的日志">prefork</a>–Unix平台上的默认（缺省）MPM，使用多个子进程，每个子进程只有一个线程。每个进程在某个确定的时间只能维持一个连接，效率高，但内存占用量比较大。</p>
<p><a href="http://ourapache.com/archives/tag/worker" class="st_tag internal_tag" rel="tag" title="标签 worker 下的日志">worker</a>–使用多个子进程，每个子进程有多个线程，每个线程在某个确定的时间只能维持一个连接，内存占用量比较小，适合高流量的http服务器。缺点是假如一个线程崩溃，整个进程就会连同其任何线程一起”死掉”，所以要保证一个程式在运行时必须被系统识别为”每 个线程都是安全的”。</p>
<p>了解了这些个之后，怎么才能知道你的Apache服务器工作在什么状态呢？使用“apachectl -l”命令就可以显示出来。</p>
<p>Apache的默认的工作模式为prefork，如何把它改成worker模式呢？</p>
<p>如果你还未编译安装，那就简单了，在编译的时候加个参数 “–with-mpm=worker”，就好了；</p>
<p>如果你想更改正在运行的Apache的工作模式：</p>
<p>1.将当前的prefork模式启动文件改名</p>
<blockquote><p>mv httpd httpd.prefork</p></blockquote>
<p>2.将worker模式的启动文件改名</p>
<blockquote><p>mv httpd.worker httpd</p></blockquote>
<p>3.修改Apache配置文件</p>
<blockquote><p>vi /usr/local/apache2/conf/extra/httpd-mpm.conf</p></blockquote>
<p>找到里边的如下一段，可适当修改负载等参数：</p>
<blockquote><p>StartServers 2<br />
MaxClients 150<br />
MinSpareThreads 25<br />
MaxSpareThreads 75<br />
ThreadsPerChild 25<br />
MaxRequestsPerChild 0</p></blockquote>
<p>4.重新启动服务</p>
<blockquote><p>/usr/local/apache2/bin/apachectl restart</p></blockquote>
<p>PS：处于稳定性和安全性考虑，在真正的生产环境，请勿轻易改变其工作模式。</p>
<h3  class="related_post_title">相关文章</h3><ul class="related_post"><li>2009年03月30号 -- <a href="http://ourapache.com/archives/234" title="Apache的prefork模式和worker模式">Apache的prefork模式和worker模式</a></li><li>2009年03月30号 -- <a href="http://ourapache.com/archives/232" title="Apache Prefork和Worker模式的性能比较测试">Apache Prefork和Worker模式的性能比较测试</a></li><li>2009年03月9号 -- <a href="http://ourapache.com/archives/222" title="Apache 2.0中prefork.c模块和worker.c模块的比较">Apache 2.0中prefork.c模块和worker.c模块的比较</a></li><li>2009年03月30号 -- <a href="http://ourapache.com/archives/229" title="对Apache中并发控制参数prefork理解和调优">对Apache中并发控制参数prefork理解和调优</a></li><li>2009年01月22号 -- <a href="http://ourapache.com/archives/64" title="Apache连接数设置prefork">Apache连接数设置prefork</a></li><li>2009年01月22号 -- <a href="http://ourapache.com/archives/62" title="对apache中并发控制参数prefork理解和调优">对apache中并发控制参数prefork理解和调优</a></li></ul>
	标签：<a href="http://ourapache.com/archives/category/basic" title="Apache基础知识" rel="tag">Apache基础知识</a>, <a href="http://ourapache.com/archives/tag/prefork" title="prefork" rel="tag">prefork</a>, <a href="http://ourapache.com/archives/tag/worker" title="worker" rel="tag">worker</a><br />
<img src="http://feeds.feedburner.com/~r/ourapache/~4/7mi22_MtKeg" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://ourapache.com/archives/288/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://ourapache.com/archives/288</feedburner:origLink></item>
		<item>
		<title>linux下查看nginx，apache，mysql，php的编译参数</title>
		<link>http://feedproxy.google.com/~r/ourapache/~3/vhgoyXes2bg/286</link>
		<comments>http://ourapache.com/archives/286#comments</comments>
		<pubDate>Thu, 13 Aug 2009 15:57:00 +0000</pubDate>
		<dc:creator>OurApache</dc:creator>
				<category><![CDATA[Apache基础知识]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[编译]]></category>

		<guid isPermaLink="false">http://www.ourapache.com/?p=286</guid>
		<description><![CDATA[有时候nginx，apache，mysql，php编译完了想看看编译参数可以用以下方法]]></description>
			<content:encoded><![CDATA[<p>有时候nginx，apache，<a href="http://ourapache.com/archives/tag/mysql" class="st_tag internal_tag" rel="tag" title="标签 mysql 下的日志">mysql</a>，php编译完了想看看编译参数可以用以下方法</p>
<p><strong>nginx编译参数：</strong></p>
<blockquote><p>#/usr/local/<a href="http://ourapache.com/archives/tag/nginx" class="st_tag internal_tag" rel="tag" title="标签 nginx 下的日志">nginx</a>/sbin/<a href="http://ourapache.com/archives/tag/nginx" class="st_tag internal_tag" rel="tag" title="标签 nginx 下的日志">nginx</a> -V<br />
nginx version: nginx/0.6.32</p>
<p>built by gcc 4.1.2 20071124 (Red Hat 4.1.2-42)</p>
<p>configure arguments: &#8211;user=www &#8211;group=www &#8211;prefix=/usr/local/nginx/ &#8211;with-http_stub_status_module &#8211;with-openssl=/usr/local/openssl</p></blockquote>
<p><strong>apache编译参数：</strong></p>
<blockquote><p># cat /usr/local/apache2/build/config.nice<br />
#! /bin/sh</p>
<p>#</p>
<p># Created by configure</p>
<p>“./configure” \</p>
<p>“&#8211;prefix=/usr/local/apache2&#8243; \</p>
<p>“&#8211;with-included-apr” \</p>
<p>“&#8211;enable-so” \</p>
<p>“&#8211;enable-deflate=shared” \</p>
<p>“&#8211;enable-expires=shared” \</p>
<p>“&#8211;enable-rewrite=shared” \</p>
<p>“&#8211;enable-static-support” \</p>
<p>“&#8211;disable-userdir” \</p>
<p>“$@”</p></blockquote>
<p><strong>php编译参数：</strong></p>
<blockquote><p># /usr/local/<a href="http://ourapache.com/archives/tag/php" class="st_tag internal_tag" rel="tag" title="标签 php 下的日志">php</a>/bin/<a href="http://ourapache.com/archives/tag/php" class="st_tag internal_tag" rel="tag" title="标签 php 下的日志">php</a> -i |grep configure</p>
<p>Configure Command =&gt; &#8216;./configure&#8217; &#8216;&#8211;prefix=/usr/local/php&#8217; &#8216;&#8211;with-apxs2=/usr/local/apache2/bin/apxs&#8217; &#8216;&#8211;with-config-file-path=/usr/local/php/etc&#8217; &#8216;&#8211;with-mysql=/usr/local/mysql&#8217; &#8216;&#8211;with-libxml-dir=/usr/local/libxml2/bin&#8217; &#8216;&#8211;with-gd=/usr/local/gd2&#8242; &#8216;&#8211;with-jpeg-dir&#8217; &#8216;&#8211;with-png-dir&#8217; &#8216;&#8211;with-bz2&#8242; &#8216;&#8211;with-xmlrpc&#8217; &#8216;&#8211;with-freetype-dir&#8217; &#8216;&#8211;with-zlib-dir&#8217;</p></blockquote>
<p><strong>mysql编译参数：</strong></p>
<blockquote><p># cat “/usr/local/mysql/bin/mysqlbug”|grep configure</p>
<p># This is set by configure</p>
<p>CONFIGURE_LINE=”./configure &#8216;&#8211;prefix=/usr/local/mysql&#8217; &#8216;&#8211;localstatedir=/var/lib/mysql&#8217; &#8216;&#8211;with-comment=Source&#8217; &#8216;&#8211;with-server-suffix=-H863&#8242; &#8216;&#8211;with-mysqld-user=mysql&#8217; &#8216;&#8211;without-debug&#8217; &#8216;&#8211;with-big-tables&#8217; &#8216;&#8211;with-charset=gbk&#8217; &#8216;&#8211;with-collation=gbk_chinese_ci&#8217; &#8216;&#8211;with-extra-charsets=all&#8217; &#8216;&#8211;with-pthread&#8217; &#8216;&#8211;enable-static&#8217; &#8216;&#8211;enable-thread-safe-client&#8217; &#8216;&#8211;with-client-ldflags=-all-static&#8217; &#8216;&#8211;with-mysqld-ldflags=-all-static&#8217; &#8216;&#8211;enable-assembler&#8217; &#8216;&#8211;without-isam&#8217; &#8216;&#8211;without-innodb&#8217; &#8216;&#8211;without-ndb-debug&#8217;”</p></blockquote>
<h3  class="related_post_title">相关文章</h3><ul class="related_post"><li>2009年01月6号 -- <a href="http://ourapache.com/archives/27" title="php+mysql+apache编码深度解析">php+mysql+apache编码深度解析</a></li><li>2009年06月7号 -- <a href="http://ourapache.com/archives/251" title="apxs是Apache编译和安装扩展模块的工具">apxs是Apache编译和安装扩展模块的工具</a></li><li>2009年02月17号 -- <a href="http://ourapache.com/archives/142" title="在64位机器上关于Apache 2.2.3版的编译问题">在64位机器上关于Apache 2.2.3版的编译问题</a></li><li>2009年01月5号 -- <a href="http://ourapache.com/archives/19" title="重大漏洞, 让Apache上传不安全-php.rar">重大漏洞, 让Apache上传不安全-php.rar</a></li><li>2008年12月27号 -- <a href="http://ourapache.com/archives/13" title="单独编译apache的rewrite模块">单独编译apache的rewrite模块</a></li></ul>
	标签：<a href="http://ourapache.com/archives/category/basic" title="Apache基础知识" rel="tag">Apache基础知识</a>, <a href="http://ourapache.com/archives/tag/mysql" title="mysql" rel="tag">mysql</a>, <a href="http://ourapache.com/archives/tag/nginx" title="nginx" rel="tag">nginx</a>, <a href="http://ourapache.com/archives/tag/php" title="php" rel="tag">php</a>, <a href="http://ourapache.com/archives/tag/%e7%bc%96%e8%af%91" title="编译" rel="tag">编译</a><br />
<img src="http://feeds.feedburner.com/~r/ourapache/~4/vhgoyXes2bg" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://ourapache.com/archives/286/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://ourapache.com/archives/286</feedburner:origLink></item>
		<item>
		<title>Apache负载均衡设置方法: mod_proxy</title>
		<link>http://feedproxy.google.com/~r/ourapache/~3/cpMI4qNnZew/284</link>
		<comments>http://ourapache.com/archives/284#comments</comments>
		<pubDate>Thu, 13 Aug 2009 15:50:59 +0000</pubDate>
		<dc:creator>OurApache</dc:creator>
				<category><![CDATA[Apache高级应用]]></category>
		<category><![CDATA[mod_proxy]]></category>

		<guid isPermaLink="false">http://www.ourapache.com/?p=284</guid>
		<description><![CDATA[　　第一次看到这个标题时我也很惊讶，Apache居然还能做负载均衡?真是太强大了。经过一番调查后发现的确可以，而且功能一点都不差。这都归功于 mod_proxy 这个模块。不愧是强大的Apache啊。]]></description>
			<content:encoded><![CDATA[<p>　　第一次看到这个标题时我也很惊讶，Apache居然还能做负载均衡?真是太强大了。经过一番调查后发现的确可以，而且功能一点都不差。这都归功于 <a href="http://ourapache.com/archives/tag/mod_proxy" class="st_tag internal_tag" rel="tag" title="标签 mod_proxy 下的日志">mod_proxy</a> 这个模块。不愧是强大的Apache啊。</p>
<p>　　废话少说，下面就来解释一下负载均衡的设置方法。</p>
<p>　　一般来说，负载均衡就是将客户端的请求分流给后端的各个真实服务器，达到负载均衡的目的。还有一种方式是用两台服务器，一台作为主服务器(Master)，另一台作为热备份(Hot Standby)，请求全部分给主服务器，在主服务器当机时，立即切换到备份服务器，以提高系统的整体可靠性。</p>
<p>　　负载均衡的设置</p>
<p>　　Apache可以应对上面这两种需求。先来讨论一下如何做负载均衡。首先需要启用Apache的几个模块：</p>
<p>　　程序代码</p>
<blockquote><p>　 LoadModule proxy_module modules/mod_proxy.so<br />
　　LoadModule proxy_balancer_module modules/mod_proxy_balancer.so<br />
　　LoadModule proxy_http_module modules/mod_proxy_http.so</p></blockquote>
<p>　　mod_proxy提供代理服务器功能，mod_proxy_balancer提供负载均衡功能， mod_proxy_http让代理服务器能支持HTTP协议。如果把mod_proxy_http换成其他协议模块(如mod_proxy_ftp)，或许能支持其他协议的负载均衡，有兴趣的朋友可以自己尝试一下。</p>
<p>　　然后要添加以下配置：</p>
<p>　　程序代码</p>
<blockquote><p>ProxyRequests Off<br />
　　<br />
　　BalancerMember http://node-a.myserver.com:8080<br />
　　BalancerMember http://node-b.myserver.com:8080<br />
　　 　　ProxyPass / balancer://mycluster<br />
　　# 警告：以下这段配置仅用于调试，绝不要添加到生产环境中!!!<br />
　　<br />
　　SetHandler balancer-manager<br />
　　order Deny,Allow<br />
　　Deny from all<br />
　　Allow from localhost<br />
　　</p></blockquote>
<p>　　从上面的 ProxyRequests Off 这条可以看出，实际上负载均衡器就是一个反向代理，只不过它的代理转发地址不是某台具体的服务器，而是一个 balancer:// 协议：</p>
<p>　　ProxyPass / balancer://mycluster协议地址可以随便定义。然后，在段中设置该balancer协议的内容即可。 BalancerMember指令可以添加负载均衡组中的真实服务器地址。</p>
<p>　　下面那段是用来监视负载均衡的工作情况的，调试时可以加上(生产环境中禁止使用!)，然后访问 http://localhost/balancer-manager/ 即可看到负载均衡的工作状况。</p>
<p>　　OK，改完之后重启服务器，访问你的Apache所在服务器的地址，即可看到负载均衡的效果了。打开 balancer-manager 的界面，可以看到请求是平均分配的。</p>
<p>　　如果不想平均分配怎么办?给 BalancerMember 加上 loadfactor 参数即可，取值范围为1-100。比如你有三台服务器，负载分配比例为 7:2:1，只需这样设置：</p>
<p>　　程序代码</p>
<blockquote><p>　 ProxyRequests Off<br />
　　<br />
　　BalancerMember http://node-a.myserver.com:8080 loadfactor=7<br />
　　BalancerMember http://node-b.myserver.com:8080 loadfactor=2<br />
　　BalancerMember http://node-c.myserver.com:8080 loadfactor=1<br />
　　 　　ProxyPass / balancer://mycluster</p></blockquote>
<p>　　默认情况下，负载均衡会尽量让各个服务器接受的请求次数满足预设的比例。如果要改变算法，可以使用 lbmethod 属性。如：</p>
<p>　　程序代码</p>
<blockquote><p>　ProxyRequests Off<br />
　　<br />
　　BalancerMember http://node-a.myserver.com:8080 loadfactor=7<br />
　　BalancerMember http://node-b.myserver.com:8080 loadfactor=2<br />
　　BalancerMember http://node-c.myserver.com:8080 loadfactor=1<br />
　　 　　ProxyPass / balancer://mycluster<br />
　　ProxySet lbmethod=bytraffic</p></blockquote>
<p>　　lbmethod可能的取值有：</p>
<p>　　lbmethod=byrequests 按照请求次数均衡(默认)</p>
<p>　　lbmethod=bytraffic 按照流量均衡</p>
<p>　　lbmethod=bybusyness 按照繁忙程度均衡(总是分配给活跃请求数最少的服务器)</p>
<p>　　各种算法的原理请参见[url=http://httpd.apache.org/docs/2.2/en/mod/mod_proxy_balancer.html]Apache的文档[/url]。</p>
<p>　　热备份(Hot Standby)</p>
<p>　　热备份的实现很简单，只需添加 status=+H 属性，就可以把某台服务器指定为备份服务器：</p>
<p>　　程序代码</p>
<blockquote><p>　ProxyRequests Off<br />
　　<br />
　　BalancerMember http://node-a.myserver.com:8080<br />
　　BalancerMember http://node-b.myserver.com:8080 status=+H<br />
　　 　　ProxyPass / balancer://mycluster</p></blockquote>
<p>　　从 balancer-manager 界面中可以看到，请求总是流向 node-a ，一旦node-a挂掉， Apache会检测到错误并把请求分流给 node-b。Apache会每隔几分钟检测一下 node-a 的状况，如果node-a恢复，就继续使用node-a。</p>
<h3  class="related_post_title">无相关文章，以下随机显示</h3><ul class="related_post"><li>2009年08月13号 -- <a href="http://ourapache.com/archives/275" title="Apache+Django性能优化之mod_wsgi篇">Apache+Django性能优化之mod_wsgi篇</a></li><li>2009年07月14号 -- <a href="http://ourapache.com/archives/263" title="初识HTTP中的Referer">初识HTTP中的Referer</a></li><li>2009年12月12号 -- <a href="http://ourapache.com/archives/314" title="使用Apache做负载均衡">使用Apache做负载均衡</a></li><li>2009年02月7号 -- <a href="http://ourapache.com/archives/94" title="使用gzip压缩来压缩网页之apache的相关配置">使用gzip压缩来压缩网页之apache的相关配置</a></li><li>2008年12月27号 -- <a href="http://ourapache.com/archives/13" title="单独编译apache的rewrite模块">单独编译apache的rewrite模块</a></li><li>2009年06月1号 -- <a href="http://ourapache.com/archives/243" title="玩转apache之日志">玩转apache之日志</a></li><li>2009年02月27号 -- <a href="http://ourapache.com/archives/200" title="header常用指令">header常用指令</a></li><li>2009年02月25号 -- <a href="http://ourapache.com/archives/170" title="Apache 两种虚拟主机方式的区别">Apache 两种虚拟主机方式的区别</a></li><li>2010年03月9号 -- <a href="http://ourapache.com/archives/318" title="Apache2中俩种设置PHP的异同">Apache2中俩种设置PHP的异同</a></li><li>2009年09月2号 -- <a href="http://ourapache.com/archives/294" title="HTTP Referer二三事">HTTP Referer二三事</a></li></ul>
	标签：<a href="http://ourapache.com/archives/category/advanced" title="Apache高级应用" rel="tag">Apache高级应用</a>, <a href="http://ourapache.com/archives/tag/mod_proxy" title="mod_proxy" rel="tag">mod_proxy</a><br />
<img src="http://feeds.feedburner.com/~r/ourapache/~4/cpMI4qNnZew" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://ourapache.com/archives/284/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://ourapache.com/archives/284</feedburner:origLink></item>
		<item>
		<title>Linux下Apache并发连接数和带宽控制</title>
		<link>http://feedproxy.google.com/~r/ourapache/~3/C-I4_VkfSx0/281</link>
		<comments>http://ourapache.com/archives/281#comments</comments>
		<pubDate>Thu, 13 Aug 2009 10:13:57 +0000</pubDate>
		<dc:creator>OurApache</dc:creator>
				<category><![CDATA[Apache高级应用]]></category>
		<category><![CDATA[mod_bandwidth]]></category>
		<category><![CDATA[mod_limitipconn]]></category>
		<category><![CDATA[带宽]]></category>
		<category><![CDATA[并发连接数]]></category>

		<guid isPermaLink="false">http://www.ourapache.com/?p=281</guid>
		<description><![CDATA[　　Linux+Apache的稳定性、安全性和性能以及低廉的价格正在赢得越来越多的市场份额，使 用Linux+Apache作网站服务器的朋友也越来越多，而Apache作为一种http服务，相比FTP总是不容易控制，特别是当网站以http方式 提供软件/音乐下载时，若是每个用户都开启多个线程并没有带宽的限制，将很快达到http的最大连接数或者造成网络壅塞，使得网站的许多正常服务都无法运 行。不过，Apache的使用者们早已开发出了mod_limitipconn和mod_bandwidth两个模块，来控制http的并发连接数和用户 所能够使用的带宽，下面将以RedHat Linux 7.3+Apache 1.3.7来说明它们的使用方法。]]></description>
			<content:encoded><![CDATA[<p>　　Linux+Apache的稳定性、安全性和性能以及低廉的价格正在赢得越来越多的市场份额，使 用Linux+Apache作网站服务器的朋友也越来越多，而Apache作为一种http服务，相比FTP总是不容易控制，特别是当网站以http方式 提供软件/音乐下载时，若是每个用户都开启多个线程并没有带宽的限制，将很快达到http的最大连接数或者造成网络壅塞，使得网站的许多正常服务都无法运 行。不过，Apache的使用者们早已开发出了mod_limitipconn和mod_bandwidth两个模块，来控制http的并发连接数和用户 所能够使用的带宽，下面将以RedHat Linux 7.3+Apache 1.3.7来说明它们的使用方法。</p>
<p><strong> 一、使用mod_limitipconn限制Apache的并发连接数</strong></p>
<p>　　mod_limitipconn可以控制每个IP地址同时连接服务器某一个目录的并发连接数，是一个非常有用的模块，其官方网页是 http://dominia.org/djao/limitipconn.html，最新版本为for Apache 1.3.7的0.04，并且还有支持Apache 2.x的模块下载，由于本人使用Apache 1.3.7版本，所以请使用2.x版本Apache的朋友到其官方网站察看具体的使用方法。</p>
<p>　　<a href="http://ourapache.com/archives/tag/mod_limitipconn" class="st_tag internal_tag" rel="tag" title="标签 mod_limitipconn 下的日志">mod_limitipconn</a> for Apache 1.3x提供三种安装方式，分别是tar包、rpm安装文件和rpm源文件，由于rpm包只能用在 RedHat 7.x 版本，并且不支持检测代理服务器，所以我们一般都使用tar包的安装方式。</p>
<p>　　以管理员方式登陆服务器，然后在服务器上运行 wget http://dominia.org/djao/limit/mod_limitipconn-0.04.tar.gz 将mod_limitipconn的tar包下载到服务器，然后按照再运行tar zxvf mod_limitipconn-0.04.tar.gz将tar包解压缩，会在当前目录下生成mod_limitipconn-0.04<a href="http://ourapache.com/archives/tag/%e7%9b%ae%e5%bd%95" class="st_tag internal_tag" rel="tag" title="标签 目录 下的日志">目录</a>，然后cd mod_limitipconn-0.04进入此目录，下一步就是使用apxs将目录中的mod_limitipconn.c编译。这时，我们需要确定自 己的Apache安装在那个目录，并且找到apxs命令放在哪里。</p>
<p>　　通过命令whereis apxs，我们可以确定apxs命令的路径，如我的apxs命令所在为/usr/sbin/apxs，则输入/usr/sbin/apxs -c -i -a mod_limitipconn.c对mod_limitipconn.c进行编译，此命令会自动在你Apache的配置文件httpd.conf中加入 需要的信息，并且将生成的mod_limitipconn.so模块拷贝到Apache的模块目录。不过为了确认此命令是否正常运作，请首先检查自己的 Apache模块目录（我的是/usr/lib/apache），看内部是否含有mod_limitipconn.so文件，没有的话请将 mod_limitipconn-0.04目录中生成的文件拷贝到此处。</p>
<p>　　刚才命令自动生成的httpd.conf可能有些错误，在我的系统中，它将LoadModule limitipconn_module modules/mod_limitipconn.so放在了</p>
<blockquote><p>LoadModule python_module modules/mod_python.so</p></blockquote>
<p>之间，而将AddModule mod_limitipconn.c放在了</p>
<blockquote><p>AddModule mod_python.c</p></blockquote>
<p>之间，直接造成了mod_limitipconn模块不能正常运行，所以请将这两行分别移动到没 有的相应行中，然后请确认mod_status模块已经加载，并且在 mod_status下添加了ExtendedStatus On这一行。这时我们的mod_limitipconn模块就安装完毕，下一步就是对某个目录进行并发连接数的设置了。</p>
<p>　　mod_limitipconn可以对全局和虚拟主机进行不同的限制，其语法结构都是</p>
<blockquote><p>#所限制的目录所在，此处表示主机的根目录<br />
MaxConnPerIP 3 #所限制的每个IP并发连接数为3个<br />
NoIPLimit image/* #对图片不做IP限制</p>
<p>#所限制的目录所在，此处表示主机的/mp3目录<br />
MaxConnPerIP 1 #所限制的每个IP并发连接数为1个<br />
OnlyIPLimit audio/mpeg video #该限制只对视频和音频格式的文件</p></blockquote>
<p>　　当对全局进行限制时，将这段代码放在httpd.conf文件没有VirtualHost的地方，若是对某个虚拟主机进行限制，请将其放 在和之间，我们可以通过更改Location以及 MaxConnPerIP方便的控制所限制的目录和并发连接数。</p>
<p>　　最后，只要重新启动Apache服务，并发连接数的限制就可以生效。</p>
<p><strong>二、使用mod_bandwidth控制Apache的带宽</strong></p>
<p>　　Apache 1.3.7实际上带有mod_bandwidth支持，只是没有此模块的so文件，我们所做的就是下载mod_bandwidth的源文件进行编译，并对mod_bandwidth进行相应的设置。</p>
<p>　　在下载之前，请先确认自己的Apache配置文件httpd.conf中是否含有</p>
<blockquote><p>LoadModule bandwidth_module modules/<a href="http://ourapache.com/archives/tag/mod_bandwidth" class="st_tag internal_tag" rel="tag" title="标签 mod_bandwidth 下的日志">mod_bandwidth</a>.so</p></blockquote>
<p>以及</p>
<blockquote><p>AddModule mod_bandwidth.c</p></blockquote>
<p>若是没有，请加上</p>
<blockquote><p>LoadModule bandwidth_module<br />
libexec/apache/mod_bandwidth.so<br />
AddModule mod_bandwidth.c</p></blockquote>
<p>　　并且这两行必须分别加在相应区域的最前面，使得这个模块以最低的优先级运行。（不过1.3.7的Apache应该有，呵呵）。</p>
<p>　　确认后，请输入 wget ftp://ftp.cohprog.com/pub/apache/module/1.3.0/mod_bandwidth.c 将源文件下载到服务器，然后请使用apxs对其进行编译，编译方法和mod_limitipconn的基本相同，如我输入/usr/sbin/apxs -c mod_bandwidth.c -o /usr/lib/apache(Apache的模块目录），编译程序会自动将编译成功的mod_bandwidth.so文件放到Apache的模块目 录，您也可以自己确认一下，若是不正常，拷贝过去即可。</p>
<p>　　mod_bandwidth运行时需要一些特定的目录，按照默认情况，请运行以下命令创建并更改目录的权限：</p>
<blockquote><p>mkdir /tmp/apachebw<br />
mkdir /tmp/apachebw/link<br />
mkdir /tmp/apachebw/master<br />
chmod -R 777 /tmp/apachebw</p></blockquote>
<p>　　然后再打开httpd.conf文件，加上以下内容</p>
<blockquote><p>BandWidthDataDir “/tmp/apachebw/”<br />
BandWidthModule on</p></blockquote>
<p>　　这时，我们就能够对所需要限制带宽的目录进行相应的设置，此处的目录请使用服务器的绝对路径。如我们想限制服务器/home/www /thinkjam/download/soft目录的下载速度，也就是限制网址http://download.thinkjam.org/soft目 录下软件的下载速度，则为httpd.conf文件增加以下内容</p>
<blockquote><p>BandWidth thinkjam.org 0 #来自thinkjam.org的下载不受速度限制<br />
BandWidth 210.51.21 0 #来自210.51.21网段的下载不受速度限制<br />
BandWidth all 327680 #来自其它网段的速度都限制为327680Byte，即30KB/s</p></blockquote>
<p>　　设置完毕后，重新启动Apache服务，即可生效。</p>
<p>　　mod_bandwidth还有许多其它有用的参数，如在中间加上MaxConnection 120则可以限制某个目录的最多连接数，当超过指定连接数时，拒绝新的连接，此参数与mod_limitipconn模块结合可以控制某个目录的最多连接人数。</p>
<p>　　其它的参数请朋友们到其官方网站 http://www.cohprog.com/v3/bandwidth/doc-en.html 察看相关的文档。</p>
<p>　　Apache的功能确实强大，很多功能都可以通过添加模块来实现，在 http://modules.apache.org/ 可以找到更多的模块，我们也可以编写自己的模块来实现相应的功能。</p>
<h3  class="related_post_title">无相关文章，以下随机显示</h3><ul class="related_post"><li>2009年04月8号 -- <a href="http://ourapache.com/archives/238" title="apache软件体系结构  ">apache软件体系结构  </a></li><li>2009年08月13号 -- <a href="http://ourapache.com/archives/273" title="Apache和IIS共享80端口的四个方法">Apache和IIS共享80端口的四个方法</a></li><li>2008年12月27号 -- <a href="http://ourapache.com/archives/7" title="apache中.htaccess的功能及写法">apache中.htaccess的功能及写法</a></li><li>2009年01月6号 -- <a href="http://ourapache.com/archives/25" title="Apache服务器使用.htaccess实现图片防盗链方法教程">Apache服务器使用.htaccess实现图片防盗链方法教程</a></li><li>2009年02月6号 -- <a href="http://ourapache.com/archives/82" title="YouTube 架构学习">YouTube 架构学习</a></li><li>2009年02月25号 -- <a href="http://ourapache.com/archives/168" title="apache ab压力测试收藏">apache ab压力测试收藏</a></li><li>2009年02月12号 -- <a href="http://ourapache.com/archives/136" title="让apache支持自定义404页面错误">让apache支持自定义404页面错误</a></li><li>2009年02月27号 -- <a href="http://ourapache.com/archives/203" title="使用mod_headers或mod_expires落实缓存">使用mod_headers或mod_expires落实缓存</a></li><li>2009年02月10号 -- <a href="http://ourapache.com/archives/117" title="让Apache按日期保存日志数据">让Apache按日期保存日志数据</a></li><li>2010年04月13号 -- <a href="http://ourapache.com/archives/324" title="HTTP 状态代码解释">HTTP 状态代码解释</a></li></ul>
	标签：<a href="http://ourapache.com/archives/category/advanced" title="Apache高级应用" rel="tag">Apache高级应用</a>, <a href="http://ourapache.com/archives/tag/mod_bandwidth" title="mod_bandwidth" rel="tag">mod_bandwidth</a>, <a href="http://ourapache.com/archives/tag/mod_limitipconn" title="mod_limitipconn" rel="tag">mod_limitipconn</a>, <a href="http://ourapache.com/archives/tag/%e5%b8%a6%e5%ae%bd" title="带宽" rel="tag">带宽</a>, <a href="http://ourapache.com/archives/tag/%e5%b9%b6%e5%8f%91%e8%bf%9e%e6%8e%a5%e6%95%b0" title="并发连接数" rel="tag">并发连接数</a><br />
<img src="http://feeds.feedburner.com/~r/ourapache/~4/C-I4_VkfSx0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://ourapache.com/archives/281/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://ourapache.com/archives/281</feedburner:origLink></item>
		<item>
		<title>Apache+Django性能优化之mod_wsgi篇</title>
		<link>http://feedproxy.google.com/~r/ourapache/~3/mWTJH4P9wDg/275</link>
		<comments>http://ourapache.com/archives/275#comments</comments>
		<pubDate>Thu, 13 Aug 2009 09:53:11 +0000</pubDate>
		<dc:creator>OurApache</dc:creator>
				<category><![CDATA[Apache高级应用]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[mod_wsgi]]></category>

		<guid isPermaLink="false">http://www.ourapache.com/?p=275</guid>
		<description><![CDATA[我们一直使用 Django ，玩聚的各个产品前端都是架设于 Django 之上，如：SR/RT。如果你对 Django 有所了解，可以跳过下面的简介： 什么是Django Django 是一个开放源代码的Web应用框架，由Python写成，主力开发者是Adrian Holovaty。它采用了MVC的设计模式。 Django 的名字来自于比利时的爵士吉他手Django Reinhardt，他是欧陆爵士乐发展的奠基人，也是爵士史上最伟大的吉他巨匠，中国乐迷称之为“三指琴魔”。 Django 源自一个在线新闻 Web 站点，于 2005 年7月在BSD许可证下发布。Django 框架的核心组件有： 用于创建模型的对象关系映射 为最终用户设计的管理界面 一流的 URL 设计 设计者友好的模板语言 缓存系统 如何上手Django 新手入门参考Django Step by Step之limodou版。 DjangoProject.com 是 Django 框架的主页。其中的文档包括： How to install Django，展示了如何在一台开发机器上设置 Django Database API reference，使用 Django ORM 库的指南 Django template language，为模板作者准备的一份简单指南 How to serve static [...]]]></description>
			<content:encoded><![CDATA[<p>我们一直使用 <a href="http://www.djangoproject.com/" target="_blank">Django</a> ，玩聚的各个产品前端都是架设于 <a href="http://ourapache.com/archives/tag/django" class="st_tag internal_tag" rel="tag" title="标签 Django 下的日志">Django</a> 之上，如：<a href="http://sr.ju690.com/" target="_blank">SR</a>/<a href="http://rt.ju690.com/" target="_blank">RT</a>。如果你对 <a href="http://www.djangoproject.com/" target="_blank">Django</a> 有所了解，可以跳过下面的简介：</p>
<p>什么是<a href="http://www.djangoproject.com/" target="_blank">Django</a></p>
<p><strong>Django </strong>是一个开放源代码的Web应用框架，由Python写成，主力开发者是Adrian Holovaty。它采用了MVC的设计模式。</p>
<p><strong>Django </strong>的名字来自于比利时的爵士吉他手Django Reinhardt，他是欧陆爵士乐发展的奠基人，也是爵士史上最伟大的吉他巨匠，中国乐迷称之为“三指琴魔”。</p>
<p><strong>Django </strong>源自一个在线新闻 Web 站点，于 2005 年7月在BSD许可证下发布。Django 框架的核心组件有：</p>
<ul>
<li>用于创建模型的对象关系映射</li>
<li>为最终用户设计的管理界面</li>
<li>一流的 URL 设计</li>
<li>设计者友好的模板语言</li>
<li>缓存系统</li>
</ul>
<p>如何上手<a href="http://www.djangoproject.com/" target="_blank">Django</a></p>
<p>新手入门参考<a href="http://www.woodpecker.org.cn/obp/django/django-stepbystep/newtest/doc/" target="_blank">Django Step by Step之limodou版</a>。</p>
<p><a href="http://www.djangoproject.com/">DjangoProject.com</a> 是 Django 框架的主页。其中的文档包括：</p>
<ul>
<li><a href="http://www.djangoproject.com/documentation/install/">How to install Django</a>，展示了如何在一台开发机器上设置 Django</li>
<li><a href="http://www.djangoproject.com/documentation/db_api/">Database API reference</a>，使用 Django ORM 库的指南</li>
<li><a href="http://www.djangoproject.com/documentation/templates/">Django template language</a>，为模板作者准备的一份简单指南</li>
<li><a href="http://www.djangoproject.com/documentation/static_files/">How to serve static files</a>，如何在开发过程中通过设置 Django 来提供静态文件服务的介绍（<strong>不要</strong>在产品环境中这样做）</li>
<li><a href="http://www.djangoproject.com/documentation/modpython/">How to use Django with mod_python</a>，这是一份有关利用 mod_python 组合使用 Django 和 Apache 的指南</li>
<li><a href="http://www.djangoproject.com/documentation/generic_views/">Generic views</a>，展示了如何使用 Django 的通用视图更快地实现通用的 Web 应用程序模式</li>
</ul>
<p><strong>Django+Apache+mod_python 的用法</strong></p>
<p>一般上手搭配 Django 的是 Apache+<a href="http://www.modpython.org/" target="_blank">mod_python</a> ，从这个<a href="http://man.chinaunix.net/develop/python/mod_python/mod_python.html" target="_blank">早年间的翻译文档</a>可以了解 <a href="http://man.chinaunix.net/develop/python/mod_python/mod_python.html#head-871e5f352b5d3e7a56f7879bd1d31f478a3ae23e" target="_blank">Apache怎样处理请求</a>以及<a href="http://man.chinaunix.net/develop/python/mod_python/mod_python.html#head-1da20b19de452e61f844bf2c5900bf37bd5e9ff4" target="_blank">mod_python到底做了什么</a>。</p>
<p>不过，既然 Django 都已经在文档中说“<strong>it has been mostly superseded by the simpler </strong><a href="http://docs.djangoproject.com/en/dev/howto/deployment/modwsgi/#howto-deployment-modwsgi"><em><strong>mod_wsgi deployment option</strong></em></a><strong>./mod_python 多半已被更简单的 <a href="http://ourapache.com/archives/tag/mod_wsgi" class="st_tag internal_tag" rel="tag" title="标签 mod_wsgi 下的日志">mod_wsgi</a> 替代了。</strong>”那么我们就应该一上手就用 mod_wsgi 。</p>
<p><strong>为何要切换到 mod_wsgi ？</strong></p>
<p>mod_python 其实也不差。</p>
<p>但我一直困惑于 Apache+mod_python 的莫名频繁崩溃，错误日志中会出现大量的如下错误：</p>
<blockquote><p>[error] [client X.X.X.X] OSError: [Errno 0] Error<br />
[notice] Parent: child process exited with status <strong>3221225477</strong> &#8212; Restarting.</p></blockquote>
<p>这个状态号 3221225477 基本没什么意义，再加上 OSError 0 ，这个异常日志让人很无奈。甚至在 Windows 平台下，Apache 最恶劣情况下竟然会弹出一个崩溃错误框，此时事件日志会报告：</p>
<blockquote><p>cation Popup:0:29722:26:EVENTLOG_INFORMATION_TYPE:弹出应用程序: Microsoft Visual C++ Runtime Library: Runtime Error!<br />
Program: C:\Apache2.2\bin\httpd.exe<br />
This application has requested the Runtime to terminate it in an unusual way.</p></blockquote>
<p>一直无法对症下药。于是，期冀 mod_wsgi 能让我摆脱这两个问题。</p>
<p>另一个就是性能。</p>
<p><a href="http://code.google.com/p/modwsgi/wiki/PerformanceEstimates" target="_blank">modwsgi 性能评估</a>中列出这样的数字对比：</p>
<p><strong>Mechanism </strong><strong>Requests/sec</strong></p>
<p>mod_cgi (ScriptAlias) 10</p>
<p>mod_python (PythonHandler) 400</p>
<p>mod_wsgi (WSGIDaemonProcess) 700</p>
<p>mod_wsgi (.<a href="http://ourapache.com/archives/tag/htaccess" class="st_tag internal_tag" rel="tag" title="标签 htaccess 下的日志">htaccess</a>/SetHandler) 850</p>
<p>mod_wsgi (WSGIScriptAlias) 900</p>
<p>从数字可以看出，<a href="http://code.google.com/p/modwsgi/wiki/ConfigurationDirectives#WSGIScriptAlias" target="_blank">WSGIScriptAlias</a> 是最优选择。当然这个数字也没什么，后面人家说了“任何性能提高，都将被你使用的大型Web框架如Django或TurboGears吃掉，尤其是用了数据库后端，大多数的 overhead 源自Python Web Framework以及任何访问数据库时的瓶颈。mod_wsgi上的 overhead 只是很小的一块，这一小块上的任何性能提高都很难被注意到。”</p>
<p><strong>切换到 mod_wsgi 很容易</strong></p>
<p><a href="http://blog.csdn.net/zhengyun_ustc/" target="_blank">郑昀</a>@<a href="http://rt.ju690.com/" target="_blank">玩聚RT</a> 20090810</p>
<p>1、下载</p>
<p>可以从 <a href="http://code.google.com/p/modwsgi/downloads/list" target="_blank">modwsgi 的下载目录</a> 下载你所需要的版本。</p>
<p>对于 Windows 平台，可能需要阅读“<a href="http://code.google.com/p/modwsgi/wiki/InstallationOnWindows" target="_blank">Installation On Windows</a>”，并从这个页面上提示的 <a href="http://adal.chiriliuc.com/mod_wsgi/revision_1018_2.3/mod_wsgi_py25_apache22/" target="_blank">mod_wsgi_py25_apache22 目录</a> 下载 mod_wsgi.so (即我们的平台是Apache2.2+Python2.5+Django1.0.3)。</p>
<p>2、放置</p>
<p>把 mod_wsgi 放到你的Apache安装目录下的 modules 文件夹内。</p>
<p>3、配置Apache</p>
<p>在Apache配置文件httpd.conf中，增加一行：</p>
<blockquote><p>LoadModule wsgi_module modules/mod_wsgi.so</p></blockquote>
<p>4、修改Virtual Host配置</p>
<p>Apache 可以配置很多个 Named-based <a href="http://httpd.apache.org/docs/2.2/vhosts/" target="_blank">Virtual Hosts</a> ，可以在一个服务器上部署多个Web Sites。</p>
<p>mod_python 下的 VirtualHost 配置主要复杂在 Python 配置这块，如下所示：</p>
<blockquote><p>&lt;VirtualHost *:80&gt;<br />
ServerName rt.ju690.com<br />
ServerAlias rt.ju690.cn<br />
DocumentRoot d:/SocialRecommend</p>
<p>&lt;Location “/”&gt;<br />
SetHandler python-program<br />
PythonPath “['d:/SocialRecommend']+sys.path”<br />
PythonHandler django.core.handlers.modpython<br />
SetEnv DJANGO_SETTINGS_MODULE settings_yourproject<br />
PythonAutoReload Off<br />
PythonDebug Off</p>
<p>&lt;/Location&gt;</p>
<p>Alias /static d:/SocialRecommend/static<br />
&lt;Location “/static”&gt;<br />
SetHandler None<br />
&lt;/Location&gt;<br />
&lt;Directory “d:/SocialRecommend/static”&gt;<br />
Order Deny,Allow<br />
Allow from all<br />
&lt;/Directory&gt;</p>
<p>&lt;/VirtualHost&gt;</p></blockquote>
<p>现在改为 mod_wsgi ，只需要稍加改变即可：</p>
<blockquote><p>&lt;VirtualHost *:80&gt;<br />
ServerName rt.ju690.com<br />
ServerAlias rt.ju690.cn<br />
DocumentRoot D:/SocialRecommend<br />
<strong><span style="color: #ff0000;">WSGIScriptAlias / D:\SocialRecommend\wsgi\yourproject.wsgi</span></strong><br />
Alias /static d:/SocialRecommend/static<br />
&lt;Location “/static”&gt;<br />
SetHandler None<br />
&lt;/Location&gt;<br />
&lt;Directory “d:/SocialRecommend/static”&gt;<br />
Order Deny,Allow<br />
Allow from all<br />
&lt;/Directory&gt;<br />
<strong>&lt;Directory “d:/SocialRecommend/wsgi”&gt;<br />
Order Deny,Allow<br />
Allow from all<br />
&lt;/Directory&gt;<br />
</strong>&lt;/VirtualHost&gt;</p></blockquote>
<p><a href="http://code.google.com/p/modwsgi/wiki/ConfigurationDirectives#WSGIScriptAlias" target="_blank">WSGIScriptAlias 的定义参见 modwsgi wiki</a> ，主要是映射一个URL到一个文件系统地址并委派目标文件为WSGI Script。</p>
<p>赋予本地wsgi文件夹Allow from all权限，是因为这样才能执行WSGI Script。</p>
<p>5、建立wsgi script</p>
<p>在你的web site django总目录下新建一个文件夹wsgi。</p>
<p>在 wsgi 文件夹下新建一个文件 yourproject.wsgi ，内容如下所示：</p>
<blockquote><p># complete_project.wsgi is configured to live in projects/complete_project/deploy.<br />
# If you move this file you need to reconfigure the paths below.</p>
<p>import os<br />
import sys</p>
<p># redirect sys.stdout to sys.stderr for bad libraries like geopy that uses<br />
# print statements for optional import exceptions.<br />
sys.stdout = sys.stderr</p>
<p>from os.path import abspath, dirname, join<br />
from site import addsitedir</p>
<p>from django.core.handlers.wsgi import WSGIHandler</p>
<p>sys.path.insert(0, abspath(join(dirname(__file__), “../”)))<br />
sys.path.insert(0, abspath(join(dirname(__file__), “. . /. . /”)))</p>
<p>os.environ["DJANGO_SETTINGS_MODULE"] = “yourprojectname.settings_yourproject” #你的settings module名</p>
<p>application = WSGIHandler()</p></blockquote>
<p>6、重启Aapche即可。</p>
<p>参考资源：</p>
<p>1、<a href="http://code.google.com/p/modwsgi/" target="_blank">mod_wsgi</a> / <a href="http://www.modpython.org/" target="_blank">mod_python</a> ；</p>
<p>2、<a href="http://code.google.com/p/modwsgi/wiki/PerformanceEstimates" target="_blank">Performance Estimates for mod_wsgi</a> ；</p>
<p>3、<a href="http://code.djangoproject.com/wiki/django_apache_and_mod_wsgi" target="_blank">How to use django with mod_wsgi</a> 。</p>
<h3  class="related_post_title">无相关文章，以下随机显示</h3><ul class="related_post"><li>2009年02月10号 -- <a href="http://ourapache.com/archives/119" title="Apache2运用mod_deflate提升网络页面浏览速度">Apache2运用mod_deflate提升网络页面浏览速度</a></li><li>2009年02月16号 -- <a href="http://ourapache.com/archives/140" title="Apache、resin、rewrite泛域名、多域名设置">Apache、resin、rewrite泛域名、多域名设置</a></li><li>2009年02月10号 -- <a href="http://ourapache.com/archives/121" title="apache 无法启动故障排查">apache 无法启动故障排查</a></li><li>2009年02月7号 -- <a href="http://ourapache.com/archives/89" title="Apache PHP利用HTTP缓存协议原理解析及应用">Apache PHP利用HTTP缓存协议原理解析及应用</a></li><li>2010年04月13号 -- <a href="http://ourapache.com/archives/322" title="apache 的AcceptMutex 的理解">apache 的AcceptMutex 的理解</a></li><li>2009年01月6号 -- <a href="http://ourapache.com/archives/27" title="php+mysql+apache编码深度解析">php+mysql+apache编码深度解析</a></li><li>2009年02月7号 -- <a href="http://ourapache.com/archives/94" title="使用gzip压缩来压缩网页之apache的相关配置">使用gzip压缩来压缩网页之apache的相关配置</a></li><li>2009年08月13号 -- <a href="http://ourapache.com/archives/284" title="Apache负载均衡设置方法: mod_proxy">Apache负载均衡设置方法: mod_proxy</a></li><li>2009年02月27号 -- <a href="http://ourapache.com/archives/203" title="使用mod_headers或mod_expires落实缓存">使用mod_headers或mod_expires落实缓存</a></li><li>2010年03月9号 -- <a href="http://ourapache.com/archives/318" title="Apache2中俩种设置PHP的异同">Apache2中俩种设置PHP的异同</a></li></ul>
	标签：<a href="http://ourapache.com/archives/category/advanced" title="Apache高级应用" rel="tag">Apache高级应用</a>, <a href="http://ourapache.com/archives/tag/django" title="Django" rel="tag">Django</a>, <a href="http://ourapache.com/archives/tag/mod_wsgi" title="mod_wsgi" rel="tag">mod_wsgi</a><br />
<img src="http://feeds.feedburner.com/~r/ourapache/~4/mWTJH4P9wDg" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://ourapache.com/archives/275/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://ourapache.com/archives/275</feedburner:origLink></item>
		<item>
		<title>Apache和IIS共享80端口的四个方法</title>
		<link>http://feedproxy.google.com/~r/ourapache/~3/SPjbVkkHnRY/273</link>
		<comments>http://ourapache.com/archives/273#comments</comments>
		<pubDate>Thu, 13 Aug 2009 09:33:08 +0000</pubDate>
		<dc:creator>OurApache</dc:creator>
				<category><![CDATA[Apache初级应用]]></category>
		<category><![CDATA[iis]]></category>

		<guid isPermaLink="false">http://www.ourapache.com/?p=273</guid>
		<description><![CDATA[Apache和IIS共享80端口的四个方法]]></description>
			<content:encoded><![CDATA[<div class="mypost">
<p><strong>方法一：</strong></p>
<p><a href="http://ourapache.com/archives/tag/iis" class="st_tag internal_tag" rel="tag" title="标签 iis 下的日志">IIS</a>5，多IP下共存，IIS为192.168.0.1，apache为192.168.0.2</p>
<blockquote><p>c:\Inetpub\Adminscripts<br />
cscript adsutil.vbs set w3svc/disablesocketpooling true</p></blockquote>
<p>该命令反馈如下disablesocketpooling : (BOOLEAN) True</p>
<p>重启IIS</p>
<blockquote><p>Inetpub\AdminScripts&gt;cscript adsutil.vbs set w3svc/disablesocketpooling true</p></blockquote>
<p>由于 DisableSocketPooling 在 IIS 6.0 元数据库架构 (MBSchema.xml) 中被定义为有效属性，所以，您仍然可以使用 Adsutil.vbs 设置该属性，但这种设置不起作用。IIS 6.0 中的功能是新增的核心级别驱动程序 HTTP.sys 的一部分。要配置 HTTP.sys，您必须使用 Httpcfg.exe</p>
<p><strong>方法二：</strong></p>
<p>IIS6，多IP下共存，IIS为192.168.0.1，apache为192.168.0.2</p>
<p>到2003的CD下的 support/tools/Support.cab。解压出httpcfg.exe文件，COPY到windows/system32/目录下，用法自己看帮助</p>
<p>命令行绑定到某IP：</p>
<blockquote><p>httpcfg set iplisten -i 192.168.0.1</p></blockquote>
<p>即命令使用IIS的只监听指定的IP及端口</p>
<blockquote><p>查看绑定： httpcfg query iplisten<br />
删除绑定： httpcfg delete iplisten -i 192.168.0.1</p></blockquote>
<p>命令行</p>
<blockquote><p>net stop Apache2<br />
net stop iisadmin /y<br />
net START Apache2<br />
net START w3svc</p></blockquote>
<p>保证iis下的ip设置为全局默认，Apache中httpconf设置listen 192.168.0.2:80，就应该可以两个服务同时运行，相互不冲突了。</p>
<p>IIS的访问地址为http://192.168.0.1，Apache访问地址为<a href="http://192.168.0.2">http://192.168.0.2</a></p>
<p><span style="COLOR: red">提醒：IIS要指定为IP地址192.168.0.1 端口80；Apache 设置listen 192.168.0.2:80。关键是IIS用httpcfg命令绑定后，要重启系统，仅仅重启服务是不行的。</span></p>
<p><strong>方法三：</strong></p>
<p>将apache设为使用80端口，IIS使用其它端口，比如81，然后将apache作为IIS的代理。</p>
<p>在httpd.conf里面，取消下面四行的注释：</p>
<blockquote><p>LoadModule proxy_module modules/<a href="http://ourapache.com/archives/tag/mod_proxy" class="st_tag internal_tag" rel="tag" title="标签 mod_proxy 下的日志">mod_proxy</a>.so<br />
LoadModule proxy_connect_module modules/mod_proxy_connect.so<br />
LoadModule proxy_http_module modules/mod_proxy_http.so<br />
LoadModule proxy_ftp_module modules/mod_proxy_ftp.so</p></blockquote>
<p>然后建立一个虚拟主机，将该域名的所有访问转向81端口。</p>
<blockquote><p>ServerName iloves.vicp.net<br />
ProxyPass / http://localhost:81/<br />
ProxyPassReverse / <a href="http://localhost:81/">http://localhost:81/</a></p></blockquote>
<p>这样，对外就可以只需要一个端口，即可同时使用apache和IIS的功能了</p>
<p><strong>方法四：</strong></p>
<p>网上常用的单IP共用80端口方法，不过不推荐，只是使用Apache的代理，速度有影响将apache设为使用80端口，IIS使用其它端口，比如81，然后将apache作为IIS的代理。</p>
<p>在httpd.conf里面，取消下面四行的注释：</p>
<blockquote><p>LoadModule proxy_module modules/mod_proxy.so<br />
LoadModule proxy_connect_module modules/mod_proxy_connect.so<br />
LoadModule proxy_http_module modules/mod_proxy_http.so<br />
LoadModule proxy_ftp_module modules/mod_proxy_ftp.so</p></blockquote>
<p>然后建立一个虚拟主机，将该域名的所有访问转向81端口。</p>
<blockquote><p>ServerName iloves.vicp.net<br />
ProxyPass / http://localhost:81/<br />
ProxyPassReverse / <a href="http://localhost:81/">http://localhost:81/</a></p></blockquote>
<p>这样，对外就可以只需要一个端口，即可同时使用apache和IIS的功能了</p>
<p>类推，使用第二种方法，你可以在IIS上配置PHP4，Apache2中配置PHP5，只需要IIS中安装PHP4，把php.ini复制到\windows目录即可，这个就不用说了吧，Apache2中，只要把PHP5的php.ini放在PHP5安装目录里面就行了</p>
<p>配置Apache以支持PHP5：</p>
<blockquote><p>LoadModule <a href="http://ourapache.com/archives/tag/php" class="st_tag internal_tag" rel="tag" title="标签 php 下的日志">php</a>5_module “D:/PHPServer/<a href="http://ourapache.com/archives/tag/php" class="st_tag internal_tag" rel="tag" title="标签 php 下的日志">PHP</a>5/<a href="http://ourapache.com/archives/tag/php" class="st_tag internal_tag" rel="tag" title="标签 php 下的日志">php</a>5apache2.dll”<br />
AddType application/x-httpd-php .php<br />
DirectoryIndex index.html index.php<br />
PHPIniDir “D:/PHPServer/PHP5″</p></blockquote>
<p>其中最重要的一条就是 PHPIniDir，用来指明php.ini文件所在位置，即PHP5的安装目录，注意所有目录的应该改为D:/PHPServer/PHP5这种格式， 而非D:\PHPServer\PHP5，IIS的访问地址为http://192.168.0.1，Apache访问地址为http: //192.168.0.2</p></div>
<h3  class="related_post_title">相关文章</h3><ul class="related_post"><li>2009年02月10号 -- <a href="http://ourapache.com/archives/104" title="Apache和IIS共享80端口的四个方法">Apache和IIS共享80端口的四个方法</a></li></ul>
	标签：<a href="http://ourapache.com/archives/category/primary" title="Apache初级应用" rel="tag">Apache初级应用</a>, <a href="http://ourapache.com/archives/tag/iis" title="iis" rel="tag">iis</a><br />
<img src="http://feeds.feedburner.com/~r/ourapache/~4/SPjbVkkHnRY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://ourapache.com/archives/273/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://ourapache.com/archives/273</feedburner:origLink></item>
		<item>
		<title>Apache配置之URL重写</title>
		<link>http://feedproxy.google.com/~r/ourapache/~3/tpI9Cwm4hac/270</link>
		<comments>http://ourapache.com/archives/270#comments</comments>
		<pubDate>Thu, 13 Aug 2009 09:27:23 +0000</pubDate>
		<dc:creator>OurApache</dc:creator>
				<category><![CDATA[Apache初级应用]]></category>
		<category><![CDATA[mod_rewrite]]></category>

		<guid isPermaLink="false">http://www.ourapache.com/?p=270</guid>
		<description><![CDATA[wordpress中的永久链接需要Apache支持url重写，于是配置了一下。]]></description>
			<content:encoded><![CDATA[<p>wordpress中的永久链接需要Apache支持url重写，于是配置了一下。</p>
<p>1、修改apache的httpd.conf文件，将下面语句前的#去掉</p>
<blockquote><p>#LoadModule rewrite_module modules/<a href="http://ourapache.com/archives/tag/mod_rewrite" class="st_tag internal_tag" rel="tag" title="标签 mod_rewrite 下的日志">mod_rewrite</a>.so</p></blockquote>
<p>2、修改apache的httpd.conf文件，将对应的节中的AllowOverride None 改为AllowOverride All，如</p>
<blockquote><p>&lt;Directory “D:/Local/Apache/htdocs/”&gt;<br />
Options Indexes FollowSymLinks<br />
AllowOverride All<br />
Order allow,deny<br />
Allow from all<br />
&lt;/Directory&gt;</p></blockquote>
<p>3、在需url重写的目录下建立.htaccess文件，wordpress在开启永久链接后会只能生成，内容如下：</p>
<blockquote><p>&lt;IfModule mod_rewrite.c&gt;<br />
RewriteEngine On<br />
RewriteBase /<br />
RewriteCond %{REQUEST_FILENAME} !-f<br />
RewriteCond %{REQUEST_FILENAME} !-d<br />
RewriteRule . /index.<a href="http://ourapache.com/archives/tag/php" class="st_tag internal_tag" rel="tag" title="标签 php 下的日志">php</a> [L]<br />
&lt;/IfModule&gt;</p></blockquote>
<p>效果就是如此链接<a href="http://witmax.cn/apache-url-rewrite.html">http://witmax.cn/apache-url-rewrite.html</a><span class="linkification-ext">，其实并不存在这个目录，而是通过url重写由index.php来解析支持。</span></p>
<h3  class="related_post_title">相关文章</h3><ul class="related_post"><li>2009年06月14号 -- <a href="http://ourapache.com/archives/253" title="Apache自动添加地址末尾的斜线">Apache自动添加地址末尾的斜线</a></li><li>2009年02月12号 -- <a href="http://ourapache.com/archives/134" title="泛域名与mod_rewrite">泛域名与mod_rewrite</a></li></ul>
	标签：<a href="http://ourapache.com/archives/category/primary" title="Apache初级应用" rel="tag">Apache初级应用</a>, <a href="http://ourapache.com/archives/tag/mod_rewrite" title="mod_rewrite" rel="tag">mod_rewrite</a><br />
<img src="http://feeds.feedburner.com/~r/ourapache/~4/tpI9Cwm4hac" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://ourapache.com/archives/270/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://ourapache.com/archives/270</feedburner:origLink></item>
	</channel>
</rss>

