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

<channel>
	<title>SLJ.me - 申力军 &#187; Apache/Nginx</title>
	<atom:link href="http://slj.me/category/apache/feed/" rel="self" type="application/rss+xml" />
	<link>http://slj.me</link>
	<description>申力军的博客</description>
	<lastBuildDate>Mon, 05 Dec 2011 05:35:19 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1</generator>
		<item>
		<title>转购买安装Godaddy SSL证书以及Nginx配置HTTPS方法</title>
		<link>http://slj.me/2011/02/install-godaddy-ssl-https-on-nginx/</link>
		<comments>http://slj.me/2011/02/install-godaddy-ssl-https-on-nginx/#comments</comments>
		<pubDate>Thu, 24 Feb 2011 07:44:09 +0000</pubDate>
		<dc:creator>SLJ</dc:creator>
				<category><![CDATA[Apache/Nginx]]></category>
		<category><![CDATA[Web Structure]]></category>
		<category><![CDATA[https]]></category>
		<category><![CDATA[ssl]]></category>

		<guid isPermaLink="false">http://slj.me/?p=2147</guid>
		<description><![CDATA[一、购买 Godaddy SSL 证书 我买的是最便宜的一款，用优惠码 cjcssl12t2 以后 12.99 美元一年 ，购买地址： http://www.godaddy.com/gdshop/ssl/ssl.asp?isc=cjcssl12t2 二、生成服务器的 CSR 文件 用 root 权限进入服务器，输入： openssl genrsa -des3 -out &#60;name of your certificate&#62;.key 2048 openssl req -new -key &#60;name of your certificate&#62;.key -out &#60;name of your certificate&#62;.csr （必须是 2048 ，Godaddy 规定如此） 按照要求填写正确的信息 （Godaddy 帮助页面有相关帮助：http://help.godaddy.com/topic/746/article/5269） 还可以参考以下文章： http://www.kuaissl.cn/Support/CSRgen/Apache_CSR.htm 三、验证 CSR 文件 进入购买的 SSL 证书页面，此时没有绑定任何 CSR [...]]]></description>
			<content:encoded><![CDATA[<h2>一、购买 Godaddy SSL 证书</h2>
<p>我买的是最便宜的一款，用优惠码 <strong>cjcssl12t2 </strong>以后 12.99 美元一年 ，购买地址： <a title="http://www.godaddy.com/gdshop/ssl/ssl.asp?isc=cjcssl12t2" href="http://www.godaddy.com/gdshop/ssl/ssl.asp?isc=cjcssl12t2">http://www.godaddy.com/gdshop/ssl/ssl.asp?isc=cjcssl12t2</a></p>
<h2>二、生成服务器的 CSR 文件</h2>
<p>用 root 权限进入服务器，输入：</p>
<blockquote><p>openssl genrsa -des3 -out &lt;name of your certificate&gt;.key 2048</p></blockquote>
<blockquote><p>openssl req -new -key &lt;name of your certificate&gt;.key -out &lt;name of your certificate&gt;.csr</p></blockquote>
<p>（必须是 2048 ，Godaddy 规定如此）</p>
<p>按照要求填写正确的信息</p>
<p>（Godaddy 帮助页面有相关帮助：<a title="http://help.godaddy.com/topic/746/article/5269" href="http://help.godaddy.com/topic/746/article/5269">http://help.godaddy.com/topic/746/article/5269</a>）</p>
<p><span id="more-2147"></span>还可以参考以下文章：</p>
<p><a title="http://www.kuaissl.cn/Support/CSRgen/Apache_CSR.htm" href="http://www.kuaissl.cn/Support/CSRgen/Apache_CSR.htm">http://www.kuaissl.cn/Support/CSRgen/Apache_CSR.htm</a></p>
<h2>三、验证 CSR 文件</h2>
<p>进入购买的 SSL 证书页面，此时没有绑定任何 CSR ，Godaddy 会要求你输入 CSR 文件里的内容，直接复制过去即可，类似于这样的代码：</p>
<blockquote><p>&#8212;&#8211;BEGIN CERTIFICATE REQUEST&#8212;&#8211; MIIBzDCCATUCAQAwgYsxHDAaBgNVBAMTE3d3dy50aGlzaXNhdGVzdC5jb20xCzAJ BgNVBAYTAlpBMRkwFwYDVQQIExBXZXN0ZXJuIFByb3ZpbmNlMRIwEAYDVQQHEwlD YXBlIFRvd24xEjAQBgNVBAoTCVRlc3QgQ29ycDEbMBkGA1UECxMSVGVzdGluZyBE ZXBhcnRtZW50MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDVzfmv7vJ9bOyQ dxMLlgtDIEFz7MWsOUoZOPTq3qsTTXPW61q01jY8eQfs96I5xPjxALPeT4m74cce UtYxldG7pLJiB3SGU94yvyvHDiyV+6mV/e++KWT2ql0Jv1emmobmAGdUxdx2pW9C Epr0DmcVny6VGWAI36bG0NdYrNix4QIDAQABoAAwDQYJKoZIhvcNAQEEBQADgYEA BfSHgDr9Vc460YG+lAiWuVWEife8B4QOojiV8oUxJJDqbA2CEEmXLWfa7/mfUtd5 EQd6voLDT8axpXPbOrmwa3kzEZvQZhg+QvKEyIfncqdWbDUk71tO0fVafBKwRQfE 73J/THmVABZuz9T6X3+KWGxGDiYw0sY3bE7OjBCwr14=</p>
<p>&#8212;&#8211;END CERTIFICATE REQUEST&#8212;&#8211;</p></blockquote>
<p>接着直接 Order， 输入相关信息，接着就是等待 Godaddy 审核的时间。</p>
<h2>四、Godaddy 审核</h2>
<p>Godaddy 审核貌似需要几个钟头，我等了一下午，终于告诉我， Whois 上的 email 和实际 email 不符，囧…… .im 域名的whois 上是不显示 email 的……</p>
<p>接着，Godaddy 会告诉你一个代码，几个字母和数字的组合，比如XXX123，你只需要增加一个Cname，比如 xxx123.yourdomain.com. 解析到 yourdomain.com 即可，然后手工审核之（Godaddy 的邮件里都有告诉你方法，可惜当时我没截图，说的糊里糊涂的，邮件里很详细告诉你方法了）</p>
<h2>五、Nginx 平台安装</h2>
<p>需要以下几步：</p>
<h3>一、Nginx安装</h3>
<p>安装的时候需要注意加上 &#8211;with-http_ssl_module，因为http_ssl_module不属于Nginx的基本模块。</p>
<p>Nginx安装方法：</p>
<p>./configure &#8211;user=username &#8211;group=groupname &#8211;prefix=/usr/local/nginx &#8211;with-http_stub_status_module &#8211;with-http_ssl_module</p>
<p>make &amp;&amp; make install</p>
<h3>二、生成证书(如果没有godaddy证书的就用这个方法自己办法)</h3>
<p>可以使用openssl或ca.ssl生成，结果生成如下两个文件：</p>
<p>server.crt</p>
<p>server.key</p>
<p>如果是apache，直接将这两个文件引入到httpd.conf中，而Nginx需要的是.pem文件。.pem的生成方法很简单，就是合并server.crt、server.key的内容。</p>
<p>详细看这里：http://brucectl.javaeye.com/blog/455182</p>
<h3>三、修改Nginx配置：</h3>
<blockquote><p>server</p>
<p>{</p>
<p>listen 443;</p>
<p>server_name test.sina.com.cn;</p>
<p>ssl on;</p>
<p>ssl_certificate /tmp/server.pem;</p>
<p>ssl_certificate_key /tmp/server.key;</p>
<p>ssl_session_timeout 5m;</p>
<p>ssl_protocols SSLv2 SSLv3 TLSv1;</p>
<p>ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;</p>
<p>ssl_prefer_server_ciphers on;</p>
<p>}</p></blockquote>
<h3>3、重启服务即可</h3>
<p>具体可以参考这篇文章：《<a href="http://blog.tianya.cn/blogger/post_show.asp?BlogID=311462&amp;PostID=16867861&amp;idWriter=0&amp;Key=0" target="_blank">用Nginx配置https加密站点</a>》、《<a href="http://www.lostk.com/blog/nginx_ssl_config/" target="_blank">Nginx SSL 配置</a>》</p>
<h2  class="related_post_title">Related Posts / 相关文章</h2><ul class="related_post"><li><a href="http://slj.me/2011/02/top-7-myths-about-https/" title="转载：HTTPS的七个误解（译文）">转载：HTTPS的七个误解（译文）</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://slj.me/2011/02/install-godaddy-ssl-https-on-nginx/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>CentOS 安装 Apache 后其他机器无法访问的解决方法</title>
		<link>http://slj.me/2010/12/centos-apache-firewall-settings/</link>
		<comments>http://slj.me/2010/12/centos-apache-firewall-settings/#comments</comments>
		<pubDate>Tue, 14 Dec 2010 13:00:08 +0000</pubDate>
		<dc:creator>SLJ</dc:creator>
				<category><![CDATA[Apache/Nginx]]></category>
		<category><![CDATA[Web Structure]]></category>
		<category><![CDATA[CentOS]]></category>
		<category><![CDATA[linux]]></category>

		<guid isPermaLink="false">http://slj.me/?p=2102</guid>
		<description><![CDATA[症状： 通过 yum install httpd mod_ssl 安装apache以及https模块之后， /etc/init.d/httpd start 成功启动了Apache 但是局域网的另外一台机器却无法显示其页面。 诊断： 1、 netstat -l 看到 80 端口正在被监听。 2、 接着使用 curl http://127.0.0.1 可以得到页面源码。且不说默认的Apache配置如何，至少能说明服务已经跑起来了。 但是在局域网另外一台机器却无法打开页面。 3、 我使用SSH连到CentOS操作的，说明之间的链路是没问题的。 随之想到的就是防火墙，记得有个iptables，立刻上网找到了解决方案。 这里需要注意的就是，添加那句规则时，一定要放在拒绝规则的上面，和22端口的规则挨在一起就没错了。 解决方法： 通过/etc/init.d/iptables status命令查询是否有打开80端口，如果没有可通过两种方式处理： 1.修改vi /etc/sysconfig/iptables命令添加使防火墙开放80端口 -A RH-Firewall-1-INPUT -m state &#8211;state NEW -m tcp -p tcp &#8211;dport 80 -j ACCEPT 2.关闭防火墙 /etc/init.d/iptables stop #start 开启 #restart 重启 永久性关闭防火墙chkconfig [...]]]></description>
			<content:encoded><![CDATA[<h3>症状：</h3>
<p>通过 yum install httpd mod_ssl 安装apache以及https模块之后，<br />
/etc/init.d/httpd start  成功启动了Apache<br />
但是局域网的另外一台机器却无法显示其页面。</p>
<h3>诊断：</h3>
<p>1、<br />
netstat -l 看到 80 端口正在被监听。<br />
2、<br />
接着使用 curl http://127.0.0.1 可以得到页面源码。且不说默认的Apache配置如何，至少能说明服务已经跑起来了。<br />
但是在局域网另外一台机器却无法打开页面。<br />
3、<br />
我使用SSH连到CentOS操作的，说明之间的链路是没问题的。</p>
<p>随之想到的就是防火墙，记得有个iptables，立刻上网找到了解决方案。<br />
这里需要注意的就是，添加那句规则时，一定要放在拒绝规则的上面，和22端口的规则挨在一起就没错了。</p>
<h3><span id="more-2102"></span>解决方法：</h3>
<p>通过/etc/init.d/iptables status命令查询是否有打开80端口，如果没有可通过两种方式处理：</p>
<p>1.修改vi /etc/sysconfig/iptables命令添加使防火墙开放80端口<br />
-A RH-Firewall-1-INPUT -m state &#8211;state NEW -m tcp -p tcp &#8211;dport 80 -j ACCEPT</p>
<p>2.关闭防火墙<br />
/etc/init.d/iptables stop<br />
#start 开启<br />
#restart 重启</p>
<p>永久性关闭防火墙chkconfig &#8211;level 35 iptables off</p>
<h2  class="related_post_title">Related Posts / 相关文章</h2><ul class="related_post"><li><a href="http://slj.me/2011/03/21andy-centos-repo/" title="分享21Andy的CentOS的repo">分享21Andy的CentOS的repo</a></li><li><a href="http://slj.me/2010/12/centos-php5-2-yum/" title="CentOS 用 yum 官方源安裝 PHP5.2.x">CentOS 用 yum 官方源安裝 PHP5.2.x</a></li><li><a href="http://slj.me/2010/12/php-memcached-permission-denied/" title="PHP无法操作memcached提示Permission denied的解决方法">PHP无法操作memcached提示Permission denied的解决方法</a></li><li><a href="http://slj.me/2010/12/install-memcache-on-centos/" title="安装memcache到CentOS（另附yum法）">安装memcache到CentOS（另附yum法）</a></li><li><a href="http://slj.me/2009/12/ssh-restart-apache/" title="用SSH重启Apache">用SSH重启Apache</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://slj.me/2010/12/centos-apache-firewall-settings/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Godaddy的No input file specified错误（php+fastcgi）</title>
		<link>http://slj.me/2010/03/godaddy-no-input-file-specified-solution/</link>
		<comments>http://slj.me/2010/03/godaddy-no-input-file-specified-solution/#comments</comments>
		<pubDate>Mon, 01 Mar 2010 06:43:52 +0000</pubDate>
		<dc:creator>SLJ</dc:creator>
				<category><![CDATA[Apache/Nginx]]></category>
		<category><![CDATA[404]]></category>
		<category><![CDATA[FastCGI]]></category>
		<category><![CDATA[godaddy]]></category>
		<category><![CDATA[no input file specified]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://slj.me/?p=1497</guid>
		<description><![CDATA[昨天买了个GoDaddy的linux主机。似乎被分到了新服务器上，FTP最高可以连接500个用户同时在线，比起原来的旧帐号里的是提高了很多。 结果一运行，很多利用诸如 http://www.wyscyw.com/index.php/brand 来以index.php作为网站入口的MVC站点，在index.php后使用/brand之类的的controller，action后，就会出现404错误，错误提示No input file specified 在纠结了几个小时后，终于找到了解决方案， 我就在站点根目录下的php5.ini 加上了： cgi.fix_pathinfo=1 doc_root= 就解决了 以下方案来源网络。 ================================== php+fastcgi遭遇No input file specified.错误 最近经常搞lighttpd+fastcgi+php或者nginx+fastcgi+php，时常被php的“No input file specified.”给郁闷了，把我遇到的情况说一下 首先php.ini的配置中 cgi.fix_pathinfo=1 doc_root= doc_root曾经被我设置过一个路径，结果php老提示“No input file specified.”，只有一个虚机好使。改掉后就正常了。 nginx中的配置有些麻烦 fastcgi_pass 127.0.0.1:1234; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name; 每个虚机要根据自己不通的虚机设置不能的目录，要保证这个路径正确。 fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name;不能在fastcgi_pass 127.0.0.1:1234;的前面。 记得修改了php.ini要重启fastcgi服务。 Related Posts / 相关文章FastCGI 不完全高级指南（PHP版，Windows平台）疯狂的 Web 应用开源项目[转] 代替bash，书写 PHP daemon 后台程序Xdebug [...]]]></description>
			<content:encoded><![CDATA[<p>昨天买了个GoDaddy的linux主机。似乎被分到了新服务器上，FTP最高可以连接500个用户同时在线，比起原来的旧帐号里的是提高了很多。</p>
<p>结果一运行，很多利用诸如 http://www.wyscyw.com/index.php/brand 来以index.php作为网站入口的MVC站点，在index.php后使用/brand之类的的controller，action后，就会出现404错误，错误提示No input file specified</p>
<p>在纠结了几个小时后，终于找到了解决方案，</p>
<p>我就在站点根目录下的php5.ini 加上了：</p>
<p>cgi.fix_pathinfo=1<br />
doc_root=</p>
<p>就解决了</p>
<p>以下方案来源网络。</p>
<p>==================================</p>
<p>php+fastcgi遭遇No input file specified.错误</p>
<p>最近经常搞lighttpd+fastcgi+php或者nginx+fastcgi+php，时常被php的“No input file specified.”给郁闷了，把我遇到的情况说一下<br />
<span id="more-1497"></span><br />
首先php.ini的配置中</p>
<p>cgi.fix_pathinfo=1<br />
doc_root=</p>
<p>doc_root曾经被我设置过一个路径，结果php老提示“No input file specified.”，只有一个虚机好使。改掉后就正常了。</p>
<p>nginx中的配置有些麻烦</p>
<p>fastcgi_pass 127.0.0.1:1234;<br />
fastcgi_index index.php;<br />
fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name;</p>
<p>每个虚机要根据自己不通的虚机设置不能的目录，要保证这个路径正确。<br />
fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name;不能在fastcgi_pass 127.0.0.1:1234;的前面。</p>
<p>记得修改了php.ini要重启fastcgi服务。</p>
<h2  class="related_post_title">Related Posts / 相关文章</h2><ul class="related_post"><li><a href="http://slj.me/2009/04/fastcgi-manual-php-windows/" title="FastCGI 不完全高级指南（PHP版，Windows平台）">FastCGI 不完全高级指南（PHP版，Windows平台）</a></li><li><a href="http://slj.me/2011/08/web-open-source-project/" title="疯狂的 Web 应用开源项目">疯狂的 Web 应用开源项目</a></li><li><a href="http://slj.me/2011/06/php-daemon-notice/" title="[转] 代替bash，书写 PHP daemon 后台程序">[转] 代替bash，书写 PHP daemon 后台程序</a></li><li><a href="http://slj.me/2011/04/xdebug-for-php/" title="Xdebug for php 一个实用的PHP调试扩展">Xdebug for php 一个实用的PHP调试扩展</a></li><li><a href="http://slj.me/2011/02/php-share-session-between-servers/" title="PHP 实现多服务器共享 SESSION 数据">PHP 实现多服务器共享 SESSION 数据</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://slj.me/2010/03/godaddy-no-input-file-specified-solution/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>从安装GEV.com中学到的</title>
		<link>http://slj.me/2009/12/%e4%bb%8e%e5%ae%89%e8%a3%85gev-com%e4%b8%ad%e5%ad%a6%e5%88%b0%e7%9a%84/</link>
		<comments>http://slj.me/2009/12/%e4%bb%8e%e5%ae%89%e8%a3%85gev-com%e4%b8%ad%e5%ad%a6%e5%88%b0%e7%9a%84/#comments</comments>
		<pubDate>Mon, 21 Dec 2009 15:26:02 +0000</pubDate>
		<dc:creator>SLJ</dc:creator>
				<category><![CDATA[Apache/Nginx]]></category>
		<category><![CDATA[Life]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://kiya.cn/?p=1361</guid>
		<description><![CDATA[忙了好几天，终于是吧Gev.com装上了我们的YelpClone. 可谓是波折。 //故事如下。。。 一个全新安装的CentOS，一个裸Apache。 当我把全站程序传上去的时候，页面返回空白，开始以为是Zend Optimizer的问题，就反馈，无果，自己上传，链接module，依然还是空白。 索性做了一个phpinfo()页面，经过Zend Guard加密后上传，可以正常显示，于是确定不是Zend Optimizer的问题。 一个很重要的转折点，我看了 Apache 的  error_log，发现Fatal Error,是mysql_connect为未知函数。查看了 phpinfo() 没有发现mysql的信息，发ticket让他们装了mysql。终于我的安装程序出的来了。 安装出错，无法读写config。震惊，因为从未遇到，于是想起linux的权限，所以去FTP查看那个文件的属性，果然是只读，就改成775. 恢复正常。 安装成功，但是首页还是空白，继续查看 error_log，无法写Smarty compile directory。哎，看来还是权限的问题，Smarty的编译目录没有开放写权限，于是又把compile目录改成775，依然出错，愤怒之下直接改成了777！ 可以了。。汗！ 但是最后rewrite功能失效，返回404，应该不是.htaccess的问题了，于是想起了httpd.conf中的设置问题，查看mod_rewrite.so，已经是启用的，又想起对目录Overwrite的设置，果然，从 none 改成 All 重启 httpd 一切正常。大功告成 //故事结束 从这几天的工作中学到的东西还是挺多的。 对Linux系统下的Web服务有了更深入的理解，命令又更加熟练了一些。 学到了解决方法的方法：error_log。 强调了模板编译目录的读写权限。 解决问题的逻辑更清晰了。 重温了httpd.conf的设置。 这个项目还在继续呢，我们要开发更多的模块和主题，因为他要开 Module Shop 和 Theme Shop。 Other Posts / 其他文章转：使用 Dojo 开发离线应用Upgrade instruction for MeePlace 2.4分享两则我在VPS上执行的sh脚本10个jQuery Lightbox效果插件我的近况与MeePlace 2.4说明]]></description>
			<content:encoded><![CDATA[<p>忙了好几天，终于是吧<a href="http://gev.com" target="_blank">Gev.com</a>装上了我们的<a href="http://www.yelpclone.com" target="_blank">YelpClone</a>. 可谓是波折。</p>
<p><span style="color: #333399;">//故事如下。。。</span></p>
<p>一个全新安装的CentOS，一个裸Apache。</p>
<p>当我把全站程序传上去的时候，页面返回空白，开始以为是Zend Optimizer的问题，就反馈，无果，自己上传，链接module，依然还是空白。</p>
<p>索性做了一个phpinfo()页面，经过Zend Guard加密后上传，可以正常显示，于是确定不是Zend Optimizer的问题。</p>
<p>一个很重要的转折点，我看了 Apache 的  error_log，发现Fatal Error,是mysql_connect为未知函数。查看了 phpinfo() 没有发现mysql的信息，发ticket让他们装了mysql。终于我的安装程序出的来了。</p>
<p><span id="more-1361"></span>安装出错，无法读写config。震惊，因为从未遇到，于是想起linux的权限，所以去FTP查看那个文件的属性，果然是只读，就改成775. 恢复正常。</p>
<p>安装成功，但是首页还是空白，继续查看 error_log，无法写Smarty compile directory。哎，看来还是权限的问题，Smarty的编译目录没有开放写权限，于是又把compile目录改成775，依然出错，愤怒之下直接改成了777！ 可以了。。汗！</p>
<p>但是最后rewrite功能失效，返回404，应该不是.htaccess的问题了，于是想起了httpd.conf中的设置问题，查看mod_rewrite.so，已经是启用的，又想起对目录Overwrite的设置，果然，从 none 改成 All 重启 httpd 一切正常。大功告成</p>
<p><span style="color: #333399;">//故事结束</span></p>
<p><span style="color: #000000;">从这几天的工作中学到的东西还是挺多的。</span></p>
<ol>
<li><span style="color: #000000;">对Linux系统下的Web服务有了更深入的理解，命令又更加熟练了一些。</span></li>
<li><span style="color: #000000;">学到了解决方法的方法：error_log。</span></li>
<li><span style="color: #000000;">强调了模板编译目录的读写权限。</span></li>
<li><span style="color: #000000;">解决问题的逻辑更清晰了。</span></li>
<li><span style="color: #000000;">重温了httpd.conf的设置。</span></li>
</ol>
<p><span style="color: #000000;">这个项目还在继续呢，我们要开发更多的模块和主题，因为他要开 Module Shop 和 Theme Shop。</span></p>
<h2  class="related_post_title">Other Posts / 其他文章</h2><ul class="related_post"><li><a href="http://slj.me/2009/12/ajax-loading-%e5%9c%a8%e7%ba%bf%e5%9b%be%e7%89%87%e7%94%9f%e6%88%90/" title="Ajax Loading 在线图片生成">Ajax Loading 在线图片生成</a></li><li><a href="http://slj.me/2009/12/20-more-beautiful-interactive-website-design-using-jquery/" title="20多个漂亮的使用jQuery交互的网站设计欣赏">20多个漂亮的使用jQuery交互的网站设计欣赏</a></li><li><a href="http://slj.me/2009/04/jcrop-the-jquery-image-cropping-plugin/" title="Jcrop-jQuery图片裁剪插件">Jcrop-jQuery图片裁剪插件</a></li><li><a href="http://slj.me/2009/10/%e7%94%a8photoshop%e8%ae%be%e8%ae%a1%e4%b8%80%e4%b8%aa%e7%ae%80%e6%b4%81%e6%96%b0%e6%bd%ae%e7%9a%84%e5%85%ac%e5%8f%b8%e7%bd%91%e7%ab%99/" title="用Photoshop设计一个简洁新潮的公司网站">用Photoshop设计一个简洁新潮的公司网站</a></li><li><a href="http://slj.me/2010/12/install-memcache-on-centos/" title="安装memcache到CentOS（另附yum法）">安装memcache到CentOS（另附yum法）</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://slj.me/2009/12/%e4%bb%8e%e5%ae%89%e8%a3%85gev-com%e4%b8%ad%e5%ad%a6%e5%88%b0%e7%9a%84/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>用SSH重启Apache</title>
		<link>http://slj.me/2009/12/ssh-restart-apache/</link>
		<comments>http://slj.me/2009/12/ssh-restart-apache/#comments</comments>
		<pubDate>Sat, 19 Dec 2009 11:09:14 +0000</pubDate>
		<dc:creator>SLJ</dc:creator>
				<category><![CDATA[Apache/Nginx]]></category>

		<guid isPermaLink="false">http://kiya.cn/?p=1350</guid>
		<description><![CDATA[最近，Bryan雇我把我的作品Yourcaddy.com开发成产品，可以带license的出售。作品完成之后Bryan开卖，地址在http://www.yelpclone.com。购买的人我这里看上去还可以，不能算少。于是有一个客户需要协助安装服务。于是我便去他的独立服务器上捣鼓了一下。我看着他的域名觉得无比兴奋！ GEV.com 可谓价值连城！客户给的是一个FTP+SSH账户。下面就说一说在Windows下利用SSH来远程服务器重启Apache。 首先工具用的是 SSH Secure Shell 介绍几个Linux命令。 wherei1s 能找到你要找的东东在哪。 比如： [root@s1 ~]# whereis httpd httpd: /usr/sbin/httpd.worker /usr/sbin/httpd /usr/sbin/httpd.event /etc/httpd /usr/lib/httpd /usr/include/httpd /usr/share/man/man8/httpd.8.gz 找到httpd进程程序之所在 ps -ef&#124;grep httpd 找到apachectl whereis apachectl 重启apache /usr/sbin/apachectl restart 检测conf文件有没有错 /usr/sbin/apachectl -t 对服务的操作：  [root@s1 ~]# whereis service service: /sbin/service /usr/share/man/man8/service.8.gz 或重启httpd服务 /sbin/service httpd restart （以上路径根据安装时的路径而定） Related Posts / 相关文章CentOS 安装 Apache 后其他机器无法访问的解决方法好书推荐-《PHP与MySQL程序设计（第3版）》Apache [...]]]></description>
			<content:encoded><![CDATA[<p>最近，Bryan雇我把我的作品Yourcaddy.com开发成产品，可以带license的出售。作品完成之后Bryan开卖，地址在<a href="http://www.yelpclone.com" target="_blank">http://www.yelpclone.com</a>。购买的人我这里看上去还可以，不能算少。于是有一个客户需要协助安装服务。于是我便去他的独立服务器上捣鼓了一下。我看着他的域名觉得无比兴奋！ GEV.com 可谓价值连城！客户给的是一个FTP+SSH账户。下面就说一说在Windows下利用SSH来远程服务器重启Apache。</p>
<p><span id="more-1350"></span>首先工具用的是 SSH Secure Shell</p>
<p>介绍几个Linux命令。</p>
<p>wherei1s 能找到你要找的东东在哪。 比如：<br />
[root@s1 ~]# whereis httpd<br />
httpd: /usr/sbin/httpd.worker /usr/sbin/httpd /usr/sbin/httpd.event /etc/httpd<br />
/usr/lib/httpd /usr/include/httpd /usr/share/man/man8/httpd.8.gz</p>
<p>找到httpd进程程序之所在<br />
ps -ef|grep httpd</p>
<p>找到apachectl<br />
whereis apachectl</p>
<p>重启apache<br />
/usr/sbin/apachectl restart</p>
<p>检测conf文件有没有错<br />
/usr/sbin/apachectl -t</p>
<p>对服务的操作：<br />
 [root@s1 ~]# whereis service<br />
service: /sbin/service /usr/share/man/man8/service.8.gz</p>
<p>或重启httpd服务<br />
/sbin/service httpd restart</p>
<p>（以上路径根据安装时的路径而定）</p>
<h2  class="related_post_title">Related Posts / 相关文章</h2><ul class="related_post"><li><a href="http://slj.me/2010/12/centos-apache-firewall-settings/" title="CentOS 安装 Apache 后其他机器无法访问的解决方法">CentOS 安装 Apache 后其他机器无法访问的解决方法</a></li><li><a href="http://slj.me/2009/05/book-beginingphpandmysql/" title="好书推荐-《PHP与MySQL程序设计（第3版）》">好书推荐-《PHP与MySQL程序设计（第3版）》</a></li><li><a href="http://slj.me/2009/04/apache-rewrite-regular/" title="Apache Rewrite 规则详解">Apache Rewrite 规则详解</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://slj.me/2009/12/ssh-restart-apache/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>GZIP 在各种网站上的万能应用 （以WordPress举例）</title>
		<link>http://slj.me/2009/07/gzip%e4%b8%87%e8%83%bd%e5%ba%94%e7%94%a8/</link>
		<comments>http://slj.me/2009/07/gzip%e4%b8%87%e8%83%bd%e5%ba%94%e7%94%a8/#comments</comments>
		<pubDate>Sun, 12 Jul 2009 00:49:49 +0000</pubDate>
		<dc:creator>SLJ</dc:creator>
				<category><![CDATA[Apache/Nginx]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://kiya.cn/?p=609</guid>
		<description><![CDATA[转载请注明来源：关于 GZIP 在各种网站上的万能应用 （以WordPress举例） &#124; 奇亚 每次更新WordPress是一个痛苦的过程，会把原先我对奇亚的优化全部覆盖掉。比如GZIP这一方面。趁这个机会我总结一下关于 GZIP 在各种网站上的万能应用 对于一些网速比较慢的服务器来说，在页面上启用GZIP对访问者的下载效率是有很大好处的。 下面是一个万能方法，无论你有没有PHP或者Apache的知识，照着做就对了。 CSS和JS方面 我们使用网络上一个流行的脚本Gzip.php来处理，按照代码，.htaccess将检查用户的请求，发现扩展名以js或者css结尾的，首先去找是否在其目录下有.js.gz文件，如果没有的话就运用gzip.php来生成它。（例，用户请求/js/jQuery.js，会先自动找/js/jQuery.js.gz，如果没有发现调用gzip.php来生成它） 这个脚本的好处在于，由于js和css一般不是动态的，所以通过一次性生成，而每次请求时不必再次压缩，提高了效率。 但要注意，若你的js文件或者css文件有更新的话，需要把其目录下已经生成的.js.gz和.css.gz删除，否则浏览者访问的仍然是旧版本的文件。 1、 修改根目录的.htaccess &#60;Files *.js.gz&#62; AddEncoding gzip .js ForceType application/x-javascript &#60;/Files&#62; &#60;Files *.css.gz&#62; AddEncoding gzip .css ForceType text/css &#60;/Files&#62; &#60;IfModule mod_rewrite.c&#62; RewriteEngine On RewriteCond %{HTTP:Accept-encoding} gzip RewriteCond %{REQUEST_FILENAME}.gz -f RewriteRule ^(.*).css $1.css.gz [L,QSA] RewriteCond %{HTTP:Accept-encoding} gzip RewriteCond %{REQUEST_FILENAME}.gz -f RewriteRule ^(.*).js [...]]]></description>
			<content:encoded><![CDATA[<p>转载请注明来源：<a href="http://kiya.cn/2009/07/gzip%e4%b8%87%e8%83%bd%e5%ba%94%e7%94%a8/">关于 GZIP 在各种网站上的万能应用 （以WordPress举例） | 奇亚</a></p>
<p><span style="color: #800000;">每次更新WordPress是一个痛苦的过程，会把原先我对<a href="http://kiya.cn/">奇亚</a>的优化全部覆盖掉。比如GZIP这一方面。趁这个机会我总结一下关于 GZIP 在各种网站上的万能应用</span></p>
<p><span style="color: #800000;">对于一些网速比较慢的服务器来说，在页面上启用GZIP对访问者的下载效率是有很大好处的。<br />
下面是一个万能方法，无论你有没有PHP或者Apache的知识，照着做就对了。</span></p>
<p><strong>CSS和JS方面</strong></p>
<p>我们使用网络上一个流行的脚本Gzip.php来处理，按照代码，.htaccess将检查用户的请求，发现扩展名以js或者css结尾的，首先去找是否在其目录下有.js.gz文件，如果没有的话就运用gzip.php来生成它。（例，用户请求/js/jQuery.js，会先自动找/js/jQuery.js.gz，如果没有发现调用gzip.php来生成它）<br />
这个脚本的好处在于，由于js和css一般不是动态的，所以通过一次性生成，而每次请求时不必再次压缩，提高了效率。<br />
但要注意，若你的js文件或者css文件有更新的话，需要把其目录下已经生成的.js.gz和.css.gz删除，否则浏览者访问的仍然是旧版本的文件。</p>
<p><span id="more-609"></span><strong>1、 修改根目录的.htaccess</strong></p>
<blockquote><p>&lt;Files *.js.gz&gt;<br />
        AddEncoding gzip .js<br />
         ForceType application/x-javascript<br />
&lt;/Files&gt;<br />
&lt;Files *.css.gz&gt;<br />
        AddEncoding gzip .css<br />
        ForceType text/css<br />
&lt;/Files&gt;</p>
<p>&lt;IfModule mod_rewrite.c&gt;<br />
        RewriteEngine On</p>
<p>        RewriteCond %{HTTP:Accept-encoding} gzip<br />
        RewriteCond %{REQUEST_FILENAME}.gz -f<br />
        RewriteRule ^(.*).css $1.css.gz [L,QSA]</p>
<p>        RewriteCond %{HTTP:Accept-encoding} gzip<br />
        RewriteCond %{REQUEST_FILENAME}.gz -f<br />
        RewriteRule ^(.*).js $1.js.gz [L,QSA]</p>
<p>        RewriteRule (.*.css$|.*.js$) gzip.php?$1 [L]<br />
&lt;/IfModule&gt;</p></blockquote>
<p>这里就不注解了，如果想知道上面是什么内容，可以看看我以前发过的一篇<a rel="external" href="http://kiya.cn/2009/04/apache-rewrite-regular/">Apache Rewrite 规则详解</a></p>
<p><strong>2、上传gzip.php到根目录</strong><br />
PHP代码：</p>
<pre name="code" class="php">

define('ABSPATH', dirname(__FILE__).'/');
$cache = true;//Gzip压缩开关
$cachedir = 'wp-cache/';//存放gz文件的目录，确保可写
$gzip = strstr($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip');
$deflate = strstr($_SERVER['HTTP_ACCEPT_ENCODING'], 'deflate');
$encoding = $gzip ? 'gzip' : ($deflate ? 'deflate' : 'none');
if(!isset($_SERVER['QUERY_STRING'])) exit();
$key=array_shift(explode('?', $_SERVER['QUERY_STRING']));
$key=str_replace('../','',$key);
$filename=ABSPATH.$key;
$symbol='^';
$rel_path=str_replace(ABSPATH,'',dirname($filename));
$namespace=str_replace('/',$symbol,$rel_path);
//$cache_filename=ABSPATH.$cachedir.$namespace.$symbol.basename($filename).'.gz';//生成gz文件路径
$cache_filename=$filename.'.gz';//生成gz文件路径
$type="Content-type: text/html"; //默认的类型信息
$ext = array_pop(explode('.', $filename));//根据后缀判断文件类型信息
       switch ($ext){
              case 'css':
               $type="Content-type: text/css";
               break;
              case 'js':
               $type="Content-type: text/javascript";
               break;
              default:
               exit();
       }
if($cache){
       if(file_exists($cache_filename)){//假如存在gz文件
              $mtime = filemtime($cache_filename);
              $gmt_mtime = gmdate('D, d M Y H:i:s', $mtime) . ' GMT';
              if( (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) &amp;&amp;
                 array_shift(explode(';', $_SERVER['HTTP_IF_MODIFIED_SINCE'])) ==  $gmt_mtime)
                     ){
                     // 浏览器cache中的文件修改日期是否一致，将返回304
                     header ("HTTP/1.1 304 Not Modified");
                     header("Expires: ");
                     header("Cache-Control: ");
                     header("Pragma: ");
                     header($type);
                     header("Tips: Cache Not Modified (Gzip)");
                     header ('Content-Length: 0');
              }else{
                     //读取gz文件输出
                     $content = file_get_contents($cache_filename);
                     header("Last-Modified:" . $gmt_mtime);
                     header("Expires: ");
                     header("Cache-Control: ");
                     header("Pragma: ");
                     header($type);
                     header("Tips: Normal Respond (Gzip)");
                     header("Content-Encoding: gzip");
                     echo $content;
              }
       }else if(file_exists($filename)){ //没有对应的gz文件
              $mtime = mktime();
              $gmt_mtime = gmdate('D, d M Y H:i:s', $mtime) . ' GMT';
              $content = file_get_contents($filename);//读取文件
              $content = gzencode($content, 9, $gzip ? FORCE_GZIP : FORCE_DEFLATE);//压缩文件内容
              header("Last-Modified:" . $gmt_mtime);
              header("Expires: ");
              header("Cache-Control: ");
              header("Pragma: ");
              header($type);
              header("Tips: Build Gzip File (Gzip)");
              header ("Content-Encoding: " . $encoding);
        header ('Content-Length: ' . strlen($content));
              echo $content;
              if ($fp = fopen($cache_filename, 'w')) {//写入gz文件，供下次使用
                fwrite($fp, $content);
                fclose($fp);
            }
       }else{
              header("HTTP/1.0 404 Not Found");
       }
}else{ //处理不使用Gzip模式下的输出。原理基本同上
       if(file_exists($filename)){
              $mtime = filemtime($filename);
              $gmt_mtime = gmdate('D, d M Y H:i:s', $mtime) . ' GMT';
              if( (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) &amp;&amp;
              array_shift(explode(';', $_SERVER['HTTP_IF_MODIFIED_SINCE'])) ==  $gmt_mtime)
              ){
              header ("HTTP/1.1 304 Not Modified");
              header("Expires: ");
              header("Cache-Control: ");
              header("Pragma: ");
              header($type);
              header("Tips: Cache Not Modified");
              header ('Content-Length: 0');
       }else{
              header("Last-Modified:" . $gmt_mtime);
              header("Expires: ");
              header("Cache-Control: ");
              header("Pragma: ");
              header($type);
              header("Tips: Normal Respond");
              $content = readfile($filename);
              echo $content;
              }
       }else{
              header("HTTP/1.0 404 Not Found");
       }
}
</pre>
<p><strong>3，如果需要压缩页面，可以在头部加上（一定是php文件）</strong></p>
<pre name="code" class="php">
if(ereg('gzip',$_SERVER['HTTP_ACCEPT_ENCODING'])){ //判断浏览器是否支持Gizp
ob_start('ob_gzhandler'); //打开Gzip压缩
}
</pre>
<p><span style="color: #800000;">==========================================================</span></p>
<p>下面是以WordPress为实例说明一下应用：</p>
<p><strong>CSS/JS方面：</strong><br />
使用上面的通用例子即可，即：<br />
1、修改.htaccess，</p>
<blockquote>
<p>&lt;files *.js.gz&gt;<br />
  AddEncoding gzip .js<br />
  ForceType application/x-javascript<br />
  &lt;/files&gt;<br />
  &lt;files *.css.gz&gt;<br />
  AddEncoding gzip .css<br />
  ForceType text/css<br />
  &lt;/files&gt;</p>
<p>&lt;ifmodule mod_rewrite.c&gt;<br />
  RewriteEngine On<br />
  RewriteBase /</p>
<p>RewriteCond %{REQUEST_FILENAME} !-f<br />
  RewriteCond %{REQUEST_FILENAME} !-d<br />
  RewriteRule . /index.php [L]</p>
<p>RewriteCond %{HTTP:Accept-encoding} gzip<br />
  RewriteCond %{REQUEST_FILENAME}.gz -f<br />
  RewriteRule ^(.*).css $1.css.gz [L,QSA]</p>
<p>RewriteCond %{HTTP:Accept-encoding} gzip<br />
  RewriteCond %{REQUEST_FILENAME}.gz -f<br />
  RewriteRule ^(.*).js $1.js.gz [L,QSA]</p>
<p>RewriteRule (.*.css$|.*.js$) gzip.php?$1 [L]<br />
  &lt;/ifmodule&gt;</p>
</blockquote>
<p>2、增加gzip.php</p>
<p><strong>页面方面：</strong><br />
在根目录中找到 wp-load.php，加上代码：</p>
<pre name="code" class="php">
if(ereg('gzip',$_SERVER['HTTP_ACCEPT_ENCODING'])){ //判断浏览器是否支持Gizp
if(substr($_SERVER['REQUEST_URI'],0,10)!='/wp-content/uploads/') //排除不需要Gzip压缩的目录
ob_start('ob_gzhandler'); //打开Gzip压缩
}
</pre>
<p><em>Ps：很多人的博文里是说是在index.php里加，这样一来，后台页面是不压缩的，而加在wp-load.php就是全站压缩了。</em></p>
<p><strong>其他方法：<br />
方法1：</strong><br />
如果服务器支持.htaccess文件，那么在wordpress根目录的.htaccess增加以下代码，如果没有.htaccess则新建后增加代码。增加完成后上传到wordpress根目录后即可。</p>
<blockquote><p>php_value output_handler ob_gzhandler</p></blockquote>
<p><strong>方法2：</strong> <span style="color:red">非常推荐此方法，但是需要服务器支持改写php.ini</span></p>
<blockquote><p>
通过php.ini 启用Gzip, 添加如下代码来开启gzip。<br />
output_buffering = Off<br />
output_handler =<br />
zlib.output_compression = On<br />
zlib.output_compression_level = 6<br />
;zlib.output_compression_level = 一个1—9的值,1的压缩比率最低, 建议取大于6
</p></blockquote>
<p><em>需要注意的是如果在.htaccess文件中禁止了gzip功能的话，那在php.ini文件中开启后需在.htaccess文件中开启，否则无效。<br />
开启wordpress的gzip功能后，服务器将在页面传输前将页面压缩后传送，可以有效减少服务器的带宽使用，也可以加速页面下载。</em></p>
<h2  class="related_post_title">Other Posts / 其他文章</h2><ul class="related_post"><li><a href="http://slj.me/2010/03/light-web-useful-firefox-ie-plugin/" title="“点亮网页”：一个实用的Firefox和IE插件">“点亮网页”：一个实用的Firefox和IE插件</a></li><li><a href="http://slj.me/2010/03/%e4%b8%8b%e8%bd%bd-dojo-%e4%b8%ad%e6%96%87%e6%89%8b%e5%86%8c%e3%80%8a%e5%ae%9e%e6%88%98dojo%e5%b7%a5%e5%85%b7%e5%8c%85%e3%80%8bpdf/" title="[下载] Dojo 中文手册《实战Dojo工具包》PDF">[下载] Dojo 中文手册《实战Dojo工具包》PDF</a></li><li><a href="http://slj.me/2010/03/13-google-chrome-plugin/" title="为网页开发者准备的13个Google Chrome浏览器扩展">为网页开发者准备的13个Google Chrome浏览器扩展</a></li><li><a href="http://slj.me/2009/04/w3c-html5-exciting-new-features/" title="W3C小组公布HTML5激动人心的特性">W3C小组公布HTML5激动人心的特性</a></li><li><a href="http://slj.me/2010/01/whats-new-for-meeplace-2-4/" title="What&#8217;s New for MeePlace 2.4?">What&#8217;s New for MeePlace 2.4?</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://slj.me/2009/07/gzip%e4%b8%87%e8%83%bd%e5%ba%94%e7%94%a8/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>PHP中的时区设置 PHP TimeZone</title>
		<link>http://slj.me/2009/06/php-timezone-setting/</link>
		<comments>http://slj.me/2009/06/php-timezone-setting/#comments</comments>
		<pubDate>Thu, 18 Jun 2009 05:28:45 +0000</pubDate>
		<dc:creator>SLJ</dc:creator>
				<category><![CDATA[Apache/Nginx]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[php.ini]]></category>
		<category><![CDATA[timezone]]></category>
		<category><![CDATA[时区]]></category>

		<guid isPermaLink="false">http://kiya.cn/?p=517</guid>
		<description><![CDATA[PHP5.0之后增加了timezone的设定，默认为UTC，直接使用date会导致时间显示不正确。 可在使用date前加入 date_default_timezone_set(&#8220;Asia/Chongqing&#8221;); 或在php.ini中加入 date.timezone = &#8220;Asia/Chongqing&#8221; 或在时间戳上加上8小时 echo gmdate(&#8216;Y-m-d H:m:s&#8216;, time()+8*3600); Related Posts / 相关文章疯狂的 Web 应用开源项目[转] 代替bash，书写 PHP daemon 后台程序Xdebug for php 一个实用的PHP调试扩展PHP 实现多服务器共享 SESSION 数据PHP ini_set() 无效的原因]]></description>
			<content:encoded><![CDATA[<p>PHP5.0之后增加了timezone的设定，默认为UTC，直接使用date会导致时间显示不正确。</p>
<p>可在使用date前加入</p>
<blockquote><p>date_default_timezone_set(&#8220;Asia/Chongqing&#8221;);</p></blockquote>
<p>或在php.ini中加入</p>
<blockquote><p>date.timezone = &#8220;Asia/Chongqing&#8221;</p></blockquote>
<p>或在时间戳上加上8小时</p>
<blockquote>
<p style="background-color: #ffffff;"><span style="color: #000000;"><span style="color: green;">echo</span><span style="color: gray;"> </span><span style="color: blue;">gmdate</span><span style="color: olive;">(</span><span style="color: #8b0000;">&#8216;</span><span style="color: red;">Y-m-d H:m:s</span><span style="color: #8b0000;">&#8216;</span><span style="color: gray;">, </span><span style="color: blue;">time</span><span style="color: olive;">()</span><span style="color: gray;">+</span><span style="color: maroon;">8</span><span style="color: gray;">*</span><span style="color: maroon;">3600</span><span style="color: olive;">)</span><span style="color: gray;">;</span></span></p>
</blockquote>
<h2  class="related_post_title">Related Posts / 相关文章</h2><ul class="related_post"><li><a href="http://slj.me/2011/08/web-open-source-project/" title="疯狂的 Web 应用开源项目">疯狂的 Web 应用开源项目</a></li><li><a href="http://slj.me/2011/06/php-daemon-notice/" title="[转] 代替bash，书写 PHP daemon 后台程序">[转] 代替bash，书写 PHP daemon 后台程序</a></li><li><a href="http://slj.me/2011/04/xdebug-for-php/" title="Xdebug for php 一个实用的PHP调试扩展">Xdebug for php 一个实用的PHP调试扩展</a></li><li><a href="http://slj.me/2011/02/php-share-session-between-servers/" title="PHP 实现多服务器共享 SESSION 数据">PHP 实现多服务器共享 SESSION 数据</a></li><li><a href="http://slj.me/2010/12/php-ini_set-fail-reason/" title="PHP ini_set() 无效的原因">PHP ini_set() 无效的原因</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://slj.me/2009/06/php-timezone-setting/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>好书推荐-《PHP与MySQL程序设计（第3版）》</title>
		<link>http://slj.me/2009/05/book-beginingphpandmysql/</link>
		<comments>http://slj.me/2009/05/book-beginingphpandmysql/#comments</comments>
		<pubDate>Sat, 02 May 2009 15:02:32 +0000</pubDate>
		<dc:creator>SLJ</dc:creator>
				<category><![CDATA[Apache/Nginx]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[好书]]></category>
		<category><![CDATA[推荐]]></category>
		<category><![CDATA[程序设计]]></category>
		<category><![CDATA[第3版]]></category>

		<guid isPermaLink="false">http://kiya.cn/?p=390</guid>
		<description><![CDATA[     上了大学，在图书馆看了很多的书，各个方面从UI一直到PHP，自我感觉比较好的书不多，特别是UI方面的书，好的书很少。身边有的学习HTML的同学，我把他们借的书翻开目录一看就帮他们删章节，因为有的章节看了也没用，比如“如何用表格布局网页”，这已经是淘汰的技术了，只能稍微了解了解，不能养成习惯。      我认为，一本介绍计算机技术的书，应该以实用为主，全面为辅。例如，有些HTML书介绍标签介绍的非常全面（恰恰没有HTML5中的canvas这一类重要标签），然而我们平时的使用几乎用不到那些“全面的”标签（比如&#60;font&#62;之类被淘汰的标签等），而重要的部分如“不同浏览器的hack”这一基本的内容却没有介绍到。      其实好的书还是有的，我认为图灵以及人民邮电出版社的部分图书我最喜欢，      我会相继在我博客贴上我所看过的好书，敬请关注。 《PHP与MySQL程序设计（第3版）》        先说说这本书，PHP方面的基础类图书，我最喜欢的是这本，虽然厚了一点，但是说的非常全面，也很实用，特别是“高级OOP面向对象编程”以及后面的 Smarty、MVC的部分都很 up-to-date，我认为这本书作为PHP起步来说很值得读，后几章介绍数据库的内容也很好。        喜欢的同学可以去网上买，或者图书馆也能借得到（有一本目前还在我的^_^）         下面是转载来的图书信息。 【内容简介】         PHP语言和 MySQL 数据库这两种开源技术已经成为开发Web应用的最佳组合。Web 2.0为它们提供了更广阔的天地。 　　本书全面介绍PHP脚本语言和MySQL数据库这两种目前最流行的开源软件，主要内容包括PHP和MySQL基本概念、PHP扩展与应用库、日期和时间功能、PHP数据对象扩展、PHP的mysqli扩展、MySQL 5的存储例程、触发器和视图等。本书实用性强，帮助读者学习PHP编程语言和MySQL数据库服务器的最佳实践，了解如何结合这些卓越的技术创建数据库驱动的动态Web应用程序。 　　本书适合于Web开发的新手阅读，也适合作为各层次PHP和MySQL开发人员的参考书。        本书是久负盛名的经典著作，以内容全面、讲解翔实而著称。书中对主题的选取和组织从实用出发，在讲述知识之外还加入了作者多年积累的宝贵实战经验，并提供了500多个可以直接用于实际项目的代码示例，充分体现了作者深厚的开发功力。这一版不仅对原有章节进行了全面的修订、更新和改进，还加入了PHP 6和MySQL最新版本中的新特性，包括如何利用国际化和本地化开源工具创建面向全世界的Web网站，开发强大Web应用的利器MVC模式与Zend框架。.. 作者为本书专门开设了配套网站http://www.beginningphpandmysql.com，也可以通过Twitter（http://twitter.com/begphpandmysql）了解更多信息。&#8230; 【作译者介绍】 本书提供作译者介绍 W. Jason Gilmore，世界知名的软件技术专家，CodeMash技术大会创始人之一，MySQL全球技术大会顾问委员会成员。他曾负责Apress出版公司开源图书出版项目，开发了大量PHP和MySQL应用程序，并在各大专业媒体发表了众多有影响的技术文章。他的个人网站是http://www.wjgilmore.com。&#8230; 【前言】 最好的编程图书应该不是纯粹地讲述理论，而是要切合实际。虽然我没有幻想自己会成为当代最伟大的技术作家，但在写书过程中，我一直都以此为目标，努力让所写的内容能用到实处。以本书的篇幅来看，很明显，我在竭尽所能地提供这种实用性。也就是说，如果你希望获得PHP编程语言和MySQL数据库服务器的实践经验，对它们有全面的了解，并且想知道如何结合这些卓越的技术创建数据库驱动的动态Web应用程序，那么本书正合你所需。. 各个PHP和MySQL社区的狂热工作促使了本书新版本的诞生，它较之前的版本有了很大的变化。本版不但加入了PHP 6和最新的MySQL版本中出现的新特性，还另外增加了两章全新的内容。 【目录信息】 第1章　PHP概述　1 1.1　历史　1 1.1.1　PHP 4　2 1.1.2　PHP 5　3 1.2　PHP的一般特性　3 1.2.1　实用性　3 1.2.2　强大功能　4 1.2.3　可选择性　4 1.2.4　成本　5 1.3　小结　5 第2章　安装配置Apache和PHP　6 2.1　安装　6 2.1.1　获得发行包　6 2.1.2　安装过程　7 2.1.3　测试安装　11 [...]]]></description>
			<content:encoded><![CDATA[<p><span style="color: #000080;">     上了大学，在图书馆看了很多的书，各个方面从UI一直到PHP，自我感觉比较好的书不多，特别是UI方面的书，好的书很少。身边有的学习HTML的同学，我把他们借的书翻开目录一看就帮他们删章节，因为有的章节看了也没用，比如“如何用表格布局网页”，这已经是淘汰的技术了，只能稍微了解了解，不能养成习惯。<br />
     我认为，一本介绍计算机技术的书，<span style="text-decoration: underline;">应该以实用为主，全面为辅</span>。例如，有些HTML书介绍标签介绍的非常全面（恰恰没有HTML5中的canvas这一类重要标签），然而我们平时的使用几乎用不到那些“全面的”标签（比如&lt;font&gt;之类被淘汰的标签等），而重要的部分如“不同浏览器的hack”这一基本的内容却没有介绍到。<br />
</span><span style="color: #000080;">     其实好的书还是有的，我认为图灵以及人民邮电出版社的部分图书我最喜欢，<br />
<span style="color: #000080;">     </span>我会相继在我博客贴上我所看过的好书，敬请关注。</span></p>
<h3 style="text-align: center;"><span style="color: #900;">《PHP与MySQL程序设计（第3版）》</span></h3>
<p><span style="color: #800000;">       先说说这本书，PHP方面的基础类图书，我最喜欢的是这本，虽然厚了一点，但是说的非常全面，也很实用，特别是“高级OOP面向对象编程”以及后面的 Smarty、MVC的部分都很 up-to-date，我认为这本书作为PHP起步来说很值得读，后几章介绍数据库的内容也很好。<br />
       喜欢的同学可以去网上买，或者图书馆也能借得到（有一本目前还在我的^_^）<br />
        </span><span style="color: #800000;">下面是转载来的图书信息。<br />
</span><br />
<img class="alignnone size-full wp-image-391" style="float:left; margin:20px;" title="book-phpmysql" src="http://kiya.cn/wp-content/uploads/2009/05/1_2009042918061218iua.jpg" alt="book-phpmysql" width="142" height="184" /></p>
<p><strong>【内容简介】</strong><br />
        PHP语言和 MySQL 数据库这两种开源技术已经成为开发Web应用的最佳组合。Web 2.0为它们提供了更广阔的天地。<br />
<span id="ctl00_ContentPlaceHolder1_DetailsView1_DESCRIPTIONLabel">　　本书全面介绍PHP脚本语言和MySQL数据库这两种目前最流行的开源软件，主要内容包括PHP和MySQL基本概念、PHP扩展与应用库、日期和时间功能、PHP数据对象扩展、PHP的mysqli扩展、MySQL 5的存储例程、触发器和视图等。本书实用性强，帮助读者学习PHP编程语言和MySQL数据库服务器的最佳实践，了解如何结合这些卓越的技术创建数据库驱动的动态Web应用程序。<br />
　　本书适合于Web开发的新手阅读，也适合作为各层次PHP和MySQL开发人员的参考书。</span> <br />
     <span id="more-390"></span> 本书是久负盛名的经典著作，以内容全面、讲解翔实而著称。书中对主题的选取和组织从实用出发，在讲述知识之外还加入了作者多年积累的宝贵实战经验，并提供了500多个可以直接用于实际项目的代码示例，充分体现了作者深厚的开发功力。这一版不仅对原有章节进行了全面的修订、更新和改进，还加入了PHP 6和MySQL最新版本中的新特性，包括如何利用国际化和本地化开源工具创建面向全世界的Web网站，开发强大Web应用的利器MVC模式与Zend框架。..</p>
<p>作者为本书专门开设了配套网站<a href="http://www.beginningphpandmysql.com/" target="_blank"><span style="color: #07519a;">http://www.beginningphpandmysql.com</span></a>，也可以通过Twitter（<a href="http://twitter.com/begphpandmysql" target="_blank"><span style="color: #07519a;">http://twitter.com/begphpandmysql</span></a>）了解更多信息。&#8230;</p>
<p><img class="alignnone size-full wp-image-415" style="float:right; margin:10px;" title="PHPandMYSQL" src="http://kiya.cn/wp-content/uploads/2009/05/1590598627.gif" alt="PHPandMYSQL" width="120" height="150" /><strong>【作译者介绍】</strong><br />
本书提供作译者介绍<br />
W. Jason Gilmore，世界知名的软件技术专家，CodeMash技术大会创始人之一，MySQL全球技术大会顾问委员会成员。他曾负责Apress出版公司开源图书出版项目，开发了大量PHP和MySQL应用程序，并在各大专业媒体发表了众多有影响的技术文章。他的个人网站是<a href="http://www.wjgilmore.com/" target="_blank"><span style="color: #07519a;">http://www.wjgilmore.com</span></a>。&#8230;</p>
<p><strong>【前言】</strong><br />
最好的编程图书应该不是纯粹地讲述理论，而是要切合实际。虽然我没有幻想自己会成为当代最伟大的技术作家，但在写书过程中，我一直都以此为目标，努力让所写的内容能用到实处。以本书的篇幅来看，很明显，我在竭尽所能地提供这种实用性。也就是说，如果你希望获得PHP编程语言和MySQL数据库服务器的实践经验，对它们有全面的了解，并且想知道如何结合这些卓越的技术创建数据库驱动的动态Web应用程序，那么本书正合你所需。.<br />
各个PHP和MySQL社区的狂热工作促使了本书新版本的诞生，它较之前的版本有了很大的变化。本版不但加入了PHP 6和最新的MySQL版本中出现的新特性，还另外增加了两章全新的内容。</p>
<p><strong>【目录信息】</strong></p>
<blockquote><p>第1章　PHP概述　1<br />
1.1　历史　1<br />
1.1.1　PHP 4　2<br />
1.1.2　PHP 5　3<br />
1.2　PHP的一般特性　3<br />
1.2.1　实用性　3<br />
1.2.2　强大功能　4<br />
1.2.3　可选择性　4<br />
1.2.4　成本　5<br />
1.3　小结　5</p>
<p>第2章　安装配置Apache和PHP　6<br />
2.1　安装　6<br />
2.1.1　获得发行包　6<br />
2.1.2　安装过程　7<br />
2.1.3　测试安装　11<br />
2.1.4　定制UNIX构建　12<br />
2.1.5　定制Windows构建　12<br />
2.1.6　常见错误　13<br />
2.1.7　查看并下载文档　13<br />
2.2　配置　13<br />
2.2.1　管理PHP的配置指令　14<br />
2.2.2　PHP的配置指令　15<br />
2.3　小结　29</p>
<p>第3章　PHP基础　30<br />
3.1　界定PHP代码　30<br />
3.1.1　默认语法　30<br />
3.1.2　短标记　31<br />
3.1.3　脚本　31<br />
3.1.4　ASP风格　32<br />
3.1.5　嵌入多个代码块　32<br />
3.2　注释　32<br />
3.2.1　单行C++语法　32<br />
3.2.2　Shell语法　32<br />
3.2.3　多行C语法　33<br />
3.3　输出　33<br />
3.3.1　print()　33<br />
3.3.2　echo()　34<br />
3.3.3　printf()　34<br />
3.3.4　sprintf()　35<br />
3.4　数据类型　35<br />
3.4.1　标量数据类型　35<br />
3.4.2　复合数据类型　37<br />
3.4.3　特殊数据类型　38<br />
3.4.4　类型强制转换　38<br />
3.4.5　类型自动转换　39<br />
3.4.6　与类型有关的函数　40<br />
3.4.7　类型标识符函数　40<br />
3.5　标识符　41<br />
3.6　变量　41<br />
3.6.1　变量声明　42<br />
3.6.2　变量作用域　43<br />
3.6.3　PHP的超级全局变量　45<br />
3.6.4　变量的变量　48<br />
3.7　常量　49<br />
3.8　表达式　49<br />
3.8.1　操作数　50<br />
3.8.2　操作符　50<br />
3.9　字符串插入　54<br />
3.9.1　双引号　55<br />
3.9.2　单引号　55<br />
3.9.3　Heredoc　56<br />
3.10　控制结构　56<br />
3.10.1　执行控制语句　57<br />
3.10.2　条件语句　57<br />
3.10.3　循环语句　59<br />
3.10.4　文件包含语句　63<br />
3.10.5　require_once()　65<br />
3.11　小结　65</p>
<p>第4章　函数　66<br />
4.1　调用函数　66<br />
4.2　创建函数　66<br />
4.2.1　按值传递参数　67<br />
4.2.2　按引用传递参数　68<br />
4.2.3　默认参数值　68<br />
4.2.4　可选参数　68<br />
4.2.5　从函数返回值　69<br />
4.2.6　嵌套函数　70<br />
4.2.7　递归函数　70<br />
4.2.8　变量函数　72<br />
4.3　函数库　73<br />
4.4　小结　74</p>
<p>第5章　数组　75<br />
5.1　什么是数组　75<br />
5.2　输出数组　76<br />
5.3　创建数组　77<br />
5.4　测试数组　79<br />
5.5　增加和删除数组元素　79<br />
5.6　定位数组元素　81<br />
5.7　遍历数组　82<br />
5.8　确定数组大小和唯一性　85<br />
5.9　数组排序　86<br />
5.10　合并、拆分、接合和分解数组　91<br />
5.11　其他有用的数组函数　95<br />
5.12　小结　96</p>
<p>第6章　面向对象的PHP　97<br />
6.1　OOP的好处　97<br />
6.1.1　封装　97<br />
6.1.2　继承　98<br />
6.1.3　多态　98<br />
6.2　关键的OOP概念　99<br />
6.2.1　类　99<br />
6.2.2　对象　99<br />
6.2.3　字段　100<br />
6.2.4　属性　102<br />
6.2.5　常量　104<br />
6.2.6　方法　105<br />
6.3　类型提示　108<br />
6.4　构造函数和析构函数　108<br />
6.4.1　构造函数　108<br />
6.4.2　析构函数　110<br />
6.5　静态类成员　111<br />
6.6　instanceof关键字　112<br />
6.7　辅助函数　112<br />
6.8　自动加载对象　114<br />
6.9　小结　114</p>
<p>第7章　高级OOP特性　115<br />
7.1　PHP不支持的高级OOP特性　115<br />
7.2　对象克隆　116<br />
7.2.1　克隆示例　116<br />
7.2.2　__clone()方法　117<br />
7.3　继承　118<br />
7.3.1　类继承　118<br />
7.3.2　继承和构造函数　120<br />
7.4　接口　121<br />
7.4.1　实现一个接口　122<br />
7.4.2　实现多个接口　123<br />
7.5　抽象类　124<br />
7.6　反射　124<br />
7.6.1　编写ReflectionClass类　125<br />
7.6.2　编写ReflectionMethod类　127<br />
7.6.3　编写ReflectionParameter类　128<br />
7.6.4　编写ReflectionProperty类　129<br />
7.6.5　反射的其他用途　130<br />
7.7　小结　130</p>
<p>第8章　错误和异常处理　131<br />
8.1　配置指令　131<br />
8.2　错误日志　134<br />
8.3　异常处理　135<br />
8.3.1　为什么异常处理很方便　136<br />
8.3.2　PHP的异常处理实现　137<br />
8.4　小结　140</p>
<p>第9章　字符串和正则表达式　141<br />
9.1　复杂(大括号)偏移语法　141<br />
9.2　正则表达式　142<br />
9.2.1　正则表达式语法(POSIX)　142<br />
9.2.2　PHP的正则表达式函数(POSIX扩展)　144<br />
9.2.3　正则表达式语法(Perl风格)　146<br />
9.3　其他字符串函数　151<br />
9.3.1　确定字符串长度　152<br />
9.3.2　比较两个字符串　152<br />
9.3.3　处理字符串大小写　154<br />
9.3.4　字符串与HTML相互转换　155<br />
9.3.5　正则表达式函数的替代函数　159<br />
9.3.6　填充和剔除字符串　164<br />
9.3.7　字符和单词计数　165<br />
9.4　使用PEAR：Validate_US　167<br />
9.4.1　安装Validate_US　167<br />
9.4.2　使用Validate_US　168<br />
9.5　小结　168</p>
<p>第10章　处理文件和操作系统　169<br />
10.1　了解文件和目录　169<br />
10.1.1　解析目录路径　169<br />
10.1.2　文件类型和链接　171<br />
10.1.3　计算文件、目录和磁盘大小　173<br />
10.1.4　访问和修改时间　175<br />
10.2　文件所有权和权限　176<br />
10.3　文件I/O　178<br />
10.3.1　资源的概念　178<br />
10.3.2　换行　178<br />
10.3.3　文件末尾　178<br />
10.3.4　打开和关闭文件　179<br />
10.3.5　读取文件　180<br />
10.3.6　移动文件指针　184<br />
10.3.7　写入文件　184<br />
10.3.8　读取目录内容　185<br />
10.4　执行Shell命令　186<br />
10.5　系统级程序执行　187<br />
10.5.1　清理输入　187<br />
10.5.2　PHP的程序执行函数　188<br />
10.6　小结　190</p>
<p>第11章　PEAR　191<br />
11.1　流行的PEAR包　191<br />
11.2　安装和更新PEAR　193<br />
11.2.1　安装PEAR　193<br />
11.2.2　PEAR和ISP公司　194<br />
11.2.3　更新PEAR　194<br />
11.3　使用PEAR包管理器　194<br />
11.3.1　查看安装的包　195<br />
11.3.2　了解安装包的更多信息　195<br />
11.3.3　安装PEAR包　196<br />
11.3.4　使用PEAR包　197<br />
11.3.5　升级PEAR包　198<br />
11.3.6　卸载PEAR包　198<br />
11.3.7　降级PEAR包　199<br />
11.4　小结　199</p>
<p>第12章　日期和时间　200<br />
12.1　UNIX时间戳　200<br />
12.2　PHP的日期和时间库　200<br />
12.3　日期函数　206<br />
12.3.1　显示本地化的日期和时间　206<br />
12.3.2　显示网页的最新修改日期　209<br />
12.3.3　确定当前月份中的天数　209<br />
12.3.4　计算当前日期后X天的日期　209<br />
12.3.5　创建日历　210<br />
12.4　PHP 5.1　213<br />
12.4.1　Date基础　213<br />
12.4.2　Date构造函数　213<br />
12.4.3　访问方法和修改方法　214<br />
12.4.4　验证函数　216<br />
12.4.5　处理方法　216<br />
12.5　小结　222</p>
<p>第13章　表单和导航提示　223<br />
13.1　PHP和Web表单　223<br />
13.1.1　简单示例　224<br />
13.1.2　向函数传递表单数据　225<br />
13.1.3　处理多值表单组件　226<br />
13.1.4　用PHP生成表单　227<br />
13.1.5　自动选择表单数据　228<br />
13.1.6　PHP、Web表单和JavaScript　229<br />
13.2　导航提示　231<br />
13.2.1　用户友好的URL　231<br />
13.2.2　“面包屑型”轨迹　233<br />
13.2.3　创建定制错误处理函数　237<br />
13.3　小结　238</p>
<p>第14章　身份认证　239<br />
14.1　HTTP认证概念　239<br />
14.2　PHP认证　240<br />
14.2.1　认证变量　240<br />
14.2.2　认证方法　241<br />
14.3　用户登录管理　248<br />
14.3.1　密码指派　248<br />
14.3.2　使用CrackLib库测试密码易猜性　250<br />
14.3.3　一次性URL和密码恢复　251</p>
<p>第15章　处理文件上传　254<br />
15.1　通过HTTP协议上传文件　254<br />
15.2　通过PHP处理上传　255<br />
15.2.1　PHP的文件上传/资源指令　255<br />
15.2.2　$_FILES数组　256<br />
15.2.3　PHP的文件上传函数　256<br />
15.2.4　上传错误消息　258<br />
15.2.5　文件上传示例　258<br />
15.3　利用PEAR：HTTP_Upload　261<br />
15.3.1　安装HTTP_Upload　261<br />
15.3.2　了解关于上传文件的更多信息　262<br />
15.3.3　将上传的文件移动到最终目标　263<br />
15.3.4　上传多个文件　263<br />
15.4　小结　264</p>
<p>第16章　网络　265<br />
16.1　DNS、服务器和服务　265<br />
16.1.1　DNS　265<br />
16.1.2　服务　268<br />
16.1.3　建立套接字连接　269<br />
16.2　邮件　271<br />
16.2.1　配置指令　271<br />
16.2.2　发送纯文本电子邮件　272<br />
16.2.3　使用额外的信息首部发送电子邮件　272<br />
16.2.4　将电子邮件发送给多个接收者　273<br />
16.2.5　发送HTML格式的电子邮件　273<br />
16.2.6　发送附件　274<br />
16.3　IMAP、POP3和NNTP　275<br />
16.3.1　需求　276<br />
16.3.2　建立和关闭连接　276<br />
16.3.3　了解更多关于邮箱和邮件的信息　277<br />
16.3.4　获取邮件　280<br />
16.3.5　写邮件　286<br />
16.3.6　发送邮件　286<br />
16.3.7　邮箱管理　287<br />
16.3.8　邮件管理　288<br />
16.4　流　288<br />
16.4.1　流包装器和上下文　289<br />
16.4.2　流过滤器　290<br />
16.5　常见网络任务　291<br />
16.5.1　连接一台服务器　291<br />
16.5.2　端口扫描器　292<br />
16.5.3　子网转换器　293<br />
16.5.4　测试用户带宽　294<br />
16.6　小结　295</p>
<p>第17章　PHP和LDAP　296<br />
17.1　LDAP介绍　297<br />
17.2　在PHP中使用LDAP　297<br />
17.2.1　连接到LDAP服务器　297<br />
17.2.2　绑定到LDAP服务器　298<br />
17.2.3　关闭LDAP服务器连接　299<br />
17.2.4　获取LDAP数据　299<br />
17.2.5　处理项值　301<br />
17.2.6　统计所获取的项　302<br />
17.2.7　获取属性　302<br />
17.2.8　排序和比较LDAP项　305<br />
17.2.9　处理项　306<br />
17.2.10　回收内存　308<br />
17.2.11　插入LDAP数据　309<br />
17.2.12　更新LDAP数据　309<br />
17.2.13　删除LDAP数据　310<br />
17.2.14　配置函数　311<br />
17.2.15　字符编码　312<br />
17.2.16　处理区分名　312<br />
17.2.17　错误处理　313<br />
17.3　小结　314</p>
<p>第18章　会话处理器　315<br />
18.1　什么是会话处理　315<br />
18.1.1　cookie　315<br />
18.1.2　URL重写　316<br />
18.1.3　会话处理过程　316<br />
18.2　配置指令　317<br />
18.3　关键概念　320<br />
18.3.1　开始会话　320<br />
18.3.2　销毁会话　321<br />
18.3.3　获取和设置会话ID　321<br />
18.3.4　创建和删除会话变量　321<br />
18.3.5　编码和解码会话数据　322<br />
18.4　实际的会话处理示例　324<br />
18.4.1　自动登录　324<br />
18.4.2　最近浏览的文档索引　325<br />
18.5　创建定制会话处理器　327<br />
18.5.1　将定制会话函数加入到PHP逻辑　327<br />
18.5.2　基于MySQL的定制会话处理器　328<br />
18.6　小结　330</p>
<p>第19章　用Smarty模板化　331<br />
19.1　什么是模板化引擎　331<br />
19.2　Smarty介绍　333<br />
19.3　安装Smarty　333<br />
19.4　使用Smarty　334<br />
19.5　Smarty的表现逻辑　336<br />
19.5.1　注释　336<br />
19.5.2　变量修饰符　336<br />
19.5.3　控制结构　339<br />
19.5.4　语句　342<br />
19.6　创建配置文件　344<br />
19.6.1　config_load　345<br />
19.6.2　引用配置变量　345<br />
19.7　结合Smarty使用CSS　346<br />
19.8　缓存　347<br />
19.8.1　处理缓存生命期　347<br />
19.8.2　通过is_cached()消除处理开销　348<br />
19.8.3　为每个模板创建多个缓存　348<br />
19.8.4　关于缓存的结束语　349<br />
19.9　小结　350</p>
<p>第20章　Web服务　351<br />
20.1　为什么使用Web服务　352<br />
20.2　真正简单聚合　353<br />
20.2.1　RSS语法　355<br />
20.2.2　MagpieRSS　356<br />
20.3　SimpleXML　361<br />
20.3.1　SimpleXML函数　362<br />
20.3.2　SimpleXML方法　363<br />
20.4　SOAP　365<br />
20.4.1　NuSOAP　366<br />
20.4.2　PHP 5的SOAP扩展　374<br />
20.5　使用PHP Web服务和C#客户　381<br />
20.6　小结　383</p>
<p>第21章　安全PHP编程　384<br />
21.1　安全地配置PHP　384<br />
21.1.1　安全模式　385<br />
21.1.2　其他与安全有关的配置参数　386<br />
21.2　隐藏配置细节　388<br />
21.3　隐藏敏感数据　389<br />
21.3.1　注意文档根目录　390<br />
21.3.2　拒绝访问某些文件扩展名　390<br />
21.4　清理用户数据　390<br />
21.4.1　文件删除　390<br />
21.4.2　跨网站脚本　391<br />
21.4.3　清理用户输入：解决方案　392<br />
21.5　数据加密　394<br />
21.5.1　PHP的加密函数　394<br />
21.5.2　mhash　395<br />
21.5.3　MCrypt　396<br />
21.6　小结　397</p>
<p>第22章　SQLite　398<br />
22.1　SQLite介绍　398<br />
22.1.1　安装SQLite　398<br />
22.1.2　使用SQLite命令行界面　399<br />
22.2　PHP的SQLite库　400<br />
22.2.1　SQLite指令　400<br />
22.2.2　打开连接　400<br />
22.2.3　在内存中创建表　401<br />
22.2.4　关闭连接　401<br />
22.2.5　查询数据库　402<br />
22.2.6　解析结果集　403<br />
22.2.7　获取结果集细节　405<br />
22.2.8　操作结果集指针　406<br />
22.2.9　了解表模式的更多信息　408<br />
22.2.10　操作二进制数据　408<br />
22.2.11　创建和覆盖SQLite函数　409<br />
22.2.12　创建聚集函数　410<br />
22.3　小结　411</p>
<p>第23章　PDO介绍　412<br />
23.1　为什么还要另一种数据库抽象层　413<br />
23.2　使用PDO　413<br />
23.2.1　安装PDO　414<br />
23.2.2　PDO的数据库支持　414<br />
23.2.3　连接到数据库服务器并选择数据库　415<br />
23.2.4　存取属性　416<br />
23.2.5　错误处理　417<br />
23.2.6　查询执行　417<br />
23.2.7　准备语句　418<br />
23.2.8　获取数据　421<br />
23.2.9　设置绑定列　423<br />
23.2.10　事务　424<br />
23.3　小结　425</p>
<p>第24章　MySQL介绍　426<br />
24.1　MySQL为什么如此流行　426<br />
24.1.1　灵活性　426<br />
24.1.2　强大功能　427<br />
24.1.3　灵活的许可选择　428<br />
24.1.4　超级活跃的用户群体　429<br />
24.2　MySQL 4　429<br />
24.3　MySQL 5　430<br />
24.4　著名的MySQL用户　430<br />
24.4.1　craigslist　430<br />
24.4.2　雅虎财经　431<br />
24.4.3　维基百科　431<br />
24.5　小结　431</p>
<p>第25章　安装和配置MySQL　432<br />
25.1　PHP和MySQL许可问题　432<br />
25.1.1　Linux　433<br />
25.1.2　Windows　433<br />
25.2　下载MySQL　433<br />
25.3　安装MySQL　434<br />
25.3.1　Linux　434<br />
25.3.2　Windows　437<br />
25.4　设置MySQL管理员密码　439<br />
25.5　启动和停止MySQL　439<br />
25.5.1　手工控制守护进程　439<br />
25.5.2　自动启动和停止MySQL　441<br />
25.6　配置和优化MySQL　442<br />
25.6.1　mysqld_safe　443<br />
25.6.2　配置和优化参数　443<br />
25.6.3　my.cnf文件　446<br />
25.7　小结　448</p>
<p>第26章　众多MySQL客户端　449<br />
26.1　标准客户端选项　449<br />
26.2　连接选项　450<br />
26.3　一般选项　450<br />
26.4　mysql　451<br />
26.4.1　关键mysql选项　451<br />
26.4.2　以交互模式使用mysql　452<br />
26.4.3　查看配置变量和系统状态　454<br />
26.4.4　以批处理模式使用mysql　455<br />
26.4.5　有用的mysql提示　456<br />
26.5　mysqladmin　458<br />
26.6　其他实用工具　459<br />
26.6.1　mysqldump　459<br />
26.6.2　mysqlshow　459<br />
26.6.3　mysqlhotcopy　460<br />
26.6.4　mysqlimport　460<br />
26.6.5　myisamchk　461<br />
26.6.6　mysqlcheck　461<br />
26.7　第三方客户端程序　462<br />
26.7.1　MySQL管理器　462<br />
26.7.2　phpMyAdmin　463<br />
26.7.3　MySQL查询浏览器　464<br />
26.7.4　Navicat　465<br />
26.8　小结　466</p>
<p>第27章　MySQL存储引擎和数据类型　467<br />
27.1　存储引擎　467<br />
27.1.1　InnoDB　468<br />
27.1.2　MyISAM　468<br />
27.1.3　MEMORY　470<br />
27.1.4　MERGE　471<br />
27.1.5　BDB　471<br />
27.1.6　FEDERATED　471<br />
27.1.7　ARCHIVE　472<br />
27.1.8　CSV　473<br />
27.1.9　EXAMPLE　473<br />
27.1.10　BLACKHOLE　473<br />
27.1.11　存储引擎FAQ　473<br />
27.2　数据类型和属性　475<br />
27.2.1　数据类型　475<br />
27.2.2　数据类型属性　479<br />
27.3　操作数据库和表　481<br />
27.3.1　操作数据库　481<br />
27.3.2　操作表　483<br />
27.3.3　修改表结构　485<br />
27.3.4　INFORMATION_SCHEMA　485<br />
27.4　小结　487</p>
<p>第28章　保护MySQL的安全　488<br />
28.1　首先应当做什么　488<br />
28.2　保护mysqld守护进程　489<br />
28.3　MySQL访问权限系统　489<br />
28.3.1　权限系统的工作方式　490<br />
28.3.2　访问信息存储在哪里　491<br />
28.4　用户和权限管理　498<br />
28.4.1　CREATE USER　498<br />
28.4.2　DROP USER　499<br />
28.4.3　RENAME USER　499<br />
28.4.4　GRANT和REVOKE命令　499<br />
28.4.5　查看权限　503<br />
28.5　限制用户资源　503<br />
28.6　保护MySQL连接　504<br />
28.6.1　授权选项　504<br />
28.6.2　SSL选项　505<br />
28.6.3　启动启用SSL的MySQL服务器　506<br />
28.6.4　使用启用SSL的客户端进行连接　506<br />
28.6.5　在my.cnf文件中存储SSL选项　506<br />
28.7　小结　507</p>
<p>第29章　PHP的MySQL扩展　508<br />
29.1　预备工作　508<br />
29.1.1　在Linux中启用MySQL扩展　508<br />
29.1.2　在Windows中启用MySQL扩展　508<br />
29.1.3　用户权限　509<br />
29.1.4　示例数据　509<br />
29.2　PHP的MySQL命令　509<br />
29.2.1　建立和关闭连接　509<br />
29.2.2　在单独的文件中存储连接信息　511<br />
29.2.3　保护连接信息　511<br />
29.3　选择数据库　512<br />
29.4　查询MySQL　512<br />
29.5　获取和显示数据　513<br />
29.6　插入数据　516<br />
29.7　修改数据　517<br />
29.8　删除数据　519<br />
29.9　所选择的记录和受影响的记录　520<br />
29.10　获取数据库和表的信息　521<br />
29.11　获取字段信息　523<br />
29.11.1　查看表属性　526<br />
29.11.2　获取错误信息　527<br />
29.12　辅助函数　528<br />
29.13　小结　530</p>
<p>第30章　PHP的mysqli扩展　531<br />
30.1　预备工作　532<br />
30.1.1　在UNIX中启用mysqli扩展　532<br />
30.1.2　在Windows中启用mysqli扩展　532<br />
30.1.3　示例数据　532<br />
30.2　使用mysqli扩展　532<br />
30.2.1　连接MySQL服务器　532<br />
30.2.2　连接错误报告　533<br />
30.2.3　选择一个MySQL数据库　535<br />
30.2.4　关闭MySQL连接　536<br />
30.3　查询　536<br />
30.3.1　查询执行　536<br />
30.3.2　回收查询内存　537<br />
30.3.3　准备结果集　538<br />
30.3.4　解析结果　539<br />
30.3.5　多个查询　542<br />
30.3.6　准备语句　543<br />
30.4　数据库事务　548<br />
30.5　小结　549</p>
<p>第31章　存储例程　550<br />
31.1　应当使用存储例程吗　550<br />
31.1.1　存储例程的优点　550<br />
31.1.2　存储例程的缺点　551<br />
31.2　MySQL如何实现存储例程　551<br />
31.2.1　存储例程权限表　551<br />
31.2.2　创建存储例程　553<br />
31.2.3　声明和设置变量　554<br />
31.2.4　执行存储例程　555<br />
31.2.5　多语句存储例程　556<br />
31.2.6　从另一个例程中调用例程　562<br />
31.2.7　修改存储例程　563<br />
31.2.8　删除存储例程　563<br />
31.2.9　查看例程状态　563<br />
31.2.10　查看例程的创建语法　564<br />
31.2.11　条件和处理器　564<br />
31.3　将例程集成到Web应用程序　565<br />
31.3.1　创建员工奖金界面　565<br />
31.3.2　获取多条记录　566<br />
31.4　小结　566</p>
<p>第32章　MySQL触发器　567<br />
32.1　介绍触发器　567<br />
32.1.1　为什么使用触发器　567<br />
32.1.2　在事件前采取行动　568<br />
32.1.3　在事件后采取行动　568<br />
32.1.4　前触发器和后触发器　569<br />
32.2　MySQL对触发器的支持　569<br />
32.2.1　创建触发器　570<br />
32.2.2　查看现有的触发器　571<br />
32.2.3　修改触发器　572<br />
32.2.4　删除触发器　572<br />
32.2.5　级联触发器　573<br />
32.3　将触发器集成到Web应用程序　574<br />
32.4　小结　575</p>
<p>第33章　视图　576<br />
33.1　视图概述　576<br />
33.2　MySQL对视图的支持　577<br />
33.2.1　创建和执行视图　577<br />
33.2.2　查看视图信息　581<br />
33.2.3　修改视图　582<br />
33.2.4　删除视图　583<br />
33.2.5　更新视图　583<br />
33.3　将视图结合到Web应用程序中　583<br />
33.4　小结　585</p>
<p>第34章　实用数据库查询　586<br />
34.1　示例数据　586<br />
34.2　用PEAR创建表格输出　587<br />
34.2.1　安装HTML_Table　587<br />
34.2.2　创建一个简单表　587<br />
34.2.3　创建更可读的行输出　589<br />
34.2.4　根据数据库数据创建表格　589<br />
34.2.5　一般化输出过程　591<br />
34.3　排序输出　593<br />
34.4　创建分页输出　594<br />
34.5　列出页码　597<br />
34.6　子查询　598<br />
34.6.1　用子查询完成比较　599<br />
34.6.2　用子查询确定存在性　599<br />
34.6.3　用子查询维护数据库　600<br />
34.6.4　在PHP中使用子查询　601<br />
34.7　游标　601<br />
34.7.1　游标基础　601<br />
34.7.2　创建游标　602<br />
34.7.3　打开游标　602<br />
34.7.4　使用游标　602<br />
34.7.5　关闭游标　603<br />
34.7.6　在PHP中使用游标　604<br />
34.8　小结　604</p>
<p>第35章　索引和搜索　605<br />
35.1　数据库索引　605<br />
35.1.1　主键索引　605<br />
35.1.2　唯一索引　606<br />
35.1.3　常规索引　607<br />
35.1.4　全文索引　608<br />
35.1.5　索引最佳实践　611<br />
35.2　基于表单的搜索　611<br />
35.2.1　执行简单搜索　612<br />
35.2.2　扩展搜索功能　613<br />
35.2.3　执行全文搜索　614<br />
35.3　小结　615</p>
<p>第36章　事务　616<br />
36.1　什么是事务　616<br />
36.2　MySQL的事务功能　616<br />
36.2.1　系统需求　617<br />
36.2.2　表创建　617<br />
36.2.3　InnoDB配置参数　618<br />
36.3　示例项目　619<br />
36.3.1　示例数据　620<br />
36.3.2　执行示例事务　620<br />
36.3.3　备份和恢复InnoDB表　622<br />
36.3.4　用法提示　622<br />
36.4　用PHP构建事务应用程序　622<br />
36.5　小结　624</p>
<p>第37章　导入和导出数据　625<br />
37.1　示例表　625<br />
37.2　获得合适的媒介　625<br />
37.3　导出数据　626<br />
37.4　导入数据　628<br />
37.4.1　利用LOAD DATA INFILE导入数据　628<br />
37.4.2　用mysqlimport导入　631<br />
37.4.3　用PHP加载表数据　633<br />
37.5　小结　634</p>
<p>索引(图灵网站下载)<br />
[singlepic id=11 w=320 h=240 float=center]<br />
<center>（我那本的近照，点击放大）</center>
</p></blockquote>
<p>参考：<br />
<a href="http://www.phpchina.com/html/05/n-34505.html" target="_blank">http://www.phpchina.com/html/05/n-34505.html</a><br />
<a href="http://www.ptpress.com.cn/Book.aspx?id=7882" target="_blank">http://www.ptpress.com.cn/Book.aspx?id=7882</a></p>
<h2  class="related_post_title">Related Posts / 相关文章</h2><ul class="related_post"><li><a href="http://slj.me/2011/10/mysql-save-query-result-to-a-file/" title="MySQL 把查询结果保存到文件中的方法">MySQL 把查询结果保存到文件中的方法</a></li><li><a href="http://slj.me/2011/08/web-open-source-project/" title="疯狂的 Web 应用开源项目">疯狂的 Web 应用开源项目</a></li><li><a href="http://slj.me/2011/06/php-daemon-notice/" title="[转] 代替bash，书写 PHP daemon 后台程序">[转] 代替bash，书写 PHP daemon 后台程序</a></li><li><a href="http://slj.me/2011/04/xdebug-for-php/" title="Xdebug for php 一个实用的PHP调试扩展">Xdebug for php 一个实用的PHP调试扩展</a></li><li><a href="http://slj.me/2011/03/share-bash-script/" title="分享两则我在VPS上执行的sh脚本">分享两则我在VPS上执行的sh脚本</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://slj.me/2009/05/book-beginingphpandmysql/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>FastCGI 不完全高级指南（PHP版，Windows平台）</title>
		<link>http://slj.me/2009/04/fastcgi-manual-php-windows/</link>
		<comments>http://slj.me/2009/04/fastcgi-manual-php-windows/#comments</comments>
		<pubDate>Tue, 28 Apr 2009 05:02:59 +0000</pubDate>
		<dc:creator>SLJ</dc:creator>
				<category><![CDATA[Apache/Nginx]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[FastCGI]]></category>
		<category><![CDATA[manual]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[指南]]></category>

		<guid isPermaLink="false">http://kiya.cn/?p=336</guid>
		<description><![CDATA[今天又在配置服务器，又看到FastCGI，一直对其概念不是很明确，所以今天顺便就上网查了查明确一下，来源网上，转载过来 一、FastCGI是什么？ 　　FastCGI是语言无关的、可伸缩架构的CGI开放扩展，其主要行为是将CGI解释器进程保持在内存中并因此获得较高的性能。众所周知，CGI解释器的反复加载是CGI性能低下的主要原因，如果CGI解释器保持在内存中并接受FastCGI进程管理器调度，则可以提供良好的性能、伸缩性、Fail-Over特性等等。 FastCGI的官方站点在 http://www.fastcgi.com 　　FastCGI的工作原理是： 　　1、Web Server 启动时载入FastCGI进程管理器（IIS ISAPI或Apache Module）; 　　2、FastCGI进程管理器自身初始化，启动多个CGI解释器进程 (在任务管理器中可见多个php-cgi.exe)并等待来自Web Server的连接。 　　3、当客户端请求到达Web Server时，FastCGI进程管理器选择并连接到一个CGI解释器。Web server将CGI环境变量和标准输入发送到FastCGI子进程php-cgi.exe。 　　4、FastCGI子进程完成处理后将标准输出和错误信息从同一连接返回Web Server。当FastCGI子进程关闭连接时，请求便告处理完成。FastCGI子进程接着等待并处理来自FastCGI进程管理器（运行在 WebServer中）的下一个连接。 在正常的CGI模式中，php-cgi.exe在此便退出了。 　　在上述情况中，你可以想象 CGI通常有多慢。每一个Web请求PHP都必须重新解析php.ini、重新载入全部dll扩展并重初始化全部数据结构。使用FastCGI，所有这些都只在进程启动时发生一次。一个额外的好处是，持续数据库连接(Persistent database connection)可以工作。 二、为什么要使用FastCGI，而不是多线程CGI解释器？ 　　这可能出于多方面的考虑，例如： 　　1、你无论如何也不能在windows平台上稳定的使用多线程CGI解释器，无论是IIS ISAPI方式还是APACHE Module方式，它们总是运行一段时间就崩溃了。奇怪么？但是确实存在这样的情况！ 　　当然，也有很多时候你能够稳定的使用多线程CGI解释器，但是，你有可能发现网页有时候会出现错误，无论如何也找不到原因，而换用FastCGI方式时这种错误的概率会大大的降低。我也不清楚这是为什么，我想独立地址空间的CGI解释器可能终究比共享地址空间的形式来得稳定一点点。 　　2、性能！性能？可能么，难道FastCGI比多线程CGI解释器更快？但有时候确实是这样，只有测试一下你的网站，才能最后下结论。原因嘛，我觉得很难讲，但有资料说在Zend WinEnabler的时代，Zend原来也是建议在Windows平台下使用FastCGI而不是IIS ISAPI或Apache Module，不过现在Zend已经不做这个产品了。 三、不使用FastCGI的理由 　　1、多进程比多线程消耗更多的服务器内存，php-cgi.exe解释器每进程消耗7至25兆内存，将这个数字乘以50或100试试。 　　2、性能。确实有时候多线程CGI解释器更快，呵呵，而且有时候，它也很稳定。 　　3、CGI？听起来就很土，呵呵 四、IIS FastCGI配置方法 　　1、首先确定你已正确安装了PHP 4.3.x及更新的版本。早期版本的PHP并未默认加入FastCGI支持，如果你想在早期版本中工作，需要重新编译它。我们假设PHP安装在c:\php，支持FastFCGI的可执行文件名是php-cgi.exe。 　　　　注意：建议在Php.ini中关闭cgi.force_redirect，启用fastcgi.impersonate，启用cgi.rfc2616_header 　　2、下载http://www.caraveo.com/fastcgi/fastcgi-0.6.zip并将其中的isapi_fcgi.dll解压缩到c:\php目录下（不是必须在此目录，这里只是叙述方便）。 　　3、使用regedit.exe建立如下注册表项： 　　HKEY_LOCAL_MACHINE:Software\FASTCGI\.php　（必需） 　　4、在此项下建立如下键值： 　　字符串类型：AppPath，值为c:\php\php-cgi.exe　（必需） 　　字符串类型：BindPath，值为php-fcgi　　　　　 （必需） 　　以下是可选配置键值： 　　DWORD类型：StartServers，启动时默认启动的解释器个数，默认值5 　　DWORD类型：MaxServers，最大解释器个数，默认25 　　DWORD类型：IncrementServers，当解释器不够用时增量个数，默认2 [...]]]></description>
			<content:encoded><![CDATA[<p><span style="color: #993300;">今天又在配置服务器，又看到FastCGI，一直对其概念不是很明确，所以今天顺便就上网查了查明确一下，来源网上，转载过来</span></p>
<p><strong>一、FastCGI是什么？</strong></p>
<p>　　FastCGI是语言无关的、可伸缩架构的CGI开放扩展，其主要行为是将CGI解释器进程保持在内存中并因此获得较高的性能。众所周知，CGI解释器的反复加载是CGI性能低下的主要原因，如果CGI解释器保持在内存中并接受FastCGI进程管理器调度，则可以提供良好的性能、伸缩性、Fail-Over特性等等。</p>
<p>FastCGI的官方站点在 http://www.fastcgi.com</p>
<p>　　FastCGI的工作原理是：</p>
<p>　　1、Web Server 启动时载入FastCGI进程管理器（IIS ISAPI或Apache Module）;</p>
<p>　　2、FastCGI进程管理器自身初始化，启动多个CGI解释器进程 (在任务管理器中可见多个php-cgi.exe)并等待来自Web Server的连接。</p>
<p>　　3、当客户端请求到达Web Server时，FastCGI进程管理器选择并连接到一个CGI解释器。Web server将CGI环境变量和标准输入发送到FastCGI子进程php-cgi.exe。</p>
<p>　　4、FastCGI子进程完成处理后将标准输出和错误信息从同一连接返回Web Server。当FastCGI子进程关闭连接时，请求便告处理完成。FastCGI子进程接着等待并处理来自FastCGI进程管理器（运行在 WebServer中）的下一个连接。 在正常的CGI模式中，php-cgi.exe在此便退出了。</p>
<p>　　在上述情况中，你可以想象 CGI通常有多慢。每一个Web请求PHP都必须重新解析php.ini、重新载入全部dll扩展并重初始化全部数据结构。使用FastCGI，所有这些都只在进程启动时发生一次。一个额外的好处是，持续数据库连接(Persistent database connection)可以工作。</p>
<p><strong><span id="more-336"></span>二、为什么要使用FastCGI，而不是多线程CGI解释器？</strong></p>
<p>　　这可能出于多方面的考虑，例如：</p>
<p>　　1、你无论如何也不能在windows平台上稳定的使用多线程CGI解释器，无论是IIS ISAPI方式还是APACHE Module方式，它们总是运行一段时间就崩溃了。奇怪么？但是确实存在这样的情况！</p>
<p>　　当然，也有很多时候你能够稳定的使用多线程CGI解释器，但是，你有可能发现网页有时候会出现错误，无论如何也找不到原因，而换用FastCGI方式时这种错误的概率会大大的降低。我也不清楚这是为什么，我想独立地址空间的CGI解释器可能终究比共享地址空间的形式来得稳定一点点。</p>
<p>　　2、性能！性能？可能么，难道FastCGI比多线程CGI解释器更快？但有时候确实是这样，只有测试一下你的网站，才能最后下结论。原因嘛，我觉得很难讲，但有资料说在Zend WinEnabler的时代，Zend原来也是建议在Windows平台下使用FastCGI而不是IIS ISAPI或Apache Module，不过现在Zend已经不做这个产品了。</p>
<p><strong>三、不使用FastCGI的理由</strong></p>
<p>　　1、多进程比多线程消耗更多的服务器内存，php-cgi.exe解释器每进程消耗7至25兆内存，将这个数字乘以50或100试试。</p>
<p>　　2、性能。确实有时候多线程CGI解释器更快，呵呵，而且有时候，它也很稳定。</p>
<p>　　3、CGI？听起来就很土，呵呵</p>
<p><strong>四、IIS FastCGI配置方法</strong></p>
<p>　　1、首先确定你已正确安装了PHP 4.3.x及更新的版本。早期版本的PHP并未默认加入FastCGI支持，如果你想在早期版本中工作，需要重新编译它。我们假设PHP安装在c:\php，支持FastFCGI的可执行文件名是php-cgi.exe。</p>
<p>　　　　注意：建议在Php.ini中关闭cgi.force_redirect，启用fastcgi.impersonate，启用cgi.rfc2616_header</p>
<p>　　2、下载http://www.caraveo.com/fastcgi/fastcgi-0.6.zip并将其中的isapi_fcgi.dll解压缩到c:\php目录下（不是必须在此目录，这里只是叙述方便）。</p>
<p>　　3、使用regedit.exe建立如下注册表项：</p>
<p>　　HKEY_LOCAL_MACHINE:Software\FASTCGI\.php　（必需）</p>
<p>　　4、在此项下建立如下键值：</p>
<p>　　字符串类型：AppPath，值为c:\php\php-cgi.exe　（必需）</p>
<p>　　字符串类型：BindPath，值为php-fcgi　　　　　 （必需）</p>
<p>　　以下是可选配置键值：</p>
<p>　　DWORD类型：StartServers，启动时默认启动的解释器个数，默认值5</p>
<p>　　DWORD类型：MaxServers，最大解释器个数，默认25</p>
<p>　　DWORD类型：IncrementServers，当解释器不够用时增量个数，默认2</p>
<p>　　DWORD类型：Timeout，增量解释器（超出StartServers数目的）存活时间，默认600（秒）</p>
<p>　　DWORD类型：ThreadPoolSize，线程池大小，仅IIS下有效，默认10</p>
<p>　　DWORD类型：Impersonate，仅IIS有效，如果为1，使用IIS安全标志，为0则关闭此特性。不要关闭它除非你不担心安全问题。默认1</p>
<p>　　DWORD类型：MaxPostData，Post数据预读Byte限制，默认0</p>
<p>　　DWORD类型：BypassAuth，仅IIS有效，如果为1并且isapi_fcgi.dll被配置为IIS Filter，同时IIS被配置为使用BASIC Authentication，这将强制所有认证请求使用IIS匿名用户。这一选项的目的是允许脚本实现自己的安全机制。默认0</p>
<p>　　BINARY类型：CustomVars，附加环境变量值，新行分隔，Null结束</p>
<p>　　5、如果是IIS6，添加一个Web服务扩展指向c:\php\isapi_fcgi.dll，并允许。应用程序池中的“最大工作进程数”请保持为1。</p>
<p>　　6、添加应用程序扩展映射关系：</p>
<p>1). 在Internet信息服务管理器中，选择网站或应用程序的根目录。</p>
<p>2). 打开目录属性页（右键选择“属性”），再选择“主目录”。</p>
<p>3). 点击“配置”按钮，选择“映射”Tab页。</p>
<p>4). 点击“添加&#8230;”，在“可执行文件”设为: c:\php\isapi_fcgi.dll，扩展名设为.php，一定要选择“确认文件是否存在”，然后“确定”保存设置。</p>
<p>5). 再同样添加对.php3或.phtml扩展名的支持（可选）。</p>
<p>6). 保存设定并重新启动IIS。</p>
<p>　　7、测试一下，同时请求多个Web页面，然后察看任务管理器中的进程，页面完成后php-cgi.exe进程持续运行并不退出。</p>
<p><strong>五、Apache配置方法</strong></p>
<p>　　1、首先确定你已正确安装了PHP 4.3.x及更新的版本。早期版本的PHP并未默认加入FastCGI支持，如果你想在早期版本中工作，需要重新编译它。我们假设PHP安装在c:\php，支持FastFCGI的可执行文件名是php-cgi.exe。</p>
<p>　　　　注意：建议在Php.ini中打开cgi.force_redirect，关闭fastcgi.impersonate，关闭cgi.rfc2616_headers。</p>
<p>　　2、下载http://www.fastcgi.com/dist/mod_fastcgi-2.4.2-AP20.dll，放到Apache 2.x的Modules目录中。</p>
<p>　　3、确定Apache 2.x在CGI方式下可以正常运行PHP。httpd.conf中存在如下几行：</p>
<p>　　　　ScriptAlias /php/ &#8220;c:/php/&#8221;</p>
<p>　　　　Action application/x-httpd-php &#8220;/php/php-cgi.exe&#8221;</p>
<p>　　　　SetEnv PHPRC &#8220;C:/php&#8221;</p>
<p>　　　　AddType application/x-httpd-php .php</p>
<p>　　4、在httpd.conf中添加:</p>
<p>　　　　LoadModule fastcgi_module modules/mod_fastcgi-2.4.2-AP20.dll</p>
<p>　　　　# 说明：此处的 -processes 3 表示启动三个 php-cgi.exe 进程，</p>
<p>　　　　# 关于 FastCgiServer 的详细参数请参考 FastCGI 文档。</p>
<p>　　　　FastCgiServer &#8220;c:/php/php-cgi.exe&#8221; -processes 3</p>
<p>　　5、重新启动Apache，测试同上。</p>
<p><strong>六、高级配置</strong></p>
<p>　　设想这样一种场景，你的服务器上同时跑Apache 2和IIS 6，两个Web服务器都跑php应用。那么，有如下三种可能：</p>
<p>　　A、php使用iis isapi和apache module安装，均为多线程方式运行。这个和FastCGI没有关系。</p>
<p>　　B、其中一个服务器使用FastCGI方式，另一个使用多线程方式。这个能运行正常。</p>
<p>　　C、两个均使用FastCGI方式，这个往往不正常。一般表现为：</p>
<p>　　　　两个服务器各自启动一些php-cgi.exe进程，然后服务器之一不解释php页面，或者隔一会儿就派生新的php-cgi.exe进程（可怕呀）。</p>
<p>　　为什么呢？我想大概是因为上面使用的两个东西（iis isapi和apache module）的作者大概并没有想过要和对方同时使用吧，呵呵。想了想，Apache 2和IIS 6如果可以共用一批php-cgi.exe解释器就好了，既不浪费内存，估计也不会有调度问题了。</p>
<p>　　经过研究和测试证明，这个想法是可行的。但是，由于Shane Caraveo并未在ISAPI DLL中提供使用外置FastCGI服务的功能，因此在此场景中只能是由IIS负责启动和管理php-cgi.exe，然后配置Apache去使用这些受 IIS管理的php-cgi.exe进程。</p>
<p>　　配置方法：</p>
<p>　　1、按上述四中的方法配置IIS FastCGI。</p>
<p>　　2、基本按上述五中的方法配置Apache FastCGI，五.4改为在httpd.conf中添加:</p>
<p>　　　　LoadModule fastcgi_module modules/mod_fastcgi-2.4.2-AP20.dll</p>
<p>　　　　# 使用外部FastCGI服务器，请参考 FastCGI 文档。</p>
<p>　　　　FastCgiExternalServer &#8220;c:/php/php-cgi.exe&#8221; -socket &#8220;php-fcgi&#8221;</p>
<p>　　注意：-socket参数后的值必须与HKEY_LOCAL_MACHINE:Software\FASTCGI\.php中BindPath的值一致，这样两个FastCGI进程管理器才会使用同一个命名管道连接php-cgi.exe。</p>
<p>　　注意：此配置中php-cgi.exe进程只受IIS中的FastCGI进程管理器管理， Apache的繁忙请求并不会使IIS中的FastCGI调度更多的php-cgi.exe进程。因此，在IIS中配置FastCGI时应当使 StartServers值足够大，以避免php解释器数量不足。同样带来的问题是，如果IIS关闭了，那么Apache就会找不到Php解释器了，这个要留心。</p>
<p>　　由此带来的一个问题是：此时的php.ini中cgi.force_redirect、fastcgi.impersonate、cgi.rfc2616_headers应该怎么设定呢？这个留给大家去思考吧……呵呵</p>
<p>　　另外一个可能遇到的问题是，IIS非常空闲，一段时间后由IIS启动的php-cgi.exe退出了，则apache就解释不了 Php了，怎么办呢？这时可以访问一下iis网站，php-cgi.exe就又起来了，晕哦。一个建议是使用IIS 6的进程池管理，在应用程序池中关掉“空闲超时”，并且，在“应用程序池标识”中将运行账号设定为与Apache服务启动账号一致。</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;-××分割线&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<p>FastCGI是一个程序接口，它能加速公共网关接口（CGI），CGI是一种用最常见的方式使Web服务器调用应用程序的Web应用程序。按一个FastCGI工具来看，用户要求进入一个网站并使用一个专门的应用软件的话，使用FastCGI能够快3到30倍。FastCGI是Web服务器的一种插件。为了获得良好的性能，它要求对现有服务器应用程序（比如 Perl 、Tcl 脚本和C、C++程序）做细小的改动。　　</p>
<p>基本上， FastCGI 是一个在单一步骤中管理多重CGI请求的程序，为每个请求减少了许多程序指令。没有FastCGI的话，每当用户请求某一服务时都会导致Web服务器打开一个新的能控制和执行这项服务的程序，然后关闭它。有了FastCGI的话，一个步骤的耗费会被所有当前正处理的请求所分担。与CGI不同，有了FastCGI 的话，每个步骤是独立于Web服务器运行的， 这样就提供了更多的安全。FastCGI 是独立代码的。它的版权属于Open Market公司，该公司提供FastCGI的免费使用并且将其作为一个公开标准。FastCGI提供了唯一一个可以跨平台和在任何Web服务器上使用的无知识产权的方法。</p>
<h2  class="related_post_title">Related Posts / 相关文章</h2><ul class="related_post"><li><a href="http://slj.me/2010/03/godaddy-no-input-file-specified-solution/" title="Godaddy的No input file specified错误（php+fastcgi）">Godaddy的No input file specified错误（php+fastcgi）</a></li><li><a href="http://slj.me/2011/08/web-open-source-project/" title="疯狂的 Web 应用开源项目">疯狂的 Web 应用开源项目</a></li><li><a href="http://slj.me/2011/06/php-daemon-notice/" title="[转] 代替bash，书写 PHP daemon 后台程序">[转] 代替bash，书写 PHP daemon 后台程序</a></li><li><a href="http://slj.me/2011/04/xdebug-for-php/" title="Xdebug for php 一个实用的PHP调试扩展">Xdebug for php 一个实用的PHP调试扩展</a></li><li><a href="http://slj.me/2011/02/php-share-session-between-servers/" title="PHP 实现多服务器共享 SESSION 数据">PHP 实现多服务器共享 SESSION 数据</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://slj.me/2009/04/fastcgi-manual-php-windows/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>网站架构（页面静态化，图片服务器分离,负载均衡）方案全解析</title>
		<link>http://slj.me/2009/04/website-architecture/</link>
		<comments>http://slj.me/2009/04/website-architecture/#comments</comments>
		<pubDate>Wed, 22 Apr 2009 05:48:01 +0000</pubDate>
		<dc:creator>SLJ</dc:creator>
				<category><![CDATA[Apache/Nginx]]></category>
		<category><![CDATA[Web Structure]]></category>
		<category><![CDATA[architecture]]></category>
		<category><![CDATA[website]]></category>
		<category><![CDATA[方案解析]]></category>
		<category><![CDATA[服务器分离]]></category>
		<category><![CDATA[负载均衡]]></category>
		<category><![CDATA[静态化]]></category>

		<guid isPermaLink="false">http://kiya.cn/?p=312</guid>
		<description><![CDATA[1、HTML静态化     其实大家都知道，效率最高、消耗最小的就是纯静态化的html页面，所以我们尽可能使我们的网站上的页面采用静态页面来实现，这个最简单的方法其实也是最有效的方法。但是对于大量内容并且频繁更新的网站，我们无法全部手动去挨个实现，于是出现了我们常见的信息发布系统CMS，像我们常访问的各个门户站点的新闻频道，甚至他们的其他频道，都是通过信息发布系统来管理和实现的，信息发布系统可以实现最简单的信息录入自动生成静态页面，还能具备频道管理、权限管理、自动抓取等功能，对于一个大型网站来说，拥有一套高效、可管理的CMS是必不可少的。除了门户和信息发布类型的网站，对于交互性要求很高的社区类型网站来说，尽可能的静态化也是提高性能的必要手段，将社区内的帖子、文章进行实时的静态化，有更新的时候再重新静态化也是大量使用的策略，像Mop的大杂烩就是使用了这样的策略，网易社区等也是如此。同时，html静态化也是某些缓存策略使用的手段，对于系统中频繁使用数据库查询但是内容更新很小的应用，可以考虑使用html静态化来实现，比如论坛中论坛的公用设置信息，这些信息目前的主流论坛都可以进行后台管理并且存储再数据库中，这些信息其实大量被前台程序调用，但是更新频率很小，可以考虑将这部分内容进行后台更新的时候进行静态化，这样避免了大量的数据库访问请求。 2、图片服务器分离 大家知道，对于Web服务器来说，不管是Apache、IIS还是其他容器，图片是最消耗资源的，于是我们有必要将图片与页面进行分离，这是基本上大型网站都会采用的策略，他们都有独立的图片服务器，甚至很多台图片服务器。这样的架构可以降低提供页面访问请求的服务器系统压力，并且可以保证系统不会因为图片问题而崩溃，在应用服务器和图片服务器上，可以进行不同的配置优化，比如apache在配置ContentType的时候可以尽量少支持，尽可能少的LoadModule，保证更高的系统消耗和执行效率。 3、数据库集群和库表散列 大型网站都有复杂的应用，这些应用必须使用数据库，那么在面对大量访问的时候，数据库的瓶颈很快就能显现出来，这时一台数据库将很快无法满足应用，于是我们需要使用数据库集群或者库表散列。在数据库集群方面，很多数据库都有自己的解决方案，Oracle、Sybase等都有很好的方案，常用的MySQL提供的Master/Slave也是类似的方案，您使用了什么样的DB，就参考相应的解决方案来实施即可。上面提到的数据库集群由于在架构、成本、扩张性方面都会受到所采用DB类型的限制，于是我们需要从应用程序的角度来考虑改善系统架构，库表散列是常用并且最有效的解决方案。我们在应用程序中安装业务和应用或者功能模块将数据库进行分离，不同的模块对应不同的数据库或者表，再按照一定的策略对某个页面或者功能进行更小的数据库散列，比如用户表，按照用户ID进行表散列，这样就能够低成本的提升系统的性能并且有很好的扩展性。sohu的论坛就是采用了这样的架构，将论坛的用户、设置、帖子等信息进行数据库分离，然后对帖子、用户按照板块和ID进行散列数据库和表，最终可以在配置文件中进行简单的配置便能让系统随时增加一台低成本的数据库进来补充系统性能。 4、缓存 缓存一词搞技术的都接触过，很多地方用到缓存。网站架构和网站开发中的缓存也是非常重要。这里先讲述最基本的两种缓存。高级和分布式的缓存在后面讲述。架构方面的缓存，对Apache比较熟悉的人都能知道Apache提供了自己的缓存模块，也可以使用外加的Squid模块进行缓存，这两种方式均可以有效的提高Apache的访问响应能力。网站程序开发方面的缓存，Linux上提供的Memory Cache是常用的缓存接口，可以在web开发中使用，比如用Java开发的时候就可以调用MemoryCache对一些数据进行缓存和通讯共享，一些大型社区使用了这样的架构。另外，在使用web语言开发的时候，各种语言基本都有自己的缓存模块和方法，PHP有Pear的Cache模块，Java就更多了，.net不是很熟悉，相信也肯定有。 5、镜像 镜像是大型网站常采用的提高性能和数据安全性的方式，镜像的技术可以解决不同网络接入商和地域带来的用户访问速度差异，比如ChinaNet和EduNet之间的差异就促使了很多网站在教育网内搭建镜像站点，数据进行定时更新或者实时更新。在镜像的细节技术方面，这里不阐述太深，有很多专业的现成的解决架构和产品可选。也有廉价的通过软件实现的思路，比如Linux上的rsync等工具。 6、负载均衡 负载均衡将是大型网站解决高负荷访问和大量并发请求采用的终极解决办法。负载均衡技术发展了多年，有很多专业的服务提供商和产品可以选择，我个人接触过一些解决方法，其中有两个架构可以给大家做参考。 7、硬件四层交换 第四层交换使用第三层和第四层信息包的报头信息，根据应用区间识别业务流，将整个区间段的业务流分配到合适的应用服务器进行处理。　第四层交换功能就象是虚 IP，指向物理服务器。它传输的业务服从的协议多种多样，有HTTP、FTP、NFS、Telnet或其他协议。这些业务在物理服务器基础上，需要复杂的载量平衡算法。在IP世界，业务类型由终端TCP或UDP端口地址来决定，在第四层交换中的应用区间则由源端和终端IP地址、TCP和UDP端口共同决定。在硬件四层交换产品领域，有一些知名的产品可以选择，比如Alteon、F5等，这些产品很昂贵，但是物有所值，能够提供非常优秀的性能和很灵活的管理能力。Yahoo中国当初接近2000台服务器使用了三四台Alteon就搞定了。 8、软件四层交换 大家知道了硬件四层交换机的原理后，基于OSI模型来实现的软件四层交换也就应运而生，这样的解决方案实现的原理一致，不过性能稍差。但是满足一定量的压力还是游刃有余的，有人说软件实现方式其实更灵活，处理能力完全看你配置的熟悉能力。软件四层交换我们可以使用Linux上常用的LVS来解决，LVS就是Linux Virtual Server，他提供了基于心跳线heartbeat的实时灾难应对解决方案，提高系统的鲁棒性，同时可供了灵活的虚拟VIP配置和管理功能，可以同时满足多种应用需求，这对于分布式的系统来说必不可少。一个典型的使用负载均衡的策略就是，在软件或者硬件四层交换的基础上搭建squid集群，这种思路在很多大型网站包括搜索引擎上被采用，这样的架构低成本、高性能还有很强的扩张性，随时往架构里面增减节点都非常容易。这样的架构我准备空了专门详细整理一下和大家探讨。对于大型网站来说，前面提到的每个方法可能都会被同时使用到，我这里介绍得比较浅显，具体实现过程中很多细节还需要大家慢慢熟悉和体会，有时一个很小的squid参数或者apache参数设置，对于系统性能的影响就会很大，希望大家一起讨论，达到抛砖引玉之效。 用squid做web cache server，而apache在squid的后面提供真正的web服务。当然使用这样的架构必须要保证主页上大部分都是静态页面。这就需要程序员的配合将页面在反馈给客户端之前将页面全部转换成静态页面。 基本看出sina和sohu对于频道等栏目都用了相同的技术，即squid来监听这些IP的80端口，而真正的web server来监听另外一个端口。从用户的感觉上来说不会有任何的区别，而相对于将web server直接和客户端连在一起的方式，这样的方式明显的节省的带宽和服务器。用户访问的速度感觉也会更快。   转 http://www.dbanotes.net/arch/yupoo_arch.html 转 http://www.dbanotes.net/review/tailrank_arch.html 带宽：4000M/S (参考) 服务器数量：60 台左右 Web服务器：Lighttpd, Apache, nginx 应用服务器：Tomcat 其他：Python, Java, MogileFS 、ImageMagick 等 关于 Squid 与 Tomcat Squid 与 Tomcat 似乎在 Web 2.0 站点的架构中较少看到。我首先是对 [...]]]></description>
			<content:encoded><![CDATA[<p><strong>1、HTML静态化</strong></p>
<p>    其实大家都知道，效率最高、消耗最小的就是纯静态化的html页面，所以我们尽可能使我们的网站上的页面采用静态页面来实现，这个最简单的方法其实也是最有效的方法。但是对于大量内容并且频繁更新的网站，我们无法全部手动去挨个实现，于是出现了我们常见的信息发布系统CMS，像我们常访问的各个门户站点的新闻频道，甚至他们的其他频道，都是通过信息发布系统来管理和实现的，信息发布系统可以实现最简单的信息录入自动生成静态页面，还能具备频道管理、权限管理、自动抓取等功能，对于一个大型网站来说，拥有一套高效、可管理的CMS是必不可少的。除了门户和信息发布类型的网站，对于交互性要求很高的社区类型网站来说，尽可能的静态化也是提高性能的必要手段，将社区内的帖子、文章进行实时的静态化，有更新的时候再重新静态化也是大量使用的策略，像Mop的大杂烩就是使用了这样的策略，网易社区等也是如此。同时，html静态化也是某些缓存策略使用的手段，对于系统中频繁使用数据库查询但是内容更新很小的应用，可以考虑使用html静态化来实现，比如论坛中论坛的公用设置信息，这些信息目前的主流论坛都可以进行后台管理并且存储再数据库中，这些信息其实大量被前台程序调用，但是更新频率很小，可以考虑将这部分内容进行后台更新的时候进行静态化，这样避免了大量的数据库访问请求。</p>
<p><strong>2、图片服务器分离</strong></p>
<p>大家知道，对于Web服务器来说，不管是Apache、IIS还是其他容器，图片是最消耗资源的，于是我们有必要将图片与页面进行分离，这是基本上大型网站都会采用的策略，他们都有独立的图片服务器，甚至很多台图片服务器。这样的架构可以降低提供页面访问请求的服务器系统压力，并且可以保证系统不会因为图片问题而崩溃，在应用服务器和图片服务器上，可以进行不同的配置优化，比如apache在配置ContentType的时候可以尽量少支持，尽可能少的LoadModule，保证更高的系统消耗和执行效率。</p>
<p><span id="more-312"></span><strong>3、数据库集群和库表散列</strong></p>
<p>大型网站都有复杂的应用，这些应用必须使用数据库，那么在面对大量访问的时候，数据库的瓶颈很快就能显现出来，这时一台数据库将很快无法满足应用，于是我们需要使用数据库集群或者库表散列。在数据库集群方面，很多数据库都有自己的解决方案，Oracle、Sybase等都有很好的方案，常用的MySQL提供的Master/Slave也是类似的方案，您使用了什么样的DB，就参考相应的解决方案来实施即可。上面提到的数据库集群由于在架构、成本、扩张性方面都会受到所采用DB类型的限制，于是我们需要从应用程序的角度来考虑改善系统架构，库表散列是常用并且最有效的解决方案。我们在应用程序中安装业务和应用或者功能模块将数据库进行分离，不同的模块对应不同的数据库或者表，再按照一定的策略对某个页面或者功能进行更小的数据库散列，比如用户表，按照用户ID进行表散列，这样就能够低成本的提升系统的性能并且有很好的扩展性。sohu的论坛就是采用了这样的架构，将论坛的用户、设置、帖子等信息进行数据库分离，然后对帖子、用户按照板块和ID进行散列数据库和表，最终可以在配置文件中进行简单的配置便能让系统随时增加一台低成本的数据库进来补充系统性能。</p>
<p><strong>4、缓存</strong></p>
<p>缓存一词搞技术的都接触过，很多地方用到缓存。网站架构和网站开发中的缓存也是非常重要。这里先讲述最基本的两种缓存。高级和分布式的缓存在后面讲述。架构方面的缓存，对Apache比较熟悉的人都能知道Apache提供了自己的缓存模块，也可以使用外加的Squid模块进行缓存，这两种方式均可以有效的提高Apache的访问响应能力。网站程序开发方面的缓存，Linux上提供的Memory Cache是常用的缓存接口，可以在web开发中使用，比如用Java开发的时候就可以调用MemoryCache对一些数据进行缓存和通讯共享，一些大型社区使用了这样的架构。另外，在使用web语言开发的时候，各种语言基本都有自己的缓存模块和方法，PHP有Pear的Cache模块，Java就更多了，.net不是很熟悉，相信也肯定有。</p>
<p><strong>5、镜像</strong></p>
<p>镜像是大型网站常采用的提高性能和数据安全性的方式，镜像的技术可以解决不同网络接入商和地域带来的用户访问速度差异，比如ChinaNet和EduNet之间的差异就促使了很多网站在教育网内搭建镜像站点，数据进行定时更新或者实时更新。在镜像的细节技术方面，这里不阐述太深，有很多专业的现成的解决架构和产品可选。也有廉价的通过软件实现的思路，比如Linux上的rsync等工具。</p>
<p><strong>6、负载均衡</strong></p>
<p>负载均衡将是大型网站解决高负荷访问和大量并发请求采用的终极解决办法。负载均衡技术发展了多年，有很多专业的服务提供商和产品可以选择，我个人接触过一些解决方法，其中有两个架构可以给大家做参考。</p>
<p><strong>7、硬件四层交换</strong></p>
<p>第四层交换使用第三层和第四层信息包的报头信息，根据应用区间识别业务流，将整个区间段的业务流分配到合适的应用服务器进行处理。　第四层交换功能就象是虚 IP，指向物理服务器。它传输的业务服从的协议多种多样，有HTTP、FTP、NFS、Telnet或其他协议。这些业务在物理服务器基础上，需要复杂的载量平衡算法。在IP世界，业务类型由终端TCP或UDP端口地址来决定，在第四层交换中的应用区间则由源端和终端IP地址、TCP和UDP端口共同决定。在硬件四层交换产品领域，有一些知名的产品可以选择，比如Alteon、F5等，这些产品很昂贵，但是物有所值，能够提供非常优秀的性能和很灵活的管理能力。Yahoo中国当初接近2000台服务器使用了三四台Alteon就搞定了。</p>
<p><strong>8、软件四层交换</strong></p>
<p>大家知道了硬件四层交换机的原理后，基于OSI模型来实现的软件四层交换也就应运而生，这样的解决方案实现的原理一致，不过性能稍差。但是满足一定量的压力还是游刃有余的，有人说软件实现方式其实更灵活，处理能力完全看你配置的熟悉能力。软件四层交换我们可以使用Linux上常用的LVS来解决，LVS就是Linux Virtual Server，他提供了基于心跳线heartbeat的实时灾难应对解决方案，提高系统的鲁棒性，同时可供了灵活的虚拟VIP配置和管理功能，可以同时满足多种应用需求，这对于分布式的系统来说必不可少。一个典型的使用负载均衡的策略就是，在软件或者硬件四层交换的基础上搭建squid集群，这种思路在很多大型网站包括搜索引擎上被采用，这样的架构低成本、高性能还有很强的扩张性，随时往架构里面增减节点都非常容易。这样的架构我准备空了专门详细整理一下和大家探讨。对于大型网站来说，前面提到的每个方法可能都会被同时使用到，我这里介绍得比较浅显，具体实现过程中很多细节还需要大家慢慢熟悉和体会，有时一个很小的squid参数或者apache参数设置，对于系统性能的影响就会很大，希望大家一起讨论，达到抛砖引玉之效。</p>
<p>用squid做web cache server，而apache在squid的后面提供真正的web服务。当然使用这样的架构必须要保证主页上大部分都是静态页面。这就需要程序员的配合将页面在反馈给客户端之前将页面全部转换成静态页面。<br />
基本看出sina和sohu对于频道等栏目都用了相同的技术，即squid来监听这些IP的80端口，而真正的web server来监听另外一个端口。从用户的感觉上来说不会有任何的区别，而相对于将web server直接和客户端连在一起的方式，这样的方式明显的节省的带宽和服务器。用户访问的速度感觉也会更快。</p>
<p> </p>
<p>转 <a href="http://www.dbanotes.net/arch/yupoo_arch.html" target="_blank"><span style="font-size: small; color: #2f5fa1;">http://www.dbanotes.net/arch/yupoo_arch.html</span></a><br />
转 <a href="http://www.dbanotes.net/review/tailrank_arch.html" target="_blank"><span style="font-size: small; color: #2f5fa1;">http://www.dbanotes.net/review/tailrank_arch.html</span></a></p>
<p>带宽：4000M/S (参考)<br />
服务器数量：60 台左右<br />
Web服务器：Lighttpd, Apache, nginx<br />
应用服务器：Tomcat<br />
其他：Python, Java, MogileFS 、ImageMagick 等</p>
<p><strong>关于 Squid 与 Tomcat</strong></p>
<p>Squid 与 Tomcat 似乎在 Web 2.0 站点的架构中较少看到。我首先是对 Squid 有点疑问，对此阿华的解释是&#8221;目前暂时还没找到效率比 Squid 高的缓存系统，原来命中率的确很差，后来在 Squid 前又装了层 Lighttpd, 基于 url 做 hash, 同一个图片始终会到同一台 squid 去，所以命中率彻底提高了&#8221;</p>
<p>对于应用服务器层的 Tomcat，现在 Yupoo! 技术人员也在逐渐用其他轻量级的东西替代，而 YPWS/YPFS 现在已经用 Python 进行开发了。</p>
<p><strong>名词解释：</strong></p>
<p>· YPWS&#8211;Yupoo Web Server YPWS 是用 Python开发的一个小型 Web 服务器，提供基本的 Web 服务外，可以增加针对用户、图片、外链网站显示的逻辑判断，可以安装于任何有空闲资源的服务器中，遇到性能瓶颈时方便横向扩展。</p>
<p>· YPFS&#8211;Yupoo File System 与 YPWS 类似，YPFS 也是基于这个 Web 服务器上开发的图片上传服务器。</p>
<p>【Updated: 有网友留言质疑 Python 的效率，Yupoo 老大刘平阳在 del.icio.us 上写到 &#8220;YPWS用Python自己写的，每台机器每秒可以处理294个请求, 现在压力几乎都在10％以下&#8221;】</p>
<p><strong>图片处理层</strong></p>
<p>接下来的 Image Process Server 负责处理用户上传的图片。使用的软件包也是 ImageMagick，在上次存储升级的同时，对于锐化的比率也调整过了(我个人感觉，效果的确好了很多)。”Magickd“ 是图像处理的一个远程接口服务，可以安装在任何有空闲 CPU资源的机器上，类似 Memcached的服务方式。</p>
<p>我们知道 Flickr 的缩略图功能原来是用 ImageMagick 软件包的，后来被雅虎收购后出于版权原因而不用了（?）；EXIF 与 IPTC Flicke 是用 Perl 抽取的，我是非常建议 Yupoo! 针对 EXIF 做些文章，这也是潜在产生受益的一个重点。</p>
<p><strong>图片存储层</strong></p>
<p>原来 Yupoo! 的存储采用了磁盘阵列柜，基于 NFS 方式的，随着数据量的增大，”Yupoo! 开发部从07年6月份就开始着手研究一套大容量的、能满足 Yupoo! 今后发展需要的、安全可靠的存储系统“，看来 Yupoo! 系统比较有信心，也是满怀期待的，毕竟这要支撑以 TB 计算的海量图片的存储和管理。我们知道，一张图片除了原图外，还有不同尺寸的，这些图片统一存储在 MogileFS 中。</p>
<p>对于其他部分，常见的 Web 2.0 网站必须软件都能看到，如 MySQL、Memcached 、Lighttpd 等。Yupoo! 一方面采用不少相对比较成熟的开源软件，一方面也在自行开发定制适合自己的架构组件。这也是一个 Web 2.0 公司所必需要走的一个途径。</p>
<p>非常感谢一下 Yupoo! 阿华对于技术信息的分享，技术是共通的。下一个能爆料是哪家?</p>
<p>&#8211;EOF&#8211;</p>
<p>lighttpd+squid这套缓存是放在另外一个机房作为cdn的一个节点使用的，图中没描绘清楚，给大家带来不便了。<br />
squid前端用lighttpd没用nginx，主要是用了这么久，没出啥大问题，所以就没想其他的了。<br />
URL Hash的扩展性的确不好，能做的就是不轻易去增减服务器，我们目前是5台服务器做一组hash.</p>
<p>我们现在用Python写的Web Server，在效率方面，我可以给个测试数据，根据目前的访问日志模拟访问测试的结果是1台ypws,平均每秒处理294个请求(加载所有的逻辑判断)。<br />
在可靠性上，还不没具体的数据，目前运行1个多月还没有任何异常。</p>
<p>lvs每个节点上都装nginx，主要是为了反向代理及处理静态内容，不过apache已显得不是那么必需，准备逐渐去掉。</p>
<p>我们处理图片都是即时的，我们目前半数以上的服务器都装了magickd服务，用来分担图片处理请求。</p>
<p> 每天数以千万计的 Blog 内容中，实时的热点是什么? Tailrank 这个 Web 2.0 Startup 致力于回答这个问题。</p>
<p>专门爆料网站架构的 Todd Hoff 对 Kevin Burton 进行了采访。于是我们能了解一下 Tailrank 架构的一些信息。每小时索引 2400 万的 Blog 与 Feed，内容处理能力为 160-200Mbps，IO 写入大约在10-15MBps。每个月要处理 52T 之多的原始数据。Tailrank 所用的爬虫现在已经成为一个独立产品：spinn3r。</p>
<p><strong>服务器硬件</strong></p>
<p>目前大约 15 台服务器，CPU 是 64 位的 Opteron。每台主机上挂两个 SATA 盘，做 RAID 0。据我所知，国内很多 Web 2.0 公司也用的是类似的方式，SATA 盘容量达，低廉价格，堪称不二之选。操作系统用的是 Debian Linux 。Web 服务器用 Apache 2.0，Squid 做反向代理服务器。</p>
<p><strong>数据库</strong></p>
<p>Tailrank 用 MySQL 数据库，联邦数据库形式。存储引擎用 InnoDB， 数据量 500GB。Kevin Burton 也指出了 MySQL 5 在修了一些 多核模式下互斥锁的问题(This Bug?)。到数据库的JDBC 驱动连接池用 lbpool 做负载均衡。MySQL Slave 或者 Master的复制用 MySQLSlaveSync 来轻松完成。不过即使这样，还要花费 20％ 的时间来折腾 DB。</p>
<p><strong>其他开放的软件</strong></p>
<p>任何一套系统都离不开合适的 Profiling 工具，Tailrank 也不利外，针对 Java 程序的 Benchmark 用 Benchmark4j。Log 工具用 Log5j(不是 Log4j)。Tailrank 所用的大部分工具都是开放的。</p>
<p>Tailrank 的一个比较大的竞争对手是 Techmeme，虽然二者暂时看面向内容的侧重点有所不同。其实，最大的对手还是自己，当需要挖掘的信息量越来越大，如果精准并及时的呈现给用户内容的成本会越来越高。从现在来看，Tailrank 离预期目标还差的很远。期待罗马早日建成</p>
<p><span style="font-size: small;"><strong>YouTube架构学习</strong></span><a href="http://hideto.javaeye.com/blog/130815" target="_blank"><span style="font-size: small; color: #2f5fa1;">http://hideto.javaeye.com/blog/130815</span></a><a href="http://blog.daviesliu.net/2006/09/09/010620/" target="_blank"><span style="font-size: small; color: #2f5fa1;">http://blog.daviesliu.net/2006/09/09/010620/</span></a></p>
<p>关键字: YouTube</p>
<p>原文: YouTube Architecture</p>
<p>YouTube发展迅速，每天超过1亿的视频点击量，但只有很少人在维护站点和确保伸缩性。</p>
<p>平台<br />
Apache<br />
Python<br />
Linux(SuSe)<br />
MySQL<br />
psyco，一个动态的Python到C的编译器<br />
lighttpd代替Apache做视频查看</p>
<p>状态<br />
支持每天超过1亿的视频点击量<br />
成立于2005年2月<br />
于2006年3月达到每天3千万的视频点击量<br />
于2006年7月达到每天1亿的视频点击量<br />
2个系统管理员，2个伸缩性软件架构师<br />
2个软件开发工程师，2个网络工程师，1个DBA</p>
<p><strong>处理飞速增长的流量</strong></p>
<p>Java代码</p>
<pre name="code" class="java">
 while (true)
 {
 identify_and_fix_bottlenecks();
 drink();
 sleep();
 notice_new_bottleneck();
 }
while (true)
{
identify_and_fix_bottlenecks();
drink();
sleep();
notice_new_bottleneck();
}
</pre>
<p>每天运行该循环多次</p>
<p><strong>Web服务器</strong><br />
1，NetScaler用于负载均衡和静态内容缓存<br />
2，使用mod_fast_cgi运行Apache<br />
3，使用一个Python应用服务器来处理请求的路由<br />
4，应用服务器与多个数据库和其他信息源交互来获取数据和格式化html页面<br />
5，一般可以通过添加更多的机器来在Web层提高伸缩性<br />
6，Python的Web层代码通常不是性能瓶颈，大部分时间阻塞在RPC<br />
7，Python允许快速而灵活的开发和部署<br />
8，通常每个页面服务少于100毫秒的时间<br />
9，使用psyco(一个类似于JIT编译器的动态的Python到C的编译器)来优化内部循环<br />
10，对于像加密等密集型CPU活动，使用C扩展<br />
11，对于一些开销昂贵的块使用预先生成并缓存的html<br />
12，数据库里使用行级缓存<br />
13，缓存完整的Python对象<br />
14，有些数据被计算出来并发送给各个程序，所以这些值缓存在本地内存中。这是个使用不当的策略。应用服务器里最快的缓存将预先计算的值发送给所有服务器也花不了多少时间。只需弄一个代理来监听更改，预计算，然后发送。</p>
<p><strong>视频服务</strong><br />
1，花费包括带宽，硬件和能源消耗<br />
2，每个视频由一个迷你集群来host，每个视频被超过一台机器持有<br />
3，使用一个集群意味着：<br />
-更多的硬盘来持有内容意味着更快的速度<br />
-failover。如果一台机器出故障了，另外的机器可以继续服务<br />
-在线备份<br />
4，使用lighttpd作为Web服务器来提供视频服务：<br />
-Apache开销太大<br />
-使用epoll来等待多个fds<br />
-从单进程配置转变为多进程配置来处理更多的连接<br />
5，大部分流行的内容移到CDN：<br />
-CDN在多个地方备份内容，这样内容离用户更近的机会就会更高<br />
-CDN机器经常内存不足，因为内容太流行以致很少有内容进出内存的颠簸<br />
6，不太流行的内容(每天1-20浏览次数)在许多colo站点使用YouTube服务器<br />
-长尾效应。一个视频可以有多个播放，但是许多视频正在播放。随机硬盘块被访问<br />
-在这种情况下缓存不会很好，所以花钱在更多的缓存上可能没太大意义。<br />
-调节RAID控制并注意其他低级问题<br />
-调节每台机器上的内存，不要太多也不要太少</p>
<p><strong>视频服务关键点</strong><br />
1，保持简单和廉价<br />
2，保持简单网络路径，在内容和用户间不要有太多设备<br />
3，使用常用硬件，昂贵的硬件很难找到帮助文档<br />
4，使用简单而常见的工具，使用构建在Linux里或之上的大部分工具<br />
5，很好的处理随机查找(SATA，tweaks)</p>
<p><strong>缩略图服务</strong><br />
1，做到高效令人惊奇的难<br />
2，每个视频大概4张缩略图，所以缩略图比视频多很多<br />
3，缩略图仅仅host在几个机器上<br />
4，持有一些小东西所遇到的问题：<br />
-OS级别的大量的硬盘查找和inode和页面缓存问题<br />
-单目录文件限制，特别是Ext3，后来移到多分层的结构。内核2.6的最近改进可能让Ext3允许大目录，但在一个文件系统里存储大量文件不是个好主意<br />
-每秒大量的请求，因为Web页面可能在页面上显示60个缩略图<br />
-在这种高负载下Apache表现的非常糟糕<br />
-在Apache前端使用squid，这种方式工作了一段时间，但是由于负载继续增加而以失败告终。它让每秒300个请求变为20个<br />
-尝试使用lighttpd但是由于使用单线程它陷于困境。遇到多进程的问题，因为它们各自保持自己单独的缓存<br />
-如此多的图片以致一台新机器只能接管24小时<br />
-重启机器需要6-10小时来缓存<br />
5，为了解决所有这些问题YouTube开始使用Google的BigTable，一个分布式数据存储：<br />
-避免小文件问题，因为它将文件收集到一起<br />
-快，错误容忍<br />
-更低的延迟，因为它使用分布式多级缓存，该缓存与多个不同collocation站点工作<br />
-更多信息参考Google Architecture，GoogleTalk Architecture和BigTable</p>
<p><strong>数据库</strong><br />
1，早期<br />
-使用MySQL来存储元数据，如用户，tags和描述<br />
-使用一整个10硬盘的RAID 10来存储数据<br />
-依赖于信用卡所以YouTube租用硬件<br />
-YouTube经过一个常见的革命：单服务器，然后单master和多read slaves，然后数据库分区，然后sharding方式<br />
-痛苦与备份延迟。master数据库是多线程的并且运行在一个大机器上所以它可以处理许多工作，slaves是单线程的并且通常运行在小一些的服务器上并且备份是异步的，所以slaves会远远落后于master<br />
-更新引起缓存失效，硬盘的慢I/O导致慢备份<br />
-使用备份架构需要花费大量的money来获得增加的写性能<br />
-YouTube的一个解决方案是通过把数据分成两个集群来将传输分出优先次序：一个视频查看池和一个一般的集群<br />
2，后期<br />
-数据库分区<br />
-分成shards，不同的用户指定到不同的shards<br />
-扩散读写<br />
-更好的缓存位置意味着更少的IO<br />
-导致硬件减少30%<br />
-备份延迟降低到0<br />
-现在可以任意提升数据库的伸缩性</p>
<p><strong>数据中心策略</strong><br />
1，依赖于信用卡，所以最初只能使用受管主机提供商<br />
2，受管主机提供商不能提供伸缩性，不能控制硬件或使用良好的网络协议<br />
3，YouTube改为使用colocation arrangement。现在YouTube可以自定义所有东西并且协定自己的契约<br />
4，使用5到6个数据中心加CDN<br />
5，视频来自任意的数据中心，不是最近的匹配或其他什么。如果一个视频足够流行则移到CDN<br />
6，依赖于视频带宽而不是真正的延迟。可以来自任何colo<br />
7，图片延迟很严重，特别是当一个页面有60张图片时<br />
8，使用BigTable将图片备份到不同的数据中心，代码查看谁是最近的</p>
<p><strong>学到的东西</strong><br />
1，Stall for time。创造性和风险性的技巧让你在短期内解决问题而同时你会发现长期的解决方案<br />
2，Proioritize。找出你的服务中核心的东西并对你的资源分出优先级别<br />
3，Pick your battles。别怕将你的核心服务分出去。YouTube使用CDN来分布它们最流行的内容。创建自己的网络将花费太多时间和太多money<br />
4，Keep it simple！简单允许你更快的重新架构来回应问题<br />
5，Shard。Sharding帮助隔离存储，CPU，内存和IO，不仅仅是获得更多的写性能<br />
6，Constant iteration on bottlenecks：<br />
-软件：DB，缓存<br />
-OS：硬盘I/O<br />
-硬件：内存，RAID<br />
7，You succeed as a team。拥有一个跨越条律的了解整个系统并知道系统内部是什么样的团队，如安装打印机，安装机器，安装网络等等的人。With a good team all things are possible。</p>
<p> </p>
<p><strong>Google架构学习</strong></p>
<p>关键字: Google</p>
<p>原文：Google Architecture</p>
<p>Google是伸缩性的王者。Google一直的目标就是构建高性能高伸缩性的基础组织来支持它们的产品。</p>
<p><strong>平台</strong><br />
Linux<br />
大量语言：Python，Java，C++</p>
<p><strong>状态</strong><br />
在2006年大约有450,000台廉价服务器<br />
在2005年Google索引了80亿Web页面，现在没有人知道数目<br />
目前在Google有超过200个GFS集群。一个集群可以有1000或者甚至5000台机器。成千上万的机器从运行着5000000000000000字节存储的GFS集群获取数据，集群总的读写吞吐量可以达到每秒40兆字节<br />
目前在Google有6000个MapReduce程序，而且每个月都写成百个新程序<br />
BigTable伸缩存储几十亿的URL，几百千千兆的卫星图片和几亿用户的参数选择</p>
<p><strong>堆栈</strong><br />
Google形象化它们的基础组织为三层架构：<br />
1，产品：搜索，广告，email，地图，视频，聊天，博客<br />
2，分布式系统基础组织：GFS，MapReduce和BigTable<br />
3，计算平台：一群不同的数据中心里的机器<br />
4，确保公司里的人们部署起来开销很小<br />
5，花费更多的钱在避免丢失日志数据的硬件上，其他类型的数据则花费较少</p>
<p><strong>可信赖的存储机制GFS(Google File System)</strong><br />
1，可信赖的伸缩性存储是任何程序的核心需求。GFS就是Google的核心存储平台<br />
2，Google File System &#8211; 大型分布式结构化日志文件系统，Google在里面扔了大量的数据<br />
3，为什么构建GFS而不是利用已有的东西？因为可以自己控制一切并且这个平台与别的不一样，Google需要：<br />
-跨数据中心的高可靠性<br />
-成千上万的网络节点的伸缩性<br />
-大读写带宽的需求<br />
-支持大块的数据，可能为上千兆字节<br />
-高效的跨节点操作分发来减少瓶颈<br />
4，系统有Master和Chunk服务器<br />
-Master服务器在不同的数据文件里保持元数据。数据以64MB为单位存储在文件系统中。客户端与Master服务器交流来在文件上做元数据操作并且找到包含用户需要数据的那些Chunk服务器<br />
-Chunk服务器在硬盘上存储实际数据。每个Chunk服务器跨越3个不同的Chunk服务器备份以创建冗余来避免服务器崩溃。一旦被Master服务器指明，客户端程序就会直接从Chunk服务器读取文件<br />
6，一个上线的新程序可以使用已有的GFS集群或者可以制作自己的GFS集群<br />
7，关键点在于有足够的基础组织来让人们对自己的程序有所选择，GFS可以调整来适应个别程序的需求</p>
<p><strong>使用MapReduce来处理数据</strong><br />
1，现在你已经有了一个很好的存储系统，你该怎样处理如此多的数据呢？比如你有许多TB的数据存储在1000台机器上。数据库不能伸缩或者伸缩到这种级别花费极大，这就是MapReduce出现的原因<br />
2，MapReduce是一个处理和生成大量数据集的编程模型和相关实现。用户指定一个map方法来处理一个键/值对来生成一个中间的键/值对，还有一个reduce方法来合并所有关联到同样的中间键的中间值。许多真实世界的任务都可以使用这种模型来表现。以这种风格来写的程序会自动并行的在一个大量机器的集群里运行。运行时系统照顾输入数据划分、程序在机器集之间执行的调度、机器失败处理和必需的内部机器交流等细节。这允许程序员没有多少并行和分布式系统的经验就可以很容易使用一个大型分布式系统资源<br />
3，为什么使用MapReduce？<br />
-跨越大量机器分割任务的好方式<br />
-处理机器失败<br />
-可以与不同类型的程序工作，例如搜索和广告。几乎任何程序都有map和reduce类型的操作。你可以预先计算有用的数据、查询字数统计、对TB的数据排序等等<br />
4，MapReduce系统有三种不同类型的服务器<br />
-Master服务器分配用户任务到Map和Reduce服务器。它也跟踪任务的状态<br />
-Map服务器接收用户输入并在其基础上处理map操作。结果写入中间文件<br />
-Reduce服务器接收Map服务器产生的中间文件并在其基础上处理reduce操作<br />
5，例如，你想在所有Web页面里的字数。你将存储在GFS里的所有页面抛入MapReduce。这将在成千上万台机器上同时进行并且所有的调整、工作调度、失败处理和数据传输将自动完成<br />
-步骤类似于：GFS -&gt; Map -&gt; Shuffle -&gt; Reduction -&gt; Store Results back into GFS<br />
-在MapReduce里一个map操作将一些数据映射到另一个中，产生一个键值对，在我们的例子里就是字和字数<br />
-Shuffling操作聚集键类型<br />
-Reduction操作计算所有键值对的综合并产生最终的结果<br />
6，Google索引操作管道有大约20个不同的map和reduction。<br />
7，程序可以非常小，如20到50行代码<br />
8，一个问题是掉队者。掉队者是一个比其他程序慢的计算，它阻塞了其他程序。掉队者可能因为缓慢的IO或者临时的CPU不能使用而发生。解决方案是运行多个同样的计算并且当一个完成后杀死所有其他的<br />
9，数据在Map和Reduce服务器之间传输时被压缩了。这可以节省带宽和I/O。</p>
<p><strong>在BigTable里存储结构化数据</strong><br />
1，BigTable是一个大伸缩性、错误容忍、自管理的系统，它包含千千兆的内存和1000000000000000的存储。它可以每秒钟处理百万的读写<br />
2，BigTable是一个构建于GFS之上的分布式哈希机制。它不是关系型数据库。它不支持join或者SQL类型查询<br />
3，它提供查询机制来通过键访问结构化数据。GFS存储存储不透明的数据而许多程序需求有结构化数据<br />
4，商业数据库不能达到这种级别的伸缩性并且不能在成千上万台机器上工作<br />
5，通过控制它们自己的低级存储系统Google得到更多的控制权来改进它们的系统。例如，如果它们想让跨数据中心的操作更简单这个特性，它们可以内建它<br />
6，系统运行时机器可以自由的增删而整个系统保持工作<br />
7，每个数据条目存储在一个格子里，它可以通过一个行key和列key或者时间戳来访问<br />
8，每一行存储在一个或多个tablet中。一个tablet是一个64KB块的数据序列并且格式为SSTable<br />
9，BigTable有三种类型的服务器：<br />
-Master服务器分配tablet服务器，它跟踪tablet在哪里并且如果需要则重新分配任务<br />
-Tablet服务器为tablet处理读写请求。当tablet超过大小限制(通常是100MB-200MB)时它们拆开tablet。当一个Tablet服务器失败时，则100个Tablet服务器各自挑选一个新的tablet然后系统恢复。<br />
-Lock服务器形成一个分布式锁服务。像打开一个tablet来写、Master调整和访问控制检查等都需要互斥<br />
10，一个locality组可以用来在物理上将相关的数据存储在一起来得到更好的locality选择<br />
11，tablet尽可能的缓存在RAM里</p>
<p><strong>硬件</strong><br />
1，当你有很多机器时你怎样组织它们来使得使用和花费有效？<br />
2，使用非常廉价的硬件<br />
3，A 1,000-fold computer power increase can be had for a 33 times lower cost if you you use a failure-prone infrastructure rather than an infrastructure built on highly reliable components. You must build reliability on top of unreliability for this strategy to work.<br />
4，Linux，in-house rack design，PC主板，低端存储<br />
5，Price per wattage on performance basis isn&#8217;t getting better. Have huge power and cooling issues<br />
6，使用一些collocation和Google自己的数据中心</p>
<p><strong>其他</strong><br />
1，迅速更改而不是等待QA<br />
2，库是构建程序的卓越方式<br />
3，一些程序作为服务提供<br />
4，一个基础组织处理程序的版本，这样它们可以发布而不用害怕会破坏什么东西</p>
<p><strong>Google将来的方向</strong><br />
1，支持地理位置分布的集群<br />
2，为所有数据创建一个单独的全局名字空间。当前的数据由集群分离<br />
3，更多和更好的自动化数据迁移和计算<br />
4，解决当使用网络划分来做广阔区域的备份时的一致性问题(例如保持服务即使一个集群离线维护或由于一些损耗问题)</p>
<p><strong>学到的东西</strong><br />
1，基础组织是有竞争性的优势。特别是对Google而言。Google可以很快很廉价的推出新服务，并且伸缩性其他人很难达到。许多公司采取完全不同的方式。许多公司认为基础组织开销太大。Google认为自己是一个系统工程公司，这是一个新的看待软件构建的方式<br />
2，跨越多个数据中心仍然是一个未解决的问题。大部分网站都是一个或者最多两个数据中心。我们不得不承认怎样在一些数据中心之间完整的分布网站是很需要技巧的<br />
3，如果你自己没有时间从零开始重新构建所有这些基础组织你可以看看Hadoop。Hadoop是这里很多同样的主意的一个开源实现<br />
4，平台的一个优点是初级开发人员可以在平台的基础上快速并且放心的创建健全的程序。如果每个项目都需要发明同样的分布式基础组织的轮子，那么你将陷入困境因为知道怎样完成这项工作的人相对较少<br />
5，协同工作不一直是掷骰子。通过让系统中的所有部分一起工作则一个部分的改进将帮助所有的部分。改进文件系统则每个人从中受益而且是透明的。如果每个项目使用不同的文件系统则在整个堆栈中享受不到持续增加的改进<br />
6，构建自管理系统让你没必要让系统关机。这允许你更容易在服务器之间平衡资源、动态添加更大的容量、让机器离线和优雅的处理升级<br />
7，创建可进化的基础组织，并行的执行消耗时间的操作并采取较好的方案<br />
8，不要忽略学院。学院有许多没有转变为产品的好主意。Most of what Google has done has prior art, just not prior large scale deployment.<br />
9，考虑压缩。当你有许多CPU而IO有限时压缩是一个好的选择。</p>
<p> </p>
<p><strong>Lighttpd+Squid+Apache搭建高效率Web服务器</strong></p>
<p><strong>架构原理</strong></p>
<p>Apache通常是开源界的首选Web服务器，因为它的强大和可靠，已经具有了品牌效应，可以适用于绝大部分的应用场合。但是它的强大有时候却显得笨重，配置文件得让人望而生畏，高并发情况下效率不太高。而轻量级的Web服务器Lighttpd却是后起之秀，其静态文件的响应能力远高于Apache，据说是Apache的2-3倍。Lighttpd的高性能和易用性，足以打动我们，在它能够胜任的领域，尽量用它。Lighttpd对PHP的支持也很好，还可以通过Fastcgi方式支持其他的语言，比如Python。</p>
<p>毕竟Lighttpd是轻量级的服务器，功能上不能跟Apache比，某些应用无法胜任。比如Lighttpd还不支持缓存，而现在的绝大部分站点都是用程序生成动态内容，没有缓存的话即使程序的效率再高也很难满足大访问量的需求，而且让程序不停的去做同一件事情也实在没有意义。首先，Web程序是需要做缓存处理的，即把反复使用的数据做缓存。即使这样也还不够，单单是启动Web处理程序的代价就不少，缓存最后生成的静态页面是必不可少的。而做这个是 Squid的强项，它本是做代理的，支持高效的缓存，可以用来给站点做反向代理加速。把Squid放在Apache或者Lighttpd的前端来缓存 Web服务器生成的动态内容，而Web应用程序只需要适当地设置页面实效时间即可。</p>
<p>即使是大部分内容动态生成的网站，仍免不了会有一些静态元素，比如图片、JS脚本、CSS等等，将Squid放在Apache或者Lighttp前端后，反而会使性能下降，毕竟处理HTTP请求是Web服务器的强项。而且已经存在于文件系统中的静态内容再在Squid中缓存一下，浪费内存和硬盘空间。因此可以考虑将Lighttpd再放在Squid的前面，构成 Lighttpd+Squid+Apache的一条处理链，Lighttpd在最前面，专门用来处理静态内容的请求，把动态内容请求通过proxy模块转发给Squid，如果Squid中有该请求的内容且没有过期，则直接返回给Lighttpd。新请求或者过期的页面请求交由Apache中Web程序来处理。经过Lighttpd和Squid的两级过滤，Apache需要处理的请求将大大减少，减少了Web应用程序的压力。同时这样的构架，便于把不同的处理分散到多台计算机上进行，由Lighttpd在前面统一把关。</p>
<p>在这种架构下，每一级都是可以进行单独优化的，比如Lighttpd可以采用异步IO方式，Squid可以启用内存来缓存，Apache可以启用MPM 等，并且每一级都可以使用多台机器来均衡负载，伸缩性很好。</p>
<h2  class="related_post_title">Related Posts / 相关文章</h2><ul class="related_post"><li><a href="http://slj.me/2009/07/twitter-ops/" title="从 Twitter 运维技术经验可以学到什么">从 Twitter 运维技术经验可以学到什么</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://slj.me/2009/04/website-architecture/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Apache Rewrite 规则详解</title>
		<link>http://slj.me/2009/04/apache-rewrite-regular/</link>
		<comments>http://slj.me/2009/04/apache-rewrite-regular/#comments</comments>
		<pubDate>Sat, 11 Apr 2009 07:17:15 +0000</pubDate>
		<dc:creator>SLJ</dc:creator>
				<category><![CDATA[Apache/Nginx]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[.htaccess]]></category>
		<category><![CDATA[http.conf]]></category>
		<category><![CDATA[regular]]></category>
		<category><![CDATA[rewrite]]></category>
		<category><![CDATA[RewriteCond]]></category>
		<category><![CDATA[RewriteEngine]]></category>
		<category><![CDATA[RewriteRule]]></category>

		<guid isPermaLink="false">http://kiya.cn/?p=211</guid>
		<description><![CDATA[在开篇之前： 我想说这篇文章其实是我刚刚接触Rewrite的时候学习的文档，应属转载，但是在这里我不想写明原地址，原因是文章中大多数给出的配置命令经实验都是错误的。需要原文的可以在谷歌上搜索一下&#8221;Apache Rewrite 规则详解&#8221; 好在我对正则表达式有所了解，把原文的代码都通过自己的理解改写了一下，并都能够达到题设的要求，并联想需求添加了例子。 本文是经过我实验后修改有效的，如果还是出现500错误请去掉 # 及后面的注释（也许有些环境不支持中文注解），如果还是错误请在下面给我留言。 1、Rewrite规则简介： Rewirte主要的功能就是实现URL的跳转，它的正则表达式是基于Perl语言。可基于服务器级的(httpd.conf)和目录级的(.htaccess)两种方式。如果要想用到rewrite模块，必须先安装或加载rewrite模块。方法有两种一种是编译apache的时候就直接安装rewrite模块，别一种是编译apache时以DSO模式安装apache,然后再利用源码和apxs来安装rewrite模块。 基于服务器级的(httpd.conf)有两种方法，一种是在httpd.conf的全局下直接利用RewriteEngine on来打开rewrite功能;另一种是在局部里利用RewriteEngine on来打开rewrite功能,下面将会举例说明，需要注意的是,必须在每个virtualhost里用RewriteEngine on来打开rewrite功能。否则virtualhost里没有RewriteEngine on它里面的规则也不会生效。 基于目录级的(.htaccess),要注意一点那就是必须打开此目录的FollowSymLinks属性且在.htaccess里要声明RewriteEngine on。 2、举例说明： 例一.下面是在一个虚拟主机里定义的规则。功能是把client请求的主机前缀不是www.kiya.cn和70.40.213.183都跳转到主机前缀为http://www.kiya.cn，避免相同内容的网页有多个指向的域名，如http://kiya.cn。 NameVirtualHost 70.40.213.183:80 ServerAdmin slj@kiya.cn DocumentRoot &#8220;/web&#8221; ServerName kiya.cn RewriteEngine on #打开rewirte功能 RewriteCond %{HTTP_HOST} !^www.kiya.cn [NC] #声明Client请求的主机中前缀不是www.kiya.cn，其中 [NC] 的意思是忽略大小写 RewriteCond %{HTTP_HOST} !^70.40.213.183 [NC] #声明Client请求的主机中前缀不是70.40.213.183，其中 [NC] 的意思是忽略大小写 RewriteCond %{HTTP_HOST} !^$ #声明Client请求的主机中前缀不为空 RewriteRule ^(.*) http://www.kiya.cn/ [L] #含义是如果Client请求的主机中的前缀符合上述条件，则直接进行跳转到http://www.kiya.cn/,[L]意味着立即停止重写操作，并不再应用其他重写规则。这里的.*是指匹配所有URL中不包含换行字符，()括号的功能是把所有的字符做一个标记，以便于后面的应用.就是引用前面里的(.*)字符。 例二.将输入 en.sicasoft.com [...]]]></description>
			<content:encoded><![CDATA[<p><strong>在开篇之前：</strong><br />
我想说这篇文章其实是我刚刚接触Rewrite的时候学习的文档，应属转载，但是在这里我不想写明原地址，原因是文章中大多数给出的配置命令经实验都是错误的。需要原文的可以在谷歌上搜索一下&#8221;Apache Rewrite 规则详解&#8221;<br />
好在我对正则表达式有所了解，把原文的代码都通过自己的理解改写了一下，并都能够达到题设的要求，并联想需求添加了例子。<br />
本文是经过我实验后修改有效的，如果还是出现500错误请去掉 <strong>#</strong> 及后面的注释（也许有些环境不支持中文注解），如果还是错误请在下面给我留言。</p>
<p><strong>1、Rewrite规则简介：</strong></p>
<p>Rewirte主要的功能就是实现URL的跳转，它的正则表达式是基于Perl语言。可基于服务器级的(httpd.conf)和目录级的(.htaccess)两种方式。如果要想用到rewrite模块，必须先安装或加载rewrite模块。方法有两种一种是编译apache的时候就直接安装rewrite模块，别一种是编译apache时以DSO模式安装apache,然后再利用源码和apxs来安装rewrite模块。</p>
<p>基于服务器级的(httpd.conf)有两种方法，一种是在httpd.conf的全局下直接利用RewriteEngine on来打开rewrite功能;另一种是在局部里利用RewriteEngine on来打开rewrite功能,下面将会举例说明，需要注意的是,必须在每个virtualhost里用RewriteEngine on来打开rewrite功能。否则virtualhost里没有RewriteEngine on它里面的规则也不会生效。</p>
<p>基于目录级的(.htaccess),要注意一点那就是必须打开此目录的FollowSymLinks属性且在.htaccess里要声明RewriteEngine on。</p>
<p><strong>2、举例说明：</strong><br />
<span id="more-211"></span><br />
例一.下面是在一个虚拟主机里定义的规则。功能是把client请求的主机前缀不是www.kiya.cn和70.40.213.183都跳转到主机前缀为http://www.kiya.cn，避免相同内容的网页有多个指向的域名，如http://kiya.cn。</p>
<blockquote><p>NameVirtualHost 70.40.213.183:80<br />
ServerAdmin slj@kiya.cn<br />
DocumentRoot &#8220;/web&#8221;<br />
ServerName kiya.cn</p>
<p>RewriteEngine on #打开rewirte功能<br />
RewriteCond %{HTTP_HOST} !^www.kiya.cn [NC] #声明Client请求的主机中前缀不是www.kiya.cn，其中 [NC] 的意思是忽略大小写<br />
RewriteCond %{HTTP_HOST} !^70.40.213.183 [NC] #声明Client请求的主机中前缀不是70.40.213.183，其中 [NC] 的意思是忽略大小写<br />
RewriteCond %{HTTP_HOST} !^$ #声明Client请求的主机中前缀不为空<br />
RewriteRule ^(.*) http://www.kiya.cn/ [L] #含义是如果Client请求的主机中的前缀符合上述条件，则直接进行跳转到http://www.kiya.cn/,[L]意味着立即停止重写操作，并不再应用其他重写规则。这里的.*是指匹配所有URL中不包含换行字符，()括号的功能是把所有的字符做一个标记，以便于后面的应用.就是引用前面里的(.*)字符。</p></blockquote>
<p>例二.将输入 en.sicasoft.com 的域名时跳转到www.sicasoft.com</p>
<blockquote><p>RewriteEngine on<br />
RewriteCond %{HTTP_HOST} ^en.sicasoft.com [NC]<br />
RewriteRule ^(.*) http://www.sicasoft.com/ [L]</p></blockquote>
<p>例三.赛卡软件近期更换了域名，新域名为www.sicasoft.com, 更加简短好记。这时需要将原来的域名ss.kiya.cn, 以及论坛所在地址ss.kiya.cn/bbs/定向到新的域名，以便用户可以找到，并且使原来的论坛 URL 继续有效而不出现 404 未找到，比如原来的http://ss.kiya.cn/bbs/tread-60.html, 让它在新的域名下继续有效，点击后转发到http://bbs.sicasoft.com/tread-60.html，而其他网页，如原先的http://ss.kiya.cn/purchase不会到二级域名bbs.sicasoft.com/purchase上，而是到www.sicasoft.com/purchase<br />
按照这样的要求重定向规则应该这样写：</p>
<blockquote><p>RewriteEngine On<br />
RewriteCond %{REQUEST_URI} ^/bbs/<br />
RewriteRule ^bbs/(.*) http://bbs.sicasoft.com/$1 [R=permanent,L]<br />
RewriteCond %{REQUEST_URI} !^/bbs/<br />
RewriteRule ^(.*) http://www.sicasoft.com/$1 [R=permanent,L]</p></blockquote>
<p><strong>3.Apache mod_rewrite规则重写的标志一览</strong></p>
<blockquote><p>1) R[=code](force redirect) 强制外部重定向<br />
强制在替代字符串加上http://thishost[:thisport]/前缀重定向到外部的URL.如果code不指定，将用缺省的302 HTTP状态码。<br />
2) F(force URL to be forbidden)禁用URL,返回403HTTP状态码。<br />
3) G(force URL to be gone) 强制URL为GONE，返回410HTTP状态码。<br />
4) P(force proxy) 强制使用代理转发。<br />
5) L(last rule) 表明当前规则是最后一条规则，停止分析以后规则的重写。<br />
6) N(next round) 重新从第一条规则开始运行重写过程。<br />
7) C(chained with next rule) 与下一条规则关联</p>
<p>如果规则匹配则正常处理，该标志无效，如果不匹配，那么下面所有关联的规则都跳过。</p>
<p>8) T=MIME-type(force MIME type) 强制MIME类型<br />
9) NS (used only if no internal sub-request) 只用于不是内部子请求<br />
10) NC(no case) 不区分大小写<br />
11) QSA(query string append) 追加请求字符串<br />
12) NE(no URI escaping of output) 不在输出转义特殊字符<br />
例如：RewriteRule /foo/(.*) /bar?arg=P1%3d$1 [R,NE] 将能正确的将/foo/zoo转换成/bar?arg=P1=zoo<br />
13) PT(pass through to next handler) 传递给下一个处理<br />
例如：<br />
RewriteRule ^/abc(.*) /def$1 [PT] # 将会交给/def规则处理<br />
Alias /def /ghi<br />
14) S=num(skip next rule(s)) 跳过num条规则<br />
15) E=VAR:VAL(set environment variable) 设置环境变量</p></blockquote>
<p><strong>4.Apache rewrite例子集合</strong></p>
<p>URL重定向</p>
<p>例子一:<br />
同时达到下面两个要求：<br />
1.用http://www.zzz.com/xxx.php 来访问 http://www.zzz.com/xxx/<br />
2.用http://yyy.zzz.com 来访问 http://www.zzz.com/user.php?username=yyy 的功能</p>
<blockquote><p>RewriteEngine On<br />
RewriteCond %{HTTP_HOST} ^www.zzz.com<br />
RewriteCond %{REQUEST_URI} !^user.php$<br />
RewriteCond %{REQUEST_URI} .php$<br />
RewriteRule (.*).php$ http://www.zzz.com/$1/ [R]<br />
RewriteCond %{HTTP_HOST} !^www.zzz.com<br />
RewriteRule ^(.+) %{HTTP_HOST} [C]<br />
RewriteRule ^([^.]+).zzz.com http://www.zzz.com/user.php?username=$1</p></blockquote>
<p>例子二：</p>
<p>/type.php?typeid=* &#8211;&gt; /type*.html<br />
/type.php?typeid=*&amp;page=* &#8211;&gt; /type*page*.html</p>
<blockquote><p>RewriteRule ^/type([0-9]+).html$ /type.php?typeid=$1 [PT]<br />
RewriteRule ^/type([0-9]+)page([0-9]+).html$ /type.php?typeid=$1&amp;page=$2 [PT]</p></blockquote>
<p><strong>5.使用Apache的URL Rewrite配置多用户虚拟服务器</strong></p>
<p>要实现这个功能，首先要在DNS服务器上打开域名的泛域名解析（自己做或者找域名服务商做）。比如，我就把 *.kiya.us和 *.kiya.cn全部解析到了我的IP地址70.40.213.183上。</p>
<p>然后，看一下我的Apache中关于*.kiya.us的虚拟主机的设定。</p>
<blockquote><p>ServerAdmin webmaster@kiya.us<br />
DocumentRoot /home/www/www.kiya.us<br />
ServerName dns.kiya.us<br />
ServerAlias dns.kiya.us kiya.us *.kiya.us<br />
CustomLog /var/log/httpd/osa/access_log.log&#8221; common<br />
ErrorLog /var/log/httpd/osa/error_log.log&#8221;<br />
AllowOverride None<br />
Order deny,allow</p>
<p>#AddDefaultCharset GB2312</p>
<p>RewriteEngine on<br />
RewriteCond %{HTTP_HOST} ^[^.]+.kiya.(cn|us)$<br />
RewriteRule ^(.+) %{HTTP_HOST}$1 [C]<br />
RewriteRule ^([^.]+).kiya.(cn|us)(.*)$ /home/www/www.kiya.us/sylvan$3?un=$1&amp;%{QUERY_STRING} [L]</p></blockquote>
<p>在这段设定中，我把*.kiya.cn和*.kiya.us 的Document Root都设定到了 /home/www/www.kiya.us</p>
<p>继续看下去，在这里我就配置了URL Rewrite规则。</p>
<blockquote><p>RewriteEngine on #打开URL Rewrite功能<br />
RewriteCond %{HTTP_HOST} ^[^.]+.kiya.(cn|us)$ #匹配条件，如果用户输入的URL中主机名是类似 xxxx.kiya.us 或者 xxxx.kiya.cn 就执行下面一句<br />
RewriteRule ^(.+) %{HTTP_HOST}$1 [C] #把用户输入完整的地址（GET方式的参数除外）作为参数传给下一个规则，[C]是Chain串联下一个规则的意思<br />
RewriteRule ^([^.]+).kiya.(cn|us)(.*)$ /home/www/dev.kiya.us/sylvan$3?un=$1&amp;%{QUERY_STRING} [L]<br />
# 最关键的是这一句，使用证则表达式解析用户输入的URL地址，把主机名中的用户名信息作为名为un的参数传给/home/www/dev.kiya.us目录下的脚本，并在后面跟上用户输入的GET方式的传入参数。并指明这是最后一条规则（[L]规则）。注意，在这一句中指明的重写后的地址用的是服务器上的绝对路径，这是内部跳转。如果使用http://xxxx这样的URL格式，则被称为外部跳转。使用外部跳转的话，浏览着的浏览器中的URL地址会改变成新的地址，而使用内部跳转则浏览器中的地址不发生改变，看上去更像实际的二级域名虚拟服务器。</p></blockquote>
<p>设置后重启Apache服务器就大功告成了！</p>
<h2><span style="color: #ff0000;">Update May 1, 2009</span></h2>
<p>今天上网看到了有人提一个问题：</p>
<blockquote><p>求Rewrite 防盗链正则<br />
不允许www.im286.com  www.chinaz.com 这两个网站盗链 , 其它的网站都可以盗链的规则怎么写.</p></blockquote>
<div>论坛中的答案是：</div>
<blockquote><p>RewriteEngine On<br />
RewriteCond %{HTTP_REFERER} chinaz.com  [NC]<br />
RewriteCond %{HTTP_REFERER} im286.com [NC]<br />
RewriteRule .*\.(jpg|jpeg|gif|png|rar|zip|txt|ace|torrent|gz|swf)$ http://www.xxx.com/fuck.png [R,NC,L]</p></blockquote>
<h2><span style="color: #ff0000;">Update May 7, 2009</span></h2>
<p>介绍一篇文章：<a href="http://lamp.linux.gov.cn/Apache/ApacheMenu/mod/mod_rewrite.html" target="_blank">http://lamp.linux.gov.cn/Apache/ApacheMenu/mod/mod_rewrite.html</a></p>
<blockquote></blockquote>
<h2><span style="color: #ff0000;">Update May 24, 2009</span></h2>
<p>一、关于是否需要使用完全转义，比如在 RewriteCond %{HTTP_REFERER} chinaz.com  [NC] 中 把 chinaz.com 改成 chinaz\.com<br />
答案是，两者都是可以的。</p>
<p>二、今天在做 YOURcaddy.com （就是我去年做的PlanetCoachella的变形）的时候，在 GoDaddy 主机上无法正常转向，后来找到了问题：<br />
在HostMonster以及我自己的机器上，是用<br />
RewriteRule ^business/([^\.]+)$ biz/detail.php?name=$1  [L]<br />
达到改写的。而在Godaddy主机上，是这样：<br />
RewriteRule ^business/([^\.]+)$ /biz/detail.php?name=$1  [L]<br />
目标文件前多了一个/<br />
现在想想，可能是因为没有指定RewriteBase，至于到底是不是我改日再验证一下。</p>
<p>三、添加两个关于判断 USER AGENT 例子和自动添加.php扩展名及自动换.html到.php扩展名的例子：<br />
1</p>
<blockquote><p>RewriteEngine on<br />
RewriteCond %{HTTP_USER_AGENT} ^MSIE [NC,OR]<br />
RewriteCond %{HTTP_USER_AGENT} ^Opera [NC]<br />
RewriteRule ^.* &#8211; [F,L] 这里”-”表示没有替换，浏览器为IE和Opera的访客将被禁止访问。
</p></blockquote>
<p>2</p>
<blockquote><p>
RewriteEngine On<br />
RewriteBase /test<br />
RewriteCond %{REQUEST_FILENAME}.php -f<br />
RewriteRule ([^/]+)$ /test/$1.php<br />
#for example: /test/admin => /test/admin.php<br />
RewriteRule ([^/]+)\.html$ /test/$1.php [L]<br />
#for example: /test/admin.html => /test/admin.php</p>
<p>限制目录只能显示图片<br />
< IfModule mod_rewrite.c><br />
RewriteEngine on<br />
RewriteCond %{REQUEST_FILENAME} !^.*\.(gif|jpg|jpeg|png|swf)$<br />
RewriteRule .*$ &#8211; [F,L]<br />
< /IfModule>
</p></blockquote>
<h2><span style="color: #ff0000;">Update Jun 10, 2009</span></h2>
<p>补充，关于特定文件扩展名的重写。</p>
<blockquote><p>
重写有某些扩展名的文件：<br />
RewriteRule (.*.css$|.*.js$) gzip.php?$1 [L]<br />
如果要排除一些扩展名：<br />
RewriteRule !\.(js|ico|gif|jpg|JPG|png|PNG|css|pdf|swf)$ index.php
</p></blockquote>
<h2  class="related_post_title">Related Posts / 相关文章</h2><ul class="related_post"><li><a href="http://slj.me/2010/12/centos-apache-firewall-settings/" title="CentOS 安装 Apache 后其他机器无法访问的解决方法">CentOS 安装 Apache 后其他机器无法访问的解决方法</a></li><li><a href="http://slj.me/2009/12/ssh-restart-apache/" title="用SSH重启Apache">用SSH重启Apache</a></li><li><a href="http://slj.me/2009/05/book-beginingphpandmysql/" title="好书推荐-《PHP与MySQL程序设计（第3版）》">好书推荐-《PHP与MySQL程序设计（第3版）》</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://slj.me/2009/04/apache-rewrite-regular/feed/</wfw:commentRss>
		<slash:comments>28</slash:comments>
		</item>
	</channel>
</rss>

