﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-Skynet</title><link>http://www.blogjava.net/Skynet/</link><description>---------- ---------- 我的新 blog : liukaiyi.cublog.cn ---------- ----------</description><language>zh-cn</language><lastBuildDate>Fri, 17 Apr 2026 09:11:23 GMT</lastBuildDate><pubDate>Fri, 17 Apr 2026 09:11:23 GMT</pubDate><ttl>60</ttl><item><title>Nginx 常见应用技术指南[Nginx Tips] 第二版 (转)</title><link>http://www.blogjava.net/Skynet/archive/2010/01/31/311426.html</link><dc:creator>刘凯毅</dc:creator><author>刘凯毅</author><pubDate>Sun, 31 Jan 2010 15:08:00 GMT</pubDate><guid>http://www.blogjava.net/Skynet/archive/2010/01/31/311426.html</guid><wfw:comment>http://www.blogjava.net/Skynet/comments/311426.html</wfw:comment><comments>http://www.blogjava.net/Skynet/archive/2010/01/31/311426.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Skynet/comments/commentRss/311426.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Skynet/services/trackbacks/311426.html</trackback:ping><description><![CDATA[<br />
<div>
<p>作者:NetSeek&nbsp;&nbsp;<a href="http://www.linuxtone.org/" target="_blank"><span style="color: #909d73;">http://www.linuxtone.org</span></a> (IT运维专家网|集群架构|性能调优)<br />
欢迎转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明.<br />
首发时间: 2008-11-25&nbsp; &nbsp;&nbsp;&nbsp;更新时间:2009-1-14<br />
<br />
目 录<br />
<span style="color: #008000;"><em>一、&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;Nginx 基础知识</em></span><br />
<span style="color: #008000;"><em>二、&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;Nginx 安装及调试</em></span><br />
<span style="color: #008000;"><em>三、&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;Nginx Rewrite</em></span><br />
<span style="color: #008000;"><em>四、&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;Nginx Redirect</em></span><br />
<span style="color: #008000;"><em>五、&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;Nginx 目录自动加斜线:</em></span><br />
<span style="color: #008000;"><em>六、&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;Nginx Location</em></span><br />
<span style="color: #008000;"><em>七、&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;Nginx expires</em></span><br />
<span style="color: #008000;"><em>八、&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;Nginx 防盗链</em></span><br />
<span style="color: #008000;"><em>九、&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;Nginx 访问控制</em></span><br />
<span style="color: #008000;"><em>十、&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;Nginx日志处理</em></span><br />
<span style="color: #008000;"><em>十一、&nbsp; &nbsp;&nbsp;&nbsp;Nginx Cache</em></span><br />
<span style="color: #008000;"><em>十二、&nbsp; &nbsp;&nbsp;&nbsp;</em></span><span style="color: #008000;"><em>Nginx负载均衡</em></span><br />
<span style="color: #008000;"><em>十三、 </em></span><span style="color: #008000;"><em>&nbsp; &nbsp;&nbsp; &nbsp;Nginx简单优化</em></span>&nbsp; &nbsp;&nbsp; &nbsp; <br />
<span style="color: #008000;"><em>十四、&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;如何构建高性能的LEMP环境</em></span><br />
<span style="color: #008000;"><em>十五、&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;Nginx服务监控</em></span><br />
<span style="color: #008000;"><em>十六、&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;常见问题与错误处理.</em></span><br />
<span style="color: #008000;"><em>十七、&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;相关资源下载</em></span><br />
<br />
【前言】：<br />
<span style="font-size: x-small;"><span style="font-size: xx-small;">编写此技术指南在于推广普及NGINX在国内的使用，更方便的帮助大家了解和掌握NGINX的一些使用技巧。本指南很多技巧来自于网络和工作中或网络上朋友们问我的问题.在此对网络上愿意分享的朋友们表示感谢和致意！欢迎大家和我一起丰富本技术指南提出更好的建议！请朋友们关注: </span><a href="http://www.linuxtone.org/" target="_blank"><span style="color: #909d73; font-size: xx-small;">http://www.linuxtone.org</span></a><span style="font-size: xx-small;"> 技术分享社区! 互想学习共同进步!</span></span><br />
<br />
<strong>一、 Nginx 基础知识</strong><br />
1、简介<br />
&nbsp; &nbsp;Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器，也是一个 IMAP/POP3/SMTP 代理服务器。 Nginx 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的，它已经在该站点运行超过两年半了。Igor 将源代码以类BSD许可证的形式发布。尽管还是测试版，但是，Nginx 已经因为它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名了。<br />
更多的请见官方wiki: <a href="http://wiki.codemongers.com/" target="_blank"><span style="color: #909d73;">http://wiki.codemongers.com/</span></a><br />
<br />
2、 Nginx的优点<br />
nginx做为HTTP服务器，有以下几项基本特性：<br />
<span style="color: #008000;">1)&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;处理静态文件，索引文件以及自动索引；打开文件描述符缓冲．</span><br />
<span style="color: #008000;">2)&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;无缓存的反向代理加速，简单的负载均衡和容错．</span><br />
<span style="color: #008000;">3)&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;FastCGI，简单的负载均衡和容错．</span><br />
<span style="color: #008000;">4)&nbsp;
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;模块化的结构。包括gzipping, byte ranges, chunked responses, 以及
SSI-filter等filter。如果由FastCGI或其它代理服务器处理单页中存在的多个SSI，则这项处理可以并行运行，而不需要相互等待。</span><br />
<span style="color: #008000;">5)&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;支持SSL 和 TLS SNI</span>．<br />
<br />
Nginx专为性能优化而开发，性能是其最重要的考量, 实现上非常注重效率 。它支持内核Poll模型，能经受高负载的考验, 有报告表明能支持高达 50,000 个并发连接数。<br />
Nginx具有很高的稳定性。其它HTTP服务器，当遇到访问的峰值，或者有人恶意发起慢速连接时，也很可能会导致服务器物理内存耗尽频繁交换，失去响应，只能重启服务器。例如当前apache一旦上到200个以上进程，web响
应速度就明显非常缓慢了。而Nginx采取了分阶段资源分配技术，使得它的CPU与内存占用率非常低。nginx官方表示保持10,000个没有活动的连
接，它只占2.5M内存，所以类似DOS这样的攻击对nginx来说基本上是毫无用处的。就稳定性而言, nginx比lighthttpd更胜一筹。<br />
Nginx支持热部署。它的启动特别容易, 并且几乎可以做到7*24不间断运行，即使运行数个月也不需要重新启动。你还能够在不间断服务的情况下，对软件版本进行进行升级。<br />
Nginx采用master-slave模型, 能够充分利用SMP的优势，且能够减少工作进程在磁盘I/O的阻塞延迟。当采用select()/poll()调用时，还可以限制每个进程的连接数。<br />
Nginx
代码质量非常高，代码很规范， 手法成熟， 模块扩展也很容易。特别值得一提的是强大的Upstream与Filter链。
Upstream为诸如reverse proxy,
与其他服务器通信模块的编写奠定了很好的基础。而Filter链最酷的部分就是各个filter不必等待前一个filter执行完毕。它可以把前一个
filter的输出做为当前filter的输入，这有点像Unix的管线。这意味着，一个模块可以开始压缩从后端服务器发送过来的请求，且可以在模块接收
完后端服务器的整个请求之前把压缩流转向客户端。<br />
Nginx采用了一些os提供的最新特性如对sendfile (Linux 2.2+)，accept-filter (FreeBSD 4.1+)，TCP_DEFER_ACCEPT (Linux 2.4+) 的支持，从而大大提高了性能<br />
<br />
<strong>二、 Nginx 安装及调试</strong><br />
1、Pcre 安装</p>
<div>
<div id="code0">
<ol>
    <li>./configure</li>
    <li>&nbsp;&nbsp;make &amp;&amp; make install</li>
    <li>&nbsp;&nbsp;cd ../</li>
</ol>
</div>
<em>复制代码</em></div>
<p>2.&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;nginx 编译安装</p>
<div>
<div id="code1">
<ol>
    <li>./configure --user=www --group=www --prefix=/usr/local/nginx/ --with-http_stub_status_module --with-openssl=/usr/local/openssl </li>
    <li>make &amp;&amp; make install</li>
</ol>
</div>
<em>复制代码</em></div>
<p>更详细的模块定制与安装请参照官方wiki. <br />
<br />
3、Nginx 配置文件测试：</p>
<div>
<div id="code2">
<ol>
    <li># /usr/local/nginx/sbin/nginx -t&nbsp;&nbsp;//Debug 配置文件的关键命令需要重点撑握.</li>
    <li>2008/12/16 09:08:35 [info] 28412#0: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok </li>
    <li>2008/12/16 09:08:35 [info] 28412#0: the configuration file /usr/local/nginx/conf/nginx.conf was tested successfully </li>
</ol>
</div>
<em>复制代码</em></div>
<p>3、Nginx 启动：</p>
<div>
<div id="code3">
<ol>
    <li># /usr/local/nginx/sbin/nginx </li>
</ol>
</div>
<em>复制代码</em></div>
<p>4、Nginx 配置文件修改重新加载：</p>
<div>
<div id="code4">
<ol>
    <li># kill -HUP `cat /usr/local/nginx/logs/nginx.pid</li>
</ol>
</div>
<em>复制代码</em></div>
<p>`<br />
<strong>三、Nginx Rewrite</strong><br />
<br />
1.&nbsp;&nbsp;Nginx Rewrite 基本标记(flags)<br />
<span style="color: #008000;"><em>last - 基本上都用这个Flag。</em></span><br />
<span style="color: #008000;"><em>※相当于Apache里的[L]标记，表示完成rewrite，不再匹配后面的规则</em></span><br />
<span style="color: #008000;"><em>break - 中止Rewirte，不再继续匹配</em></span><br />
<span style="color: #008000;"><em>redirect - 返回临时重定向的HTTP状态302</em></span><br />
<span style="color: #008000;"><em>permanent - 返回永久重定向的HTTP状态301</em></span><br />
&nbsp; &nbsp;&nbsp; &nbsp;<strong>※原有的url支持正则&nbsp;&nbsp;重写的url不支持正则</strong><br />
<br />
2.&nbsp;&nbsp;正则表达式匹配，其中：<br />
<em>&nbsp; &nbsp; * ~&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;为区分大小写匹配</em><br />
<em>&nbsp; &nbsp; * ~*&nbsp; &nbsp;&nbsp; &nbsp; 为不区分大小写匹配</em><br />
<em>&nbsp; &nbsp; * !~和!~*&nbsp; &nbsp;分别为区分大小写不匹配及不区分大小写不匹配</em><br />
<br />
3. 文件及目录匹配，其中：<br />
&nbsp;&nbsp;<em> * -f和!-f用来判断是否存在文件</em><br />
<em>&nbsp; &nbsp; * -d和!-d用来判断是否存在目录</em><br />
<em>&nbsp; &nbsp; * -e和!-e用来判断是否存在文件或目录</em><br />
<em>&nbsp; &nbsp; * -x和!-x用来判断文件是否可执行</em><br />
<br />
<br />
3.&nbsp;&nbsp;Nginx 的一些可用的全局变量，可用做条件判断：</p>
<div>
<div id="code5">
<ol>
    <li>$args</li>
    <li>$content_length</li>
    <li>$content_type</li>
    <li>$document_root</li>
    <li>$document_uri</li>
    <li>$host</li>
    <li>$http_user_agent</li>
    <li>$http_cookie</li>
    <li>$limit_rate</li>
    <li>$request_body_file</li>
    <li>$request_method</li>
    <li>$remote_addr</li>
    <li>$remote_port</li>
    <li>$remote_user</li>
    <li>$request_filename</li>
    <li>$request_uri</li>
    <li>$query_string</li>
    <li>$scheme</li>
    <li>$server_protocol</li>
    <li>$server_addr</li>
    <li>$server_name</li>
    <li>$server_port</li>
    <li>$uri</li>
</ol>
</div>
<em>复制代码</em></div>
<p><strong>四、 Nginx Redirect</strong><br />
将所有linuxtone.org与netseek.linuxtone.org域名全部自跳转到<a href="http://www.linuxtone.org/" target="_blank"><span style="color: #909d73;">http://www.linuxtone.org</span></a></p>
<div>
<div id="code6">
<ol>
    <li>server</li>
    <li>{</li>
    <li>listen 80;</li>
    <li>server_name linuxtone.org netseek.linuxtone.org;</li>
    <li>index index.html index.php;</li>
    <li>root /data/www/wwwroot;</li>
    <li>if ($host !~ "^www.linxtone.org$") {</li>
    <li>rewrite ^(.*) http://www.linuxtone.org$1 redirect;</li>
    <li>}</li>
    <li>........................</li>
    <li>}</li>
</ol>
</div>
<em>复制代码</em></div>
<p><strong>五、 Nginx 目录自动加斜线:</strong></p>
<div>
<div id="code7">
<ol>
    <li>if (-d $request_filename){</li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;rewrite ^/(.*)([^/])$ http://$host/$1$2/ permanent;</li>
    <li>&nbsp; &nbsp;&nbsp;&nbsp;}</li>
</ol>
</div>
<em>复制代码</em></div>
<p><strong>六&nbsp;&nbsp;Nginx Location</strong><br />
<br />
1．基本语法:[和上面rewrite正则匹配语法基本一致]<br />
<strong>location [=|~|~*|^~] /uri/ { &#8230; }</strong><br />
&nbsp; &nbsp; <span style="color: #008000;"><em>* ~&nbsp;&nbsp;为区分大小写匹配</em></span><br />
<span style="color: #008000;"><em>&nbsp; &nbsp; * ~* 为不区分大小写匹配</em></span><br />
<span style="color: #008000;"><em>&nbsp; &nbsp; * !~和!~*分别为区分大小写不匹配及不区分大小写不匹配</em></span><br />
<br />
示例1:<br />
<em>location = / {</em><br />
<em># matches the query / only.</em><br />
<em># 只匹配 / 查询。</em><br />
<em>}</em><br />
<strong>匹配任何查询，因为所有请求都已 / 开头。但是正则表达式规则和长的块规则将被优先和查询匹配</strong><br />
<br />
示例2:<br />
<em>location ^~ /images/ {</em><br />
<em># matches any query beginning with /images/ and halts searching,</em><br />
<em># so regular expressions will not be checked.</em><br />
# 匹配任何已 /images/ 开头的任何查询并且停止搜索。任何正则表达式将不会被测试。<br />
<br />
示例3:<br />
<span style="color: #008000;"><em>location ~* .(gif|jpg|jpeg)$ {</em></span><br />
<span style="color: #008000;"><em># matches any request ending in gif, jpg, or jpeg. However, all</em></span><br />
<span style="color: #008000;"><em># requests to the /images/ directory will be handled by </em></span><br />
<span style="color: #008000;"><em>}</em></span><br />
<strong># 匹配任何已 gif、jpg 或 jpeg 结尾的请求。</strong><br />
<br />
<br />
<strong>七、 Nginx expires</strong><br />
<br />
1．根据文件类型expires</p>
<div>
<div id="code8">
<ol>
    <li># Add expires header for static content</li>
    <li>location ~* .(js|css|jpg|jpeg|gif|png|swf)$ {</li>
    <li>&nbsp; &nbsp; if (-f $request_filename) {</li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp; root /data/www/wwwroot/bbs;</li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp; expires&nbsp; &nbsp;&nbsp; &nbsp;1d;</li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp; break;</li>
    <li>&nbsp; &nbsp; }</li>
    <li>}</li>
</ol>
</div>
<em>复制代码</em></div>
<p>2、根据判断某个目录</p>
<div>
<div id="code9">
<ol>
    <li># serve static files</li>
    <li>location ~ ^/(images|javascript|js|css|flash|media|static)/&nbsp;&nbsp;{</li>
    <li>root&nbsp; &nbsp; /data/www/wwwroot/down;</li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;expires 30d;</li>
    <li>&nbsp;&nbsp;}</li>
</ol>
</div>
<em>复制代码</em></div>
<p><strong>八、&nbsp;&nbsp;Nginx 防盗链</strong><br />
<br />
1.&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;针对不同的文件类型</p>
<div>
<div id="code10">
<ol>
    <li>#Preventing hot linking of images and other file types</li>
    <li>location ~* ^.+.(gif|jpg|png|swf|flv|rar|zip)$ {</li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;valid_referers none blocked server_names *.linuxtone.org linuxtone.org http://localhost baidu.com;</li>
    <li>if ($invalid_referer) {</li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;rewrite&nbsp; &nbsp;^/&nbsp; &nbsp;;</li>
    <li>&nbsp; &nbsp;&nbsp;&nbsp;# return&nbsp; &nbsp;403;</li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;}</li>
    <li>}</li>
</ol>
</div>
<em>复制代码</em></div>
<p>2.&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;针对不同的目录</p>
<div>
<div id="code11">
<ol>
    <li>location /img/ {</li>
    <li>&nbsp; &nbsp; root /data/www/wwwroot/bbs/img/;</li>
    <li>&nbsp; &nbsp; valid_referers none blocked server_names *.linuxtone.org http://localhost baidu.com;</li>
    <li>&nbsp; &nbsp; if ($invalid_referer) {</li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; rewrite&nbsp;&nbsp;^/&nbsp;&nbsp;;</li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; #return&nbsp; &nbsp;403;</li>
    <li>&nbsp; &nbsp; }</li>
    <li>}</li>
</ol>
</div>
<em>复制代码</em></div>
<p>3.&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;同实现防盗链和expires的方法</p>
<div>
<div id="code12">
<ol>
    <li>#Preventing hot linking of images and other file types</li>
    <li>location ~* ^.+.(gif|jpg|png|swf|flv|rar|zip)$ {</li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;valid_referers none blocked server_names *.linuxtone.org linuxtone.org http://localhost ;</li>
    <li>if ($invalid_referer) {</li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;rewrite&nbsp; &nbsp;^/&nbsp; &nbsp;;</li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;}</li>
    <li>&nbsp; &nbsp;&nbsp;&nbsp;access_log off;</li>
    <li>&nbsp; &nbsp;&nbsp;&nbsp;root /data/www/wwwroot/bbs;</li>
    <li>expires 1d;</li>
    <li>&nbsp; &nbsp;&nbsp;&nbsp;break;</li>
    <li>}</li>
</ol>
</div>
<em>复制代码</em></div>
<p><strong>九、 Nginx 访问控制</strong><br />
<br />
1.&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;Nginx 身份证验证</p>
<div>
<div id="code13">
<ol>
    <li>#cd /usr/local/nginx/conf</li>
    <li>#mkdir htpasswd</li>
    <li>/usr/local/apache2/bin/htpasswd -c /usr/local/nginx/conf/htpasswd/tongji linuxtone </li>
    <li>#添加用户名为linuxtone</li>
    <li>New password:&nbsp; &nbsp;(此处输入你的密码)</li>
    <li>Re-type new password:&nbsp; &nbsp;(再次输入你的密码)</li>
    <li>Adding password for user</li>
    <li>http://count.linuxtone.org/tongji/data/index.html(目录存在/data/www/wwwroot/tongji/data/目录下)</li>
    <li>将下段配置放到虚拟主机目录，当访问http://count.linuxtone/tongji/即提示要密验证:</li>
    <li>location ~ ^/(tongji)/&nbsp;&nbsp;{</li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; root&nbsp; &nbsp; /data/www/wwwroot/count;</li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;auth_basic&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;"LT-COUNT-TongJi";</li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;auth_basic_user_file&nbsp;&nbsp;/usr/local/nginx/conf/htpasswd/tongji;</li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; }</li>
</ol>
</div>
<em>复制代码</em></div>
<p>2.&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;Nginx 禁止访问某类型的文件.<br />
如，Nginx下禁止访问*.txt文件，配置方法如下.</p>
<div>
<div id="code14">
<ol>
    <li>location ~* .(txt|doc)$ {</li>
    <li>&nbsp; &nbsp;if (-f $request_filename) {</li>
    <li>&nbsp; &nbsp;root /data/www/wwwroot/linuxtone/test;</li>
    <li>&nbsp; &nbsp;#rewrite &#8230;..可以重定向到某个URL</li>
    <li>&nbsp; &nbsp;break;</li>
    <li>&nbsp; &nbsp;}</li>
    <li>}</li>
</ol>
</div>
<em>复制代码</em></div>
<p>方法2:</p>
<div>
<div id="code15">
<ol>
    <li>location ~* .(txt|doc)${</li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;root /data/www/wwwroot/linuxtone/test;</li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;deny all;</li>
    <li>}</li>
</ol>
</div>
<em>复制代码</em></div>
<p>实例:<br />
禁止访问某个目录</p>
<div>
<div id="code16">
<ol>
    <li>location ~ ^/(WEB-INF)/ { </li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;deny all; </li>
    <li>}&nbsp;&nbsp;</li>
</ol>
</div>
<em>复制代码</em></div>
<p>3.&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;使用ngx_http_access_module限制ip访问</p>
<div>
<div id="code17">
<ol>
    <li>location / {</li>
    <li>&nbsp; &nbsp; deny&nbsp; &nbsp; 192.168.1.1;</li>
    <li>&nbsp; &nbsp; allow&nbsp; &nbsp;192.168.1.0/24;</li>
    <li>&nbsp; &nbsp; allow&nbsp; &nbsp;10.1.1.0/16;</li>
    <li>&nbsp; &nbsp; deny&nbsp; &nbsp; all;</li>
    <li>}</li>
</ol>
</div>
<em>复制代码</em></div>
<p>详细参见wiki: <a href="http://wiki.codemongers.com/NginxHttpAccessModule#allow" target="_blank"><span style="color: #909d73;">http://wiki.codemongers.com/NginxHttpAccessModule#allow</span></a><br />
<br />
4.&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;Nginx 下载限制并发和速率</p>
<div>
<div id="code18">
<ol>
    <li>limit_zone&nbsp; &nbsp;linuxtone&nbsp;&nbsp;$binary_remote_addr&nbsp;&nbsp;10m;</li>
    <li>server</li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp; {</li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;listen&nbsp; &nbsp;&nbsp; &nbsp; 80;</li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;server_name&nbsp;&nbsp;down.linuxotne.org;</li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;index index.html index.htm index.php;</li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;root&nbsp; &nbsp;/data/www/wwwroot/down;</li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;#Zone limit</li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;location / {</li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; limit_conn&nbsp; &nbsp;linuxtone&nbsp;&nbsp;1;</li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; limit_rate&nbsp;&nbsp;20k;</li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;}</li>
    <li>..........</li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp; }</li>
</ol>
</div>
<em>复制代码</em></div>
<p>只允许客房端一个线程,每个线程20k.<br />
【注】<span style="color: #008000;">limit_zone&nbsp; &nbsp;linuxtone&nbsp;&nbsp;$binary_remote_addr&nbsp;&nbsp;10m; 这个可以定义在主的</span><br />
<br />
<br />
5.&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;Nginx 实现Apache一样目录列表</p>
<div>
<div id="code19">
<ol>
    <li>location&nbsp;&nbsp;/&nbsp;&nbsp;{</li>
    <li>&nbsp; &nbsp; autoindex&nbsp;&nbsp;on;</li>
    <li>}</li>
</ol>
</div>
<em>复制代码</em></div>
<p>6.&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;上文件大小限制<br />
主配置文件里加入如下，具体大小根据你自己的业务做调整。<br />
<span style="color: #008000;">client_max_body_size 10m;&nbsp; &nbsp;&nbsp; &nbsp; </span>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;<br />
<br />
十、&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;Nginx 日志处理<br />
<br />
1.Nginx 日志切割<br />
<span style="color: #008000;">#contab -e</span><br />
<span style="color: #008000;">59 23 * * * /usr/local/sbin/logcron.sh /dev/null 2&gt;&amp;1</span><br />
<span style="color: #008000;">[root@count ~]# cat /usr/local/sbin/logcron.sh</span></p>
<div>
<div id="code20">
<ol>
    <li>#!/bin/bash</li>
    <li>log_dir="/data/logs"</li>
    <li>time=`date +%Y%m%d`&nbsp;&nbsp;</li>
    <li>/bin/mv&nbsp;&nbsp;${log_dir}/access_linuxtone.org.log ${log_dir}/access_count.linuxtone.org.$time.log</li>
    <li>kill -USR1 `cat&nbsp;&nbsp;/var/run/nginx.pid`</li>
</ol>
</div>
<em>复制代码</em></div>
<p>更多的日志分析与处理就关注(同时欢迎你参加讨论):<a href="http://bbs.linuxtone.org/forum-8-1.html" target="_blank"><span style="color: #909d73;">http://bbs.linuxtone.org/forum-8-1.html</span></a><br />
<br />
2.利用AWSTATS分析NGINX日志<br />
&nbsp;&nbsp;设置好Nginx日志格式,仍后利用awstats进行分析.<br />
请参考: <a href="http://bbs.linuxtone.org/thread-56-1-1.html" target="_blank"><span style="color: #909d73;">http://bbs.linuxtone.org/thread-56-1-1.html</span></a><br />
<br />
3.&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;Nginx 如何不记录部分日志<br />
日志太多，每天好几个G，少记录一些，下面的配置写到server{}段中就可以了<br />
location ~ .*.(js|jpg|JPG|jpeg|JPEG|css|bmp|gif|GIF)$<br />
{<br />
&nbsp; &nbsp;&nbsp;&nbsp;access_log off;<br />
}<br />
<br />
<strong>十一、Nginx Cache服务配置</strong><br />
<br />
如果需要将文件缓存到本地，则需要增加如下几个子参数：</p>
<div>
<div id="code21">
<ol>
    <li>proxy_store on;</li>
    <li>proxy_store_access user:rw group:rw all:rw;</li>
    <li>proxy_temp_path 缓存目录;</li>
</ol>
</div>
<em>复制代码</em></div>
<p>其中，<br />
proxy_store on用来启用缓存到本地的功能，<br />
proxy_temp_path用来指定缓存在哪个目录下，如：proxy_temp_path html;<br />
<br />
在经过上一步配置之后，虽然文件被缓存到了本地磁盘上，但每次请求仍会向远端拉取文件，为了避免去远端拉取文件，必须修改</p>
<div>
<div id="code22">
<ol>
    <li>proxy_pass：</li>
    <li>if ( !-e $request_filename) {</li>
    <li>&nbsp; &nbsp; proxy_pass&nbsp;&nbsp;http://mysvr;</li>
    <li>}</li>
</ol>
</div>
<em>复制代码</em></div>
<p>即改成有条件地去执行proxy_pass，这个条件就是当请求的文件在本地的proxy_temp_path指定的目录下不存在时，再向后端拉取。<br />
<br />
&nbsp; &nbsp;<br />
更多更高级的应用可以研究ncache,详细请参照<a href="http://bbs.linuxtone.org/" target="_blank"><span style="color: #909d73;">http://bbs.linuxtone.org</span></a> 里ncache相关的贴子.<br />
<br />
<strong>十二、Nginx 负载均衡</strong><br />
1. Nginx 负载均衡基础知识<br />
nginx的upstream目前支持4种方式的分配<br />
<span style="color: #2e8b57;">1)、轮询（默认）</span><br />
<span style="color: #2e8b57;">每个请求按时间顺序逐一分配到不同的后端服务器，如果后端服务器down掉，能自动剔除。</span><br />
<span style="color: #2e8b57;">2)、weight</span><br />
<span style="color: #2e8b57;">指定轮询几率，weight和访问比率成正比，用于后端服务器性能不均的情况。</span><br />
<span style="color: #2e8b57;">2)、ip_hash</span><br />
<span style="color: #2e8b57;">每个请求按访问ip的hash结果分配，这样每个访客固定访问一个后端服务器，可以解决session的问题。</span><br />
<span style="color: #2e8b57;">3)、fair（第三方）</span><br />
<span style="color: #2e8b57;">按后端服务器的响应时间来分配请求，响应时间短的优先分配。 </span><br />
<span style="color: #2e8b57;">4)、url_hash（第三方）</span><br />
<br />
2.&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;Nginx 负载均衡实例1</p>
<div>
<div id="code23">
<ol>
    <li>upstream bbs.linuxtone.org {#定义负载均衡设备的Ip及设备状态</li>
    <li>&nbsp; &nbsp; server 127.0.0.1:9090 down;</li>
    <li>&nbsp; &nbsp; server 127.0.0.1:8080 weight=2;</li>
    <li>&nbsp; &nbsp; server 127.0.0.1:6060;</li>
    <li>&nbsp; &nbsp; server 127.0.0.1:7070 backup;</li>
    <li>}</li>
</ol>
</div>
<em>复制代码</em></div>
<p>在需要使用负载均衡的server中增加<br />
proxy_pass <a href="http://bbs.linuxtone.org/" target="_blank"><span style="color: #909d73;">http://bbs.linuxtone.org/</span></a>;<br />
<br />
每个设备的状态设置为:<br />
<span style="color: #2e8b57;">a)&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;down 表示单前的server暂时不参与负载</span><br />
<span style="color: #2e8b57;">b)&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;weight 默认为1.weight越大，负载的权重就越大。</span><br />
<span style="color: #2e8b57;">c)&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;max_fails ：允许请求失败的次数默认为1.当超过最大次数时，返回proxy_next_upstream 模块定义的错误</span><br />
<span style="color: #2e8b57;">d)&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;fail_timeout:max_fails次失败后，暂停的时间。</span><br />
<span style="color: #2e8b57;">e)&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;backup： 其它所有的非backup机器down或者忙的时候，请求backup机器。所以这台机器压力会最轻。</span><br />
<br />
nginx支持同时设置多组的负载均衡，用来给不用的server来使用。<br />
<br />
client_body_in_file_only 设置为On 可以讲client post过来的数据记录到文件中用来做debug<br />
client_body_temp_path 设置记录文件的目录 可以设置最多3层目录<br />
location 对URL进行匹配.可以进行重定向或者进行新的代理 负载均衡<br />
<br />
<br />
3.&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;Nginx 负载均衡实例 2<br />
按访问url的hash结果来分配请求，使每个url定向到同一个后端服务器，后端服务器为缓存时比较有效,也可以用作提高Squid缓存命中率.<br />
<br />
简单的负载均等实例:<br />
#vi nginx.conf&nbsp;&nbsp;//nginx主配置文件核心配置</p>
<div>
<div id="code24">
<ol>
    <li>&#8230;&#8230;&#8230;.</li>
    <li>#loadblance my.linuxtone.org</li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp; upstream&nbsp;&nbsp;my.linuxtone.org&nbsp;&nbsp;{</li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp; ip_hash;</li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp; server&nbsp; &nbsp;127.0.0.1:8080;</li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp; server&nbsp; &nbsp;192.168.169.136:8080;</li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp; server&nbsp; &nbsp;219.101.75.138:8080;</li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp; server&nbsp; &nbsp;192.168.169.117;</li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp; server&nbsp; &nbsp;192.168.169.118;</li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp; server&nbsp; &nbsp;192.168.169.119;</li>
    <li>&nbsp; &nbsp;&nbsp;&nbsp;}</li>
    <li>&#8230;&#8230;&#8230;&#8230;..</li>
    <li>include&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; vhosts/linuxtone_lb.conf;</li>
    <li>&#8230;&#8230;&#8230;</li>
    <li># vi proxy.conf</li>
    <li>proxy_redirect off;</li>
    <li>proxy_set_header Host $host;</li>
    <li>proxy_set_header X-Real-IP $remote_addr;</li>
    <li>proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;</li>
    <li>client_max_body_size 50m;</li>
    <li>client_body_buffer_size 256k;</li>
    <li>proxy_connect_timeout 30;</li>
    <li>proxy_send_timeout 30;</li>
    <li>proxy_read_timeout 60;</li>
    <li>proxy_buffer_size 4k;</li>
    <li>proxy_buffers 4 32k;</li>
    <li>proxy_busy_buffers_size 64k;</li>
    <li>proxy_temp_file_write_size 64k;</li>
    <li>proxy_next_upstream error timeout invalid_header http_500 http_503 http_404;</li>
    <li>proxy_max_temp_file_size 128m;</li>
    <li>proxy_store on;</li>
    <li>proxy_store_access&nbsp; &nbsp;user:rw&nbsp;&nbsp;group:rw&nbsp;&nbsp;all:r;</li>
    <li>#nginx cache&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;</li>
    <li>#client_body_temp_path&nbsp;&nbsp;/data/nginx_cache/client_body 1 2;</li>
    <li>proxy_temp_path /data/nginx_cache/proxy_temp 1 2;</li>
</ol>
</div>
<em>复制代码</em></div>
<p>#vi&nbsp;&nbsp;linuxtone_lb.conf</p>
<div>
<div id="code25">
<ol>
    <li>server</li>
    <li>&nbsp; &nbsp; {</li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;listen&nbsp;&nbsp;80;</li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;server_name my.linuxtone.org;</li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;index index.php;</li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;root /data/www/wwwroot/mylinuxtone;</li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;if (-f $request_filename) {</li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;break;</li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;}</li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;if (-f $request_filename/index.php) {</li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; rewrite (.*) $1/index.php break;</li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;}</li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;error_page 403 http://my.linuxtone.org/member.php?m=user&amp;a=login;</li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;location / {</li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;if ( !-e $request_filename) {</li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;proxy_pass http://my.linuxtone.org;</li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;break;</li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;}</li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;include /usr/local/nginx/conf/proxy.conf;</li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;}</li>
    <li>}</li>
</ol>
</div>
<em>复制代码</em></div>
<p><strong><br />
<br />
十三、Nginx简单优化</strong><br />
<br />
1.&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;减小nginx编译后的文件大小 (Reduce file size of nginx)<br />
默认的nginx编译选项里居然是用debug模式(-g)的（debug模式会插入很多跟踪和ASSERT之类），编译以后一个nginx有好几兆。去掉nginx的debug模式编译，编译以后只有几百K<br />
在 auto/cc/gcc，最后几行有：<br />
# debug</p>
<div>
<div id="code26">
<ol>
    <li>CFLAGS=&#8221;$CFLAGS -g&#8221;</li>
</ol>
</div>
<em>复制代码</em></div>
<p>注释掉或删掉这几行，重新编译即可。<br />
<br />
2.&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;修改Nginx的header伪装服务器<br />
1)&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;修改nginx.h</p>
<div>
<div id="code27">
<ol>
    <li>#vi nginx-0.7.30/src/core/nginx.h</li>
    <li>#define NGINX_VERSION&nbsp; &nbsp;&nbsp; &nbsp;"1.8"</li>
    <li>#define NGINX_VER&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; "LTWS/" NGINX_VERSION</li>
    <li>#define NGINX_VAR&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; "NGINX"</li>
    <li>#define NGX_OLDPID_EXT&nbsp; &nbsp;&nbsp;&nbsp;".oldbin"</li>
</ol>
</div>
<em>复制代码</em></div>
<p>2) 修改nginx_http_header_filter_module<br />
#vi nginx-0.7.30/src/http/ngx_http_header_filter_module.c<br />
将如下</p>
<div>
<div id="code28">
<ol>
    <li>static char ngx_http_server_string[] = "Server: nginx" CRLF;</li>
</ol>
</div>
<em>复制代码</em></div>
<p>修改为</p>
<div>
<div id="code29">
<ol>
    <li>static char ngx_http_server_string[] = "Server: LTWS" CRLF;</li>
</ol>
</div>
<em>复制代码</em></div>
<p>a)&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;修改nginx_http_header_filter_module<br />
#vi nginx-0.7.30/src/http/ngx_http_special_response.c<br />
将如下：</p>
<div>
<div id="code30">
<ol>
    <li>static u_char ngx_http_error_full_tail[] =</li>
    <li>"&lt;hr&gt;&lt;center&gt;" NGINX_VER "&lt;/center&gt;" CRLF</li>
    <li>"&lt;/body&gt;" CRLF</li>
    <li>"&lt;/html&gt;" CRLF</li>
    <li>;</li>
</ol>
</div>
<em>复制代码</em></div>
<div>
<div id="code31">
<ol>
    <li>static u_char ngx_http_error_tail[] =</li>
    <li>"&lt;hr&gt;&lt;center&gt;nginx&lt;/center&gt;" CRLF</li>
    <li>"&lt;/body&gt;" CRLF</li>
    <li>"&lt;/html&gt;" CRLF</li>
    <li>;</li>
</ol>
</div>
<em>复制代码</em></div>
<p>修改为:</p>
<div>
<div id="code32">
<ol>
    <li>static u_char ngx_http_error_full_tail[] =</li>
    <li>"&lt;center&gt; "NGINX_VER" &lt;/center&gt;" CRLF</li>
    <li>"&lt;hr&gt;&lt;center&gt;http://www.linuxtone.org&lt;/center&gt;" CRLF</li>
    <li>"&lt;/body&gt;" CRLF</li>
    <li>"&lt;/html&gt;" CRLF</li>
    <li>;</li>
    <li>static u_char ngx_http_error_tail[] =</li>
    <li>"&lt;hr&gt;&lt;center&gt;LTWS&lt;/center&gt;" CRLF</li>
    <li>"&lt;/body&gt;" CRLF</li>
    <li>"&lt;/html&gt;" CRLF</li>
    <li>;</li>
</ol>
</div>
<em>复制代码</em></div>
<p>修改后重新编译一下环境,<br />
404错误的时候显示效果图（如果没有指定错误页的话）：<br />
<img src="http://bbs.linuxtone.org/attachment.php?aid=471&amp;k=9efdde89f8d142d59a3e405309efb0df&amp;t=1241016918&amp;noupdate=yes" alt="404.png" border="0" width="298" /></p>
<p>利用curl命令查看服务器header<br />
<img src="http://bbs.linuxtone.org/attachment.php?aid=472&amp;k=bcfb32d7549db1d76f41f4e00dc5d47e&amp;t=1241016918&amp;noupdate=yes" alt="curl.png" border="0" width="358" /></p>
<div id="aimg_472_menu" class="t_attach" style="position: absolute; display: none;"><a title="curl.png" href="http://bbs.linuxtone.org/attachment.php?aid=472&amp;k=bcfb32d7549db1d76f41f4e00dc5d47e&amp;t=1241016918&amp;nothumb=yes" target="_blank"><strong><span style="color: #909d73;">下载</span></strong></a> (3.02 KB)<br />
<div>2009-2-2 00:20</div>
</div>
<p><br />
<br />
<strong>&nbsp;</strong></p>
<p><strong>3.为特定的CPU指定CPU类型编译优化.</strong><br />
默认nginx使用的GCC编译参数是-O<br />
需要更加优化可以使用以下两个参数<br />
--with-cc-opt='-O3' <br />
--with-cpu-opt=opteron <br />
使得编译针对特定CPU以及增加GCC的优化.<br />
此方法仅对性能有所改善并不会有很大的性能提升，供朋友们参考.<br />
CPUD类型确定: # cat /proc/cpuinfo | grep "model name"<br />
编译优化参数参考：<a href="http://en.gentoo-wiki.com/wiki/Safe_Cflags" target="_blank"><span style="color: #909d73;">http://en.gentoo-wiki.com/wiki/Safe_Cflags</span></a></p>
<p><br />
<strong>4.Tcmalloc优化Nginx 性能</strong></p>
<div>
<div id="code33">
<ol>
    <li># wget http://download.savannah.gnu.org/releases/libunwind/libunwind-0.99-alpha.tar.gz</li>
    <li># tar zxvf libunwind-0.99-alpha.tar.gz</li>
    <li># cd libunwind-0.99-alpha/</li>
    <li># CFLAGS=-fPIC ./configure</li>
    <li># make CFLAGS=-fPIC</li>
    <li># make CFLAGS=-fPIC install</li>
    <li># wget http://google-perftools.googlecode.com/files/google-perftools-0.98.tar.gz</li>
    <li># tar zxvf google-perftools-0.98.tar.gz</li>
    <li># cd google-perftools-0.98/</li>
    <li># ./configure</li>
    <li># make &amp;&amp; make install</li>
    <li># echo "/usr/local/lib" &gt; /etc/ld.so.conf.d/usr_local_lib.conf</li>
    <li># ldconfig</li>
    <li># lsof -n | grep tcmalloc</li>
</ol>
</div>
<em>复制代码</em></div>
<p>编译nginx 加载google_perftools_module:<br />
./configure --with-google_perftools_module<br />
在主配置文件加入nginx.conf 添加:<br />
google_perftools_profiles /path/to/profile;<br />
<br />
5.内核参数优化<br />
# vi /etc/sysctl.conf&nbsp; &nbsp;#在末尾增加以下内容：</p>
<div>
<div id="code34">
<ol>
    <li>net.ipv4.tcp_fin_timeout = 30</li>
    <li>net.ipv4.tcp_keepalive_time = 300</li>
    <li>net.ipv4.tcp_syncookies = 1</li>
    <li>net.ipv4.tcp_tw_reuse = 1</li>
    <li>net.ipv4.tcp_tw_recycle = 1</li>
    <li>net.ipv4.ip_local_port_range = 5000 65000</li>
</ol>
</div>
<em>复制代码</em></div>
<p>#使配置立即生效<br />
/sbin/sysctl -p<br />
<br />
<strong>十四、如何构建高性的LEMP</strong><br />
请参见: <a href="http://www.linuxtone.org/lemp/lemp.pdf" target="_blank"><span style="color: #909d73;">http://www.linuxtone.org/lemp/lemp.pdf</span></a><br />
1、提供完整的配置脚本下载：<a href="http://www.linuxtone.org/lemp/scripts.tar.gz" target="_blank"><span style="color: #909d73;">http://www.linuxtone.org/lemp/scripts.tar.gz</span></a><br />
2、提供NGINX常见配置范例含(虚拟主机，防盗链，Rewrite,访问控制，负载均衡<br />
Discuz相关程序静态化及等等),你只要稍稍修改即可线上应用。 3、将原版的xcache替换成EA，并提供相关简单调优脚本及配置文件。<br />
更多的及更新资料请关注: <a href="http://www.linuxtone.org/" target="_blank"><span style="color: #909d73;">http://www.linuxtone.org</span></a><br />
<br />
<strong>十五、Nginx监控</strong><br />
1、&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;RRDTOOL+Perl脚本画图监控<br />
先安装好rrdtool ，关于rrdtool本文不作介绍，具体安装请参照linuxtone监控版块.<br />
#cd /usr/local/sbnin<br />
#wget <a href="http://blog.kovyrin.net/files/mrtg/rrd_nginx.pl.txt" target="_blank"><span style="color: #909d73;">http://blog.kovyrin.net/files/mrtg/rrd_nginx.pl.txt</span></a><br />
#mv rrd_nginx.pl.txt rrd_nginx.pl<br />
#chmod a+x rrd_nginx.pl<br />
<br />
#vi rrd_nginx.pl&nbsp; &nbsp;//配置脚本文件设置好路径<br />
#!/usr/bin/perl<br />
use RRDs;<br />
use LWP::UserAgent;<br />
<br />
# define location of rrdtool databases<br />
my $rrd = '/data/www/wwwroot/nginx/rrd';<br />
# define location of images<br />
my $img = '/data/www/wwwroot/nginx/html';<br />
# define your nginx stats URL<br />
my $URL = "http://219.232.244.13/nginx_status";<br />
&#8230;&#8230;&#8230;&#8230;<br />
【注】根据自己具体的状况修改相应的路径.<br />
#crontab &#8211;e //加入如下<br />
* * * * * /usr/local/sbin/rrd_nginx.pl<br />
重启crond后，通过配置nginx虚拟主机指到/data/www/wwwroot/nginx/html目录，通过crond自动执行perl脚本会生成很多图片.<br />
http://xxx/connections-day.png即可看到服务器状态图。<br />
<br />
2、&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;官方Nginx-rrd 监控服务（多虚拟主机）（推荐）<br />
网址：<a href="http://www.nginx.eu/nginx-rrd.html" target="_blank"><span style="color: #909d73;">http://www.nginx.eu/nginx-rrd.html</span></a><br />
此解决方案其实是基于上述监控方案的一个改进和增强，同样先安装好rrdtool这个画图工具和相应的perl模块再做如下操作：<br />
# yum install perl-HTML*<br />
先建立好生成的库存和图片存放录</p>
<div>
<div id="code35">
<ol>
    <li>#mkdir -p /data/www/wwwroot/nginx/{rrd,html}</li>
    <li>#cd /usr/local/sbin</li>
    <li>#wget http://www.nginx.eu/nginx-rrd/nginx-rrd-0.1.4.tgz</li>
    <li>#tar zxvf nginx-rrd-0.1.4.tgz</li>
    <li>#cd nginx-rrd-0.1.4</li>
    <li>#cd etc/</li>
    <li>#cp nginx-rrd.conf /etc</li>
    <li>#cd etc/cron.d</li>
    <li>#cp nginx-rrd.cron /etc/cron.d</li>
    <li>#cd /usr/local/src/nginx-rrd-0.1.4/html</li>
    <li># cp index.php /data/www/wwwroot/nginx/html/</li>
    <li>#cd /usr/local/src/nginx-rrd-0.1.4/usr/sbin</li>
    <li>#cp * /usr/sbin/</li>
</ol>
</div>
<em>复制代码</em></div>
<p>#vi /etc/nginx-rrd.conf</p>
<div>
<div id="code36">
<ol>
    <li>#####################################################</li>
    <li>#</li>
    <li># dir where rrd databases are stored</li>
    <li>RRD_DIR="/data/www/wwwroot/nginx/rrd";</li>
    <li># dir where png images are presented</li>
    <li>WWW_DIR="/data/www/wwwroot/nginx/html";</li>
    <li># process nice level</li>
    <li>NICE_LEVEL="-19";</li>
    <li># bin dir</li>
    <li>BIN_DIR="/usr/sbin";</li>
    <li># servers to test</li>
    <li># server_utl;server_name</li>
    <li>SERVERS_URL="http://219.32.205.13/nginx_status;219.32.205.13&nbsp;&nbsp;http://www.linuxtone.org/nginx_status;www.linuxtone.org"" </li>
</ol>
</div>
<em>复制代码</em></div>
<p>//根据你的具体情况做调整.<br />
SEVERS_URL 格式 http://domain1/nginx_status;domain1 http://domain2/nginx_status;domain2<br />
这种格式监控多虚拟主机连接状态：<br />
重点启crond服务，仍后通过<a href="http://219.32.205.13/nginx/html/" target="_blank"><span style="color: #909d73;">http://219.32.205.13/nginx/html/</span></a> 即可访问。配置过程很简单！<br />
<br />
3、&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;CACTI模板监控Nginx<br />
利用Nginx_status状态来画图实现CACTI监控<br />
nginx编译时允许http_stub_status_module<br />
<br />
# vi /usr/local/nginx/conf/nginx.conf</p>
<div>
<div id="code37">
<ol>
    <li>location /nginx_status {</li>
    <li>stub_status on;</li>
    <li>access_log off;</li>
    <li>allow 192.168.1.37;</li>
    <li>deny all;</li>
    <li>}</li>
</ol>
</div>
<em>复制代码</em></div>
<div>
<div id="code38">
<ol>
    <li># kill -HUP `cat /usr/local/nginx/logs/nginx.pid`</li>
    <li># wget http://forums.cacti.net/download.php?id=12676</li>
    <li># tar xvfz cacti-nginx.tar.gz</li>
    <li># cp cacti-nginx/get_nginx_socket_status.pl /data/cacti/scripts/</li>
    <li># cp cacti-nginx/get_nginx_clients_status.pl /data/cacti/scripts/</li>
    <li># chmod 755 /data/cacti/scripts/get_nginx*</li>
</ol>
</div>
<em>复制代码</em></div>
<p>检测插件</p>
<div>
<div id="code39">
<ol>
    <li># /data/cacti/scripts/get_nginx_clients_status.pl http://192.168.1.37/nginx_status</li>
</ol>
</div>
<em>复制代码</em></div>
<p>在cacti管理面板导入<br />
cacti_graph_template_nginx_clients_stat.xml<br />
cacti_graph_template_nginx_sockets_stat.xml<br />
<br />
<strong>十六、常见问题与错误处理</strong><br />
1、400 bad request错误的原因和解决办法<br />
配置nginx.conf相关设置如下.<br />
client_header_buffer_size 16k;<br />
large_client_header_buffers 4 64k;<br />
根据具体情况调整，一般适当调整值就可以。<br />
<br />
2、Nginx 502 Bad Gateway错误<br />
proxy_next_upstream error timeout invalid_header http_500 http_503;<br />
或者尝试设置:<br />
large_client_header_buffers 4 32k;<br />
<br />
<br />
3、Nginx出现的413 Request Entity Too Large错误<br />
这个错误一般在上传文件的时候会出现，<br />
编辑Nginx主配置文件Nginx.conf，找到http{}段，添加<br />
<span style="color: #008000;">client_max_body_size 10m</span>; //设置多大根据自己的需求作调整.<br />
如果运行php的话这个大小client_max_body_size要和php.ini中的如下值的最大值一致或者稍大，这样就不会因为提交数据大小不一致出现的错误。<br />
<span style="color: #008000;">post_max_size = 10M</span><br />
<span style="color: #008000;">upload_max_filesize = 2M</span><br />
<br />
4、解决504 Gateway Time-out(nginx)<br />
遇到这个问题是在升级discuz论坛的时候遇到的<br />
一般看来, 这种情况可能是由于nginx默认的fastcgi进程响应的缓冲区太小造成的, 这将导致fastcgi进程被挂起, 如果你的fastcgi服务对这个挂起处理的不好, 那么最后就极有可能导致504 Gateway Time-out<br />
现在的网站, 尤其某些论坛有大量的回复和很多内容的, 一个页面甚至有几百K。<br />
默认的fastcgi进程响应的缓冲区是8K, 我们可以设置大点<br />
在nginx.conf里, 加入： fastcgi_buffers 8 128k<br />
这表示设置fastcgi缓冲区为8&#215;128k<br />
当然如果您在进行某一项即时的操作, 可能需要nginx的超时参数调大点，例如设置成60秒：send_timeout 60;<br />
只是调整了这两个参数, 结果就是没有再显示那个超时, 可以说效果不错, 但是也可能是由于其他的原因, 目前关于nginx的资料不是很多, 很多事情都需要长期的经验累计才有结果, 期待您的发现哈!<br />
<br />
5、如何使用Nginx Proxy<br />
朋友一台服务器运行tomcat 为8080端口,IP:192.168.1.2:8080,另一台机器IP:192.168.1.8. 朋友想通过访问<a href="http://192.168.1.8/" target="_blank"><span style="color: #909d73;">http://192.168.1.8</span></a>即可访问tomcat服务.配置如下:<br />
在192.168.1.8的nginx.conf上配置如下:</p>
<div>
<div id="code40">
<ol>
    <li>server {</li>
    <li>listen 80;</li>
    <li>server_name java.linuxtone.org</li>
    <li>location / {</li>
    <li>proxy_pass http://192.168.1.2:8080;</li>
    <li>include /usr/local/nginx/conf/proxy.conf;</li>
    <li>}</li>
    <li>}</li>
</ol>
</div>
<em>复制代码</em></div>
<p>6、如何关闭Nginx的LOG<br />
access_log /dev/null; error_log /dev/null;<br />
<br />
<strong>十七、相关资源下载</strong><br />
<br />
1.nginx配置示例及脚本下载:<br />
# wget <a href="http://www.linuxtone.org/lemp/scripts.tar.gz" target="_blank"><span style="color: #909d73;">http://www.linuxtone.org/lemp/scripts.tar.gz</span></a> #此脚本范例定期更新.</p>
<p><br />
</p>
<div>
<strong>相关话题  （<a href="http://opensource.csdn.net/bbs/search?q=Nginx">查看更多</a>，<a href="http://opensource.csdn.net/docs/search?q=Nginx">知识库搜索</a>）</strong>
<ul>
    <li><a href="http://opensource.csdn.net/bbs/thread/2943" title="Nginx的网友评论">Nginx的网友评论</a></li>
    <li><a href="http://opensource.csdn.net/bbs/thread/13" title="Nginx 的日志切割处理">Nginx 的日志切割处理</a></li>
    <li><a href="http://opensource.csdn.net/bbs/thread/161" title="关于NGINX的session问题!">关于NGINX的session问题!</a></li>
    <li><a href="http://opensource.csdn.net/bbs/thread/12" title="Nginx 编译优化测试">Nginx 编译优化测试</a></li>
    <li><a href="http://opensource.csdn.net/bbs/thread/3615" title="nginx与awstats的使用">nginx与awstats的使用</a></li>
    <li><a href="http://opensource.csdn.net/bbs/thread/618" title="关于nginx连接weblogic的问题">关于nginx连接weblogic的问题</a></li>
    <li><a href="http://opensource.csdn.net/bbs/thread/2582" title="nginx+resin安装正常 访问nginx日志出现...求解达人">nginx+resin安装正常 访问nginx日志出现...求解达人</a></li>
    <li><a href="http://opensource.csdn.net/bbs/thread/3565" title="Nginx 的 default_server 指令">Nginx 的 default_server 指令</a></li>
    <li><a href="http://opensource.csdn.net/bbs/thread/2424" title="Nginx 的 proxy_store 缓存">Nginx 的 proxy_store 缓存</a></li>
    <li><a href="http://opensource.csdn.net/bbs/thread/2896" title="让 Nginx 关闭版本显示信息">让 Nginx 关闭版本显示信息</a></li>
</ul>
<br />
<br />
<div id="post_content_249627812">
<p>其中以下这项挺值得留意的。<br />
Tcmalloc 不单可用于 Mysql 的优化，还能应用于 Nginx<br />
虽说 Nginx 本身的性能跟系统占用已经做到很优秀。</p>
<p><strong>4.Tcmalloc优化Nginx 性能</strong></p>
<div>
<div id="code33">
<ol>
    <li># wget http://download.savannah.gnu.org/releases/libunwind/libunwind-0.99-alpha.tar.gz </li>
    <li># tar zxvf libunwind-0.99-alpha.tar.gz </li>
    <li># cd libunwind-0.99-alpha/ </li>
    <li># CFLAGS=-fPIC ./configure </li>
    <li># make CFLAGS=-fPIC </li>
    <li># make CFLAGS=-fPIC install </li>
    <li># wget http://google-perftools.googlecode.com/files/google-perftools-0.98.tar.gz </li>
    <li># tar zxvf google-perftools-0.98.tar.gz </li>
    <li># cd google-perftools-0.98/ </li>
    <li># ./configure </li>
    <li># make &amp;&amp; make install </li>
    <li># echo "/usr/local/lib" &gt; /etc/ld.so.conf.d/usr_local_lib.conf </li>
    <li># ldconfig </li>
    <li># lsof -n | grep tcmalloc </li>
    <li><br />
    </li>
</ol>
</div>
</div>
</div>
<br />
</div>
</div>
<br />
<br />
<img src ="http://www.blogjava.net/Skynet/aggbug/311426.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Skynet/" target="_blank">刘凯毅</a> 2010-01-31 23:08 <a href="http://www.blogjava.net/Skynet/archive/2010/01/31/311426.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>我的 vimrc</title><link>http://www.blogjava.net/Skynet/archive/2010/01/18/309949.html</link><dc:creator>刘凯毅</dc:creator><author>刘凯毅</author><pubDate>Mon, 18 Jan 2010 05:45:00 GMT</pubDate><guid>http://www.blogjava.net/Skynet/archive/2010/01/18/309949.html</guid><wfw:comment>http://www.blogjava.net/Skynet/comments/309949.html</wfw:comment><comments>http://www.blogjava.net/Skynet/archive/2010/01/18/309949.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Skynet/comments/commentRss/309949.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Skynet/services/trackbacks/309949.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: tabBar.vim这个插件实现了类似UltraEdit中的标签页的功能，而且能通过Alt-&lt;n&gt;来切换, 安装：拷贝文件到[你的gvim的安装目录]"vimfiles"plugin"中即可！下载：http://www.vim.org/scripts/script.php?script_id=1338C:/Program Files/Vim/_v...&nbsp;&nbsp;<a href='http://www.blogjava.net/Skynet/archive/2010/01/18/309949.html'>阅读全文</a><img src ="http://www.blogjava.net/Skynet/aggbug/309949.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Skynet/" target="_blank">刘凯毅</a> 2010-01-18 13:45 <a href="http://www.blogjava.net/Skynet/archive/2010/01/18/309949.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>libevent 学习笔记</title><link>http://www.blogjava.net/Skynet/archive/2010/01/05/308249.html</link><dc:creator>刘凯毅</dc:creator><author>刘凯毅</author><pubDate>Tue, 05 Jan 2010 03:21:00 GMT</pubDate><guid>http://www.blogjava.net/Skynet/archive/2010/01/05/308249.html</guid><wfw:comment>http://www.blogjava.net/Skynet/comments/308249.html</wfw:comment><comments>http://www.blogjava.net/Skynet/archive/2010/01/05/308249.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Skynet/comments/commentRss/308249.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Skynet/services/trackbacks/308249.html</trackback:ping><description><![CDATA[<br />
学习：<br />
http://blog.chinaunix.net/u1/59571/showart_2077664.html<br />
<br />
个人对上面文章做的 笔记共享出来 和大家分享！<br />
<br />
<img src="http://www.blogjava.net/images/blogjava_net/skynet/43407/o_libevent.png" alt="" border="0" /><br />
<img src ="http://www.blogjava.net/Skynet/aggbug/308249.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Skynet/" target="_blank">刘凯毅</a> 2010-01-05 11:21 <a href="http://www.blogjava.net/Skynet/archive/2010/01/05/308249.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MoinMoin wiki 服务器搭建 与尝试</title><link>http://www.blogjava.net/Skynet/archive/2009/12/20/306749.html</link><dc:creator>刘凯毅</dc:creator><author>刘凯毅</author><pubDate>Sun, 20 Dec 2009 15:34:00 GMT</pubDate><guid>http://www.blogjava.net/Skynet/archive/2009/12/20/306749.html</guid><wfw:comment>http://www.blogjava.net/Skynet/comments/306749.html</wfw:comment><comments>http://www.blogjava.net/Skynet/archive/2009/12/20/306749.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Skynet/comments/commentRss/306749.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Skynet/services/trackbacks/306749.html</trackback:ping><description><![CDATA[python easy_install moin 或 下载 moin-1.9.0 编译<br />
设置 path 中有 moin.py <br />
#我这 参考<br />
path = $PATH:/Python25/moin-1.9.0/MoinMoin/script<br />
<br />
# wikiconfig.py 下面我点下 参数 ，大家看代码 就知道了<br />
vi&nbsp; /Python25/moin-1.9.0/wiki/config/<strong>wikiconfig.py</strong><br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008000;">#</span><span style="color: #008000;">instance_dir&nbsp;=&nbsp;'/where/ever/your/instance/is'</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">instance_dir&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;wikiconfig_dir</span><span style="color: #000000;">+</span><span style="color: #800000;">'</span><span style="color: #800000;">/../</span><span style="color: #800000;">'</span><span style="color: #000000;"><br />
<br />
</span><span style="color: #008000;">#</span><span style="color: #008000;">&nbsp;Where&nbsp;your&nbsp;own&nbsp;wiki&nbsp;pages&nbsp;are&nbsp;(make&nbsp;regular&nbsp;backups&nbsp;of&nbsp;this&nbsp;directory):</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">data_dir&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;os.path.join(instance_dir,&nbsp;</span><span style="color: #800000;">'</span><span style="color: #800000;">data-1</span><span style="color: #800000;">'</span><span style="color: #000000;">,&nbsp;</span><span style="color: #800000;">''</span><span style="color: #000000;">)&nbsp;</span><span style="color: #008000;">#</span><span style="color: #008000;">&nbsp;path&nbsp;with&nbsp;trailing&nbsp;/</span><span style="color: #008000;"><br />
</span><span style="color: #000000;"><br />
<br />
navi_bar&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;[<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">#</span><span style="color: #008000;">&nbsp;If&nbsp;you&nbsp;want&nbsp;to&nbsp;show&nbsp;your&nbsp;page_front_page&nbsp;here:</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">#</span><span style="color: #008000;">u'%(page_front_page)s',</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;u</span><span style="color: #800000;">'</span><span style="color: #800000;">标题</span><span style="color: #800000;">'</span><span style="color: #000000;">,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;u</span><span style="color: #800000;">'</span><span style="color: #800000;">FindPage</span><span style="color: #800000;">'</span><span style="color: #000000;">,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;u</span><span style="color: #800000;">'</span><span style="color: #800000;">HelpContents</span><span style="color: #800000;">'</span><span style="color: #000000;">,<br />
&nbsp;&nbsp;&nbsp;&nbsp;]<br />
<br />
language_default&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000;">'</span><span style="color: #800000;">zh</span><span style="color: #800000;">'</span></div>
<br />
在修改linux 时不起作用 ：<br />
修改/root/tools/moin-1.9.0/MoinMoin/script/server/standalone.py 全局先<br />
<br />
<br />
运行：<br />
<strong>$&gt;moin&nbsp; </strong>server standalone --config-dir=/root/wiki/mywiki/config/ --hostname=192.168.102.207 --port=18081<br />
命令是可调参数：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008000;">#</span><span style="color: #008000;">/root/tools/moin-1.9.0/MoinMoin/script/server/standalone.py</span><span style="color: #008000;"><br />
</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;PluginScript(MoinScript):<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">def</span><span style="color: #000000;">&nbsp;</span><span style="color: #800080;">__init__</span><span style="color: #000000;">(self,&nbsp;argv,&nbsp;def_values):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MoinScript.</span><span style="color: #800080;">__init__</span><span style="color: #000000;">(self,&nbsp;argv,&nbsp;def_values)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.parser.add_option(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">--docs</span><span style="color: #800000;">"</span><span style="color: #000000;">,&nbsp;dest</span><span style="color: #000000;">=</span><span style="color: #800000;">"</span><span style="color: #800000;">docs</span><span style="color: #800000;">"</span><span style="color: #000000;">,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;help</span><span style="color: #000000;">=</span><span style="color: #800000;">"</span><span style="color: #800000;">Set&nbsp;the&nbsp;documents&nbsp;directory.&nbsp;Default:&nbsp;use&nbsp;builtin&nbsp;MoinMoin/web/static/htdocs</span><span style="color: #800000;">"</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.parser.add_option(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">--user</span><span style="color: #800000;">"</span><span style="color: #000000;">,&nbsp;dest</span><span style="color: #000000;">=</span><span style="color: #800000;">"</span><span style="color: #800000;">user</span><span style="color: #800000;">"</span><span style="color: #000000;">,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;help</span><span style="color: #000000;">=</span><span style="color: #800000;">"</span><span style="color: #800000;">Set&nbsp;the&nbsp;user&nbsp;to&nbsp;change&nbsp;to.&nbsp;UNIX&nbsp;only.&nbsp;Default:&nbsp;Don't&nbsp;change</span><span style="color: #800000;">"</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.parser.add_option(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">--group</span><span style="color: #800000;">"</span><span style="color: #000000;">,&nbsp;dest</span><span style="color: #000000;">=</span><span style="color: #800000;">"</span><span style="color: #800000;">group</span><span style="color: #800000;">"</span><span style="color: #000000;">,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;help</span><span style="color: #000000;">=</span><span style="color: #800000;">"</span><span style="color: #800000;">Set&nbsp;the&nbsp;group&nbsp;to&nbsp;change&nbsp;to.&nbsp;UNIX&nbsp;only.&nbsp;Default:&nbsp;Don't&nbsp;change</span><span style="color: #800000;">"</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.parser.add_option(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">--port</span><span style="color: #800000;">"</span><span style="color: #000000;">,&nbsp;dest</span><span style="color: #000000;">=</span><span style="color: #800000;">"</span><span style="color: #800000;">port</span><span style="color: #800000;">"</span><span style="color: #000000;">,&nbsp;type</span><span style="color: #000000;">=</span><span style="color: #800000;">"</span><span style="color: #800000;">int</span><span style="color: #800000;">"</span><span style="color: #000000;">,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;help</span><span style="color: #000000;">=</span><span style="color: #800000;">"</span><span style="color: #800000;">Set&nbsp;the&nbsp;port&nbsp;to&nbsp;listen&nbsp;on.&nbsp;Default:&nbsp;8080</span><span style="color: #800000;">"</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.parser.add_option(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">--hostname</span><span style="color: #800000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">--interface</span><span style="color: #800000;">"</span><span style="color: #000000;">,&nbsp;dest</span><span style="color: #000000;">=</span><span style="color: #800000;">"</span><span style="color: #800000;">hostname</span><span style="color: #800000;">"</span><span style="color: #000000;">,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;help</span><span style="color: #000000;">=</span><span style="color: #800000;">"</span><span style="color: #800000;">Set&nbsp;the&nbsp;ip/hostname&nbsp;to&nbsp;listen&nbsp;on.&nbsp;Use&nbsp;\</span><span style="color: #800000;">"</span><span style="color: #000000;">\</span><span style="color: #800000;">"</span><span style="color: #800000;">&nbsp;for&nbsp;all&nbsp;interfaces.&nbsp;Default:&nbsp;localhost</span><span style="color: #800000;">"</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.parser.add_option(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">--start</span><span style="color: #800000;">"</span><span style="color: #000000;">,&nbsp;dest</span><span style="color: #000000;">=</span><span style="color: #800000;">"</span><span style="color: #800000;">start</span><span style="color: #800000;">"</span><span style="color: #000000;">,&nbsp;action</span><span style="color: #000000;">=</span><span style="color: #800000;">"</span><span style="color: #800000;">store_true</span><span style="color: #800000;">"</span><span style="color: #000000;">,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;help</span><span style="color: #000000;">=</span><span style="color: #800000;">"</span><span style="color: #800000;">Start&nbsp;server&nbsp;in&nbsp;background.</span><span style="color: #800000;">"</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.parser.add_option(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">--stop</span><span style="color: #800000;">"</span><span style="color: #000000;">,&nbsp;dest</span><span style="color: #000000;">=</span><span style="color: #800000;">"</span><span style="color: #800000;">stop</span><span style="color: #800000;">"</span><span style="color: #000000;">,&nbsp;action</span><span style="color: #000000;">=</span><span style="color: #800000;">"</span><span style="color: #800000;">store_true</span><span style="color: #800000;">"</span><span style="color: #000000;">,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;help</span><span style="color: #000000;">=</span><span style="color: #800000;">"</span><span style="color: #800000;">Stop&nbsp;server&nbsp;in&nbsp;background.</span><span style="color: #800000;">"</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.parser.add_option(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">--pidfile</span><span style="color: #800000;">"</span><span style="color: #000000;">,&nbsp;dest</span><span style="color: #000000;">=</span><span style="color: #800000;">"</span><span style="color: #800000;">pidfile</span><span style="color: #800000;">"</span><span style="color: #000000;">,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;help</span><span style="color: #000000;">=</span><span style="color: #800000;">"</span><span style="color: #800000;">Set&nbsp;file&nbsp;to&nbsp;store&nbsp;pid&nbsp;of&nbsp;moin&nbsp;daemon&nbsp;in.&nbsp;Default:&nbsp;moin.pid</span><span style="color: #800000;">"</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.parser.add_option(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">--debug</span><span style="color: #800000;">"</span><span style="color: #000000;">,&nbsp;dest</span><span style="color: #000000;">=</span><span style="color: #800000;">"</span><span style="color: #800000;">debug</span><span style="color: #800000;">"</span><span style="color: #000000;">,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;help</span><span style="color: #000000;">=</span><span style="color: #800000;">"</span><span style="color: #800000;">Debug&nbsp;mode&nbsp;of&nbsp;server.&nbsp;off:&nbsp;no&nbsp;debugging&nbsp;(default),&nbsp;web:&nbsp;for&nbsp;browser&nbsp;based&nbsp;debugging,&nbsp;external:&nbsp;for&nbsp;using&nbsp;an&nbsp;external&nbsp;debugger.</span><span style="color: #800000;">"</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)<br />
</span></div>
<br />
<br />
#成功运行 后<br />
2009-12-20 23:31:31,796 WARNING MoinMoin.log:139 using logging configuration read from built-in fallback in MoinMoin.log module!<br />
<br />
2009-12-20 23:31:32,515 INFO werkzeug:106&nbsp; * Running on http://192.168.1.100:8080/<br />
<br />
<br />
一些简单的语法介绍『其中 HelpOnDrawings 的功能 有&#8220;惊艳&#8221;的效果！！呵呵，自己搭建个自己的wiki 出来 看吧』<br />
<ul>
    <li><a href="http://master19.moinmo.in/HelpContents">HelpContents</a></li>
    <li><a href="http://master19.moinmo.in/HelpForBeginners">HelpForBeginners</a></li>
    <li><a href="http://master19.moinmo.in/HelpForUsers">HelpForUsers</a></li>
    <li><a href="http://master19.moinmo.in/HelpIndex">HelpIndex</a></li>
    <li><a href="http://master19.moinmo.in/HelpOnAccessControlLists">HelpOnAccessControlLists</a></li>
    <li><a href="http://master19.moinmo.in/HelpOnActions">HelpOnActions</a></li>
    <li><a href="http://master19.moinmo.in/HelpOnActions/AttachFile">HelpOnActions/AttachFile</a></li>
    <li><a href="http://master19.moinmo.in/HelpOnAdministration">HelpOnAdministration</a></li>
    <li><a href="http://master19.moinmo.in/HelpOnAdmonitions">HelpOnAdmonitions</a></li>
    <li><a href="http://master19.moinmo.in/HelpOnAuthentication">HelpOnAuthentication</a></li>
    <li><a href="http://master19.moinmo.in/HelpOnAuthentication/ExternalCookie">HelpOnAuthentication/ExternalCookie</a></li>
    <li><a href="http://master19.moinmo.in/HelpOnAutoAdmin">HelpOnAutoAdmin</a></li>
    <li><a href="http://master19.moinmo.in/HelpOnCategories">HelpOnCategories</a></li>
    <li><a href="http://master19.moinmo.in/HelpOnComments">HelpOnComments</a></li>
    <li><a href="http://master19.moinmo.in/HelpOnConfiguration">HelpOnConfiguration</a></li>
    <li><a href="http://master19.moinmo.in/HelpOnConfiguration/EmailSupport">HelpOnConfiguration/EmailSupport</a></li>
    <li><a href="http://master19.moinmo.in/HelpOnConfiguration/Example/AideDeParam%C3%A9trage/WikiEnLangueFran%C3%A7aise">HelpOnConfiguration/Example/AideDeParam&#233;trage/WikiEnLangueFran&#231;aise</a></li>
    <li><a href="http://master19.moinmo.in/HelpOnConfiguration/FileAttachments">HelpOnConfiguration/FileAttachments</a></li>
    <li><a href="http://master19.moinmo.in/HelpOnConfiguration/SecurityPolicy">HelpOnConfiguration/SecurityPolicy</a></li>
    <li><a href="http://master19.moinmo.in/HelpOnConfiguration/SupplementationPage">HelpOnConfiguration/SupplementationPage</a></li>
    <li><a href="http://master19.moinmo.in/HelpOnConfiguration/SurgeProtection">HelpOnConfiguration/SurgeProtection</a></li>
    <li><a href="http://master19.moinmo.in/HelpOnConfiguration/UserPreferences">HelpOnConfiguration/UserPreferences</a></li>
    <li><a href="http://master19.moinmo.in/HelpOnCreoleSyntax">HelpOnCreoleSyntax</a></li>
    <li><a href="http://master19.moinmo.in/HelpOnDictionaries">HelpOnDictionaries</a></li>
    <li><a href="http://master19.moinmo.in/HelpOnDrawings">HelpOnDrawings</a></li>
    <li><a href="http://master19.moinmo.in/HelpOnEditLocks">HelpOnEditLocks</a></li>
    <li><a href="http://master19.moinmo.in/HelpOnEditing">HelpOnEditing</a></li>
    <li><a href="http://master19.moinmo.in/HelpOnEditing/SubPages">HelpOnEditing/SubPages</a></li>
    <li><a href="http://master19.moinmo.in/HelpOnFormatting">HelpOnFormatting</a></li>
    <li><a href="http://master19.moinmo.in/HelpOnGraphicalEditor">HelpOnGraphicalEditor</a></li>
    <li><a href="http://master19.moinmo.in/HelpOnGroups">HelpOnGroups</a></li>
    <li><a href="http://master19.moinmo.in/HelpOnHeadlines">HelpOnHeadlines</a></li>
    <li><a href="http://master19.moinmo.in/HelpOnImages">HelpOnImages</a></li>
    <li><a href="http://master19.moinmo.in/HelpOnLanguages">HelpOnLanguages</a></li>
    <li><a href="http://master19.moinmo.in/HelpOnLinking">HelpOnLinking</a></li>
    <li><a href="http://master19.moinmo.in/HelpOnLinking/NotesLinks">HelpOnLinking/NotesLinks</a></li>
    <li><a href="http://master19.moinmo.in/HelpOnLists">HelpOnLists</a></li>
    <li><a href="http://master19.moinmo.in/HelpOnLogin">HelpOnLogin</a></li>
    <li><a href="http://master19.moinmo.in/HelpOnMacros">HelpOnMacros</a></li>
    <li><a href="http://master19.moinmo.in/HelpOnMacros/EmbedObject">HelpOnMacros/EmbedObject</a></li>
    <li><a href="http://master19.moinmo.in/HelpOnMacros/Include">HelpOnMacros/Include</a></li>
    <li><a href="http://master19.moinmo.in/HelpOnMacros/MailTo">HelpOnMacros/MailTo</a></li>
    <li><a href="http://master19.moinmo.in/HelpOnMacros/MonthCalendar">HelpOnMacros/MonthCalendar</a></li>
    <li><a href="http://master19.moinmo.in/HelpOnMoinCommand">HelpOnMoinCommand</a></li>
    <li><a href="http://master19.moinmo.in/HelpOnMoinCommand/ExportDump">HelpOnMoinCommand/ExportDump</a></li>
    <li><a href="http://master19.moinmo.in/HelpOnMoinWikiSyntax">HelpOnMoinWikiSyntax</a></li>
    <li><a href="http://master19.moinmo.in/HelpOnNavigation">HelpOnNavigation</a></li>
    <li><a href="http://master19.moinmo.in/HelpOnNotification">HelpOnNotification</a></li>
    <li><a href="http://master19.moinmo.in/HelpOnOpenIDProvider">HelpOnOpenIDProvider</a></li>
    <li><a href="http://master19.moinmo.in/HelpOnPackageInstaller">HelpOnPackageInstaller</a></li>
    <li><a href="http://master19.moinmo.in/HelpOnPageCreation">HelpOnPageCreation</a></li>
    <li><a href="http://master19.moinmo.in/HelpOnPageDeletion">HelpOnPageDeletion</a></li>
    <li><a href="http://master19.moinmo.in/HelpOnParsers">HelpOnParsers</a></li>
    <li><a href="http://master19.moinmo.in/HelpOnParsers/ReStructuredText">HelpOnParsers/ReStructuredText</a></li>
    <li><a href="http://master19.moinmo.in/HelpOnParsers/ReStructuredText/RstPrimer">HelpOnParsers/ReStructuredText/RstPrimer</a></li>
    <li><a href="http://master19.moinmo.in/HelpOnProcessingInstructions">HelpOnProcessingInstructions</a></li>
    <li><a href="http://master19.moinmo.in/HelpOnRules">HelpOnRules</a></li>
    <li><a href="http://master19.moinmo.in/HelpOnSearching">HelpOnSearching</a></li>
    <li><a href="http://master19.moinmo.in/HelpOnSessions">HelpOnSessions</a></li>
    <li><a href="http://master19.moinmo.in/HelpOnSlideShows">HelpOnSlideShows</a></li>
    <li><a href="http://master19.moinmo.in/HelpOnSlideShows/000%20Introduction">HelpOnSlideShows/000 Introduction</a></li>
    <li><a href="http://master19.moinmo.in/HelpOnSlideShows/100%20Creating%20the%20slides">HelpOnSlideShows/100 Creating the slides</a></li>
    <li><a href="http://master19.moinmo.in/HelpOnSlideShows/900%20Last%20but%20not%20least%3A%20Running%20your%20presentation">HelpOnSlideShows/900 Last but not least: Running your presentation</a></li>
    <li><a href="http://master19.moinmo.in/HelpOnSmileys">HelpOnSmileys</a></li>
    <li><a href="http://master19.moinmo.in/HelpOnSpam">HelpOnSpam</a></li>
    <li><a href="http://master19.moinmo.in/HelpOnSpellCheck">HelpOnSpellCheck</a></li>
    <li><a href="http://master19.moinmo.in/HelpOnSubscribing">HelpOnSubscribing</a></li>
    <li><a href="http://master19.moinmo.in/HelpOnSuperUser">HelpOnSuperUser</a></li>
    <li><a href="http://master19.moinmo.in/HelpOnSynchronisation">HelpOnSynchronisation</a></li>
    <li><a href="http://master19.moinmo.in/HelpOnTables">HelpOnTables</a></li>
    <li><a href="http://master19.moinmo.in/HelpOnTemplates">HelpOnTemplates</a></li>
    <li><a href="http://master19.moinmo.in/HelpOnThemes">HelpOnThemes</a></li>
    <li><a href="http://master19.moinmo.in/HelpOnUpdating">HelpOnUpdating</a></li>
    <li><a href="http://master19.moinmo.in/HelpOnUpdatingPython">HelpOnUpdatingPython</a></li>
    <li><a href="http://master19.moinmo.in/HelpOnUserHandling">HelpOnUserHandling</a></li>
    <li><a href="http://master19.moinmo.in/HelpOnUserPreferences">HelpOnUserPreferences</a></li>
    <li><a href="http://master19.moinmo.in/HelpOnVariables">HelpOnVariables</a></li>
    <li><a href="http://master19.moinmo.in/HelpOnXapian">HelpOnXapian</a></li>
    <li><a href="http://master19.moinmo.in/HelpOnXmlPages">HelpOnXmlPages</a></li>
    <li><a href="http://master19.moinmo.in/HelpTemplate">HelpTemplate</a></li>
</ul>
<br />
<br />
<br />
<br />
<br />
<br />
<img src ="http://www.blogjava.net/Skynet/aggbug/306749.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Skynet/" target="_blank">刘凯毅</a> 2009-12-20 23:34 <a href="http://www.blogjava.net/Skynet/archive/2009/12/20/306749.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>和 业务讨论的 推荐</title><link>http://www.blogjava.net/Skynet/archive/2009/12/11/305591.html</link><dc:creator>刘凯毅</dc:creator><author>刘凯毅</author><pubDate>Fri, 11 Dec 2009 08:20:00 GMT</pubDate><guid>http://www.blogjava.net/Skynet/archive/2009/12/11/305591.html</guid><wfw:comment>http://www.blogjava.net/Skynet/comments/305591.html</wfw:comment><comments>http://www.blogjava.net/Skynet/archive/2009/12/11/305591.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/Skynet/comments/commentRss/305591.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Skynet/services/trackbacks/305591.html</trackback:ping><description><![CDATA[<br />
<br />
定义： <br />
灰羊群&nbsp;&nbsp; （无主见的用户群体）<br />
黑羊&nbsp;&nbsp; （ 对自己需要什么有明确的认识，我们一般称为专家用户。&nbsp; ）<br />
<br />
<br />
1. 区分 灰（无主见） 黑 羊群<br />
<br />
2.<br />
user session 关联 #当 关联关系维护使用 用户的会话ID（用户不同心情，起始在数据中就应该是不同分类的）<br />
user 推荐&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # 而推荐出产品 还是 跟 用户唯一编号有关<br />
#在推荐中需要描述&nbsp; 用户的多角度 问题<br />
<br />
3. <br />
蛮力推荐（ 全数据 ；描述初期清洗后的数据 ） 适合 产品关联&nbsp; <br />
清洗后期的数据（包含用户多维度描述） 适合 &nbsp; 用户关联 <br />
<br />
<br />
4.<br />
专家跟随推荐<br />
描述：<br />
&nbsp; 用户分类 找到黑绵羊 &nbsp;<br />
&nbsp; 找到 一群灰绵羊 和 一只黑绵羊的关联关系<br />
&nbsp; 让 一群灰绵羊 可以看 黑绵羊 动作<br />
<br />
<br />
<br />
<img src ="http://www.blogjava.net/Skynet/aggbug/305591.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Skynet/" target="_blank">刘凯毅</a> 2009-12-11 16:20 <a href="http://www.blogjava.net/Skynet/archive/2009/12/11/305591.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>同事推荐的 锻炼方法</title><link>http://www.blogjava.net/Skynet/archive/2009/12/11/305535.html</link><dc:creator>刘凯毅</dc:creator><author>刘凯毅</author><pubDate>Fri, 11 Dec 2009 03:52:00 GMT</pubDate><guid>http://www.blogjava.net/Skynet/archive/2009/12/11/305535.html</guid><wfw:comment>http://www.blogjava.net/Skynet/comments/305535.html</wfw:comment><comments>http://www.blogjava.net/Skynet/archive/2009/12/11/305535.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Skynet/comments/commentRss/305535.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Skynet/services/trackbacks/305535.html</trackback:ping><description><![CDATA[<br />
<br />
<br />
1，负重深蹲，仰卧起坐，慢跑，主要练习心肺功能（腿部锻炼很重要，如果深蹲完了没体力，慢跑可以改成慢走放松）<br />
<br />
2，卧推，仰卧飞鸟，站立飞鸟，仰卧起坐，慢跑，主要练习胸部和肩部（飞鸟就是侧举，仰卧的时候用的是胸的力量，站立时用的是肩）<br />
<br />
3，引体向上，划船，曲臂，主要练习背部和胳膊，最后加上固定的项目：仰卧起坐和慢跑放松<br />
<br />
<br />
1的消耗最大，要自己状态最好的时候去<br />
2主要是练习和&#8220;推，举&#8221;相关的肌群<br />
3是&#8220;拉，收&#8221;相关的肌群<br />
<br />
而且有个原则，就是先练大项目，再练小项目。<br />
<br />
<br />
&nbsp;深蹲、卧推、引体向上，这3个是最基本的，别的其实都可有可无<br />
另外，适当慢跑也是必要的，是很好的放松和有氧运动，促进代谢。当然，如果有条件可以去户外跑，宁可跑马路，也别在健身房里跑，空气不理想<br />
<br />
做动作也是要循序渐进，每次从很轻的重量开始，逐步加大负荷<br />
<br />
<br />
<br />
<img src ="http://www.blogjava.net/Skynet/aggbug/305535.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Skynet/" target="_blank">刘凯毅</a> 2009-12-11 11:52 <a href="http://www.blogjava.net/Skynet/archive/2009/12/11/305535.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>跟我一起学 - 算法导论 - 线性时间排序</title><link>http://www.blogjava.net/Skynet/archive/2009/12/08/305156.html</link><dc:creator>刘凯毅</dc:creator><author>刘凯毅</author><pubDate>Tue, 08 Dec 2009 06:21:00 GMT</pubDate><guid>http://www.blogjava.net/Skynet/archive/2009/12/08/305156.html</guid><wfw:comment>http://www.blogjava.net/Skynet/comments/305156.html</wfw:comment><comments>http://www.blogjava.net/Skynet/archive/2009/12/08/305156.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/Skynet/comments/commentRss/305156.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Skynet/services/trackbacks/305156.html</trackback:ping><description><![CDATA[<strong>下面介绍的排序都为：非比较排序法</strong><br />
<br />
这里个人认为在某些特定的地方非比较排序的速度非常明显；<br />
比如 ： 对待排数据中有顺序分类，使用鸽巢总体分类，然后对不同类别的待排小数据集合采用 插入，快排等排序方式<br />
<br />
<br />
Counting sort ：计数排序<br />
描述：迭代待排序数组出元素x，确定小于此元素[z]个数，然后把x放到它在的最终输出数组[z]上。<br />
特性：与待排值有关；稳定的排序算法；待排序数据要求过于严格，无实际用处；<br />
算法的步骤如下：<br />
&nbsp;&nbsp; 1. 找出待排序的数组中最大和最小的元素<br />
&nbsp;&nbsp; 2. 统计数组中每个值为i的元素出现的次数，存入数组C的第i项<br />
&nbsp;&nbsp; 3. 对所有的计数累加（从C中的第一个元素开始，每一项和前一项相加）<br />
&nbsp;&nbsp; 4. 反向填充目标数组：将每个元素i放在新数组的第C(i)项，每放一个元素就将C(i)减去1<br />
<br />
<br />
Radix sort：基数排序<br />
描述：将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零. 然后, 从最低位开始, 依次进行一次排序.这样从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列.<br />
排序方式：LSD 由右向左排；MSD 由左向右排<br />
特性：非比较排序；待排数据需要统一格式；<br />
假设需排序数列的取值范围从1...k,我们于是建一个K+1元的数组 a[]，并赋初值为0，然后便开始排序工作：<br />
算法的步骤如下：<br />
&nbsp;&nbsp; 1. 按输入顺序读入数列，如果所读的元素为i(1&lt;=i&lt;=k),我们就将a[i]的值加一，这样直到读完所有的元素。<br />
&nbsp;&nbsp; 2. 读出元素并排序：我们遍历整个数组，如果a[i]=j(j&gt;=0),我们就输出j次i(表示元素i在原先数列中出现了j次),这样输出的序列就是已排序的。<br />
&nbsp;&nbsp; 3. 由于一般排序算法涉及到元素之间的比较，如果化成比较树可以知道，这样的排序算法复杂度的下限是O(N*lnN),而计数排序没有比较元素，所以所需排序时间就少了，我们可以看到计数排序的复杂度为O(n*k)，其中k（k的定义同上）为合并排列所需的时间，是个常数。<br />
&nbsp;&nbsp; 4. 此算法适合所需排列的元素取值范围不大的情况下，否则会造成空间的消耗，比如，一共100个元素，其取值范围从1-100000，显然这个时候用基数排序是不合适的。<br />
<br />
<br />
<br />
Bucket sort：桶排序<br />
描述：工作的原理是将阵列分到有限数量的桶子里。每个桶子再个别排序（有可能再使用别的排序算法或是以递回方式继续使用桶排序进行排序）。<br />
桶排序以下列程序进行：<br />
&nbsp;&nbsp; 1. 设置一个定量的阵列当作空桶子。<br />
&nbsp;&nbsp; 2. 寻访序列，并且把项目一个一个放到对应的桶子去。<br />
&nbsp;&nbsp; 3. 对每个不是空的桶子进行排序。<br />
&nbsp;&nbsp; 4. 从不是空的桶子里把项目再放回原来的序列中。<br />
<br />
<br />
<br />
Pigeonhole sort：鸽巢排序<br />
描述：是一种时间复杂度为O(n)且在不可避免遍历每一个元素并且排序的情况下效率最好的一种排序算法. 但它只有在差值(或者可被映射在差值)很小的范围内的数值排序的情况下实用.<br />
算法的步骤如下：与桶排同<br />
<br />
<br />
<br />
<img src ="http://www.blogjava.net/Skynet/aggbug/305156.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Skynet/" target="_blank">刘凯毅</a> 2009-12-08 14:21 <a href="http://www.blogjava.net/Skynet/archive/2009/12/08/305156.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux date 使用</title><link>http://www.blogjava.net/Skynet/archive/2009/12/07/305016.html</link><dc:creator>刘凯毅</dc:creator><author>刘凯毅</author><pubDate>Mon, 07 Dec 2009 08:14:00 GMT</pubDate><guid>http://www.blogjava.net/Skynet/archive/2009/12/07/305016.html</guid><wfw:comment>http://www.blogjava.net/Skynet/comments/305016.html</wfw:comment><comments>http://www.blogjava.net/Skynet/archive/2009/12/07/305016.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Skynet/comments/commentRss/305016.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Skynet/services/trackbacks/305016.html</trackback:ping><description><![CDATA[<br />
date demo:<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">实例</span><span style="color: #000000;">:</span><span style="color: #000000;"><br />
$</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">date<br />
Mon&nbsp;Dec&nbsp;&nbsp;</span><span style="color: #800000;">7</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000;">15</span><span style="color: #000000;">:</span><span style="color: #800000;">43</span><span style="color: #000000;">:</span><span style="color: #800000;">39</span><span style="color: #000000;">&nbsp;CST&nbsp;</span><span style="color: #800000;">2009</span><span style="color: #000000;"><br />
<br />
</span><span style="color: #008000;">#</span><span style="color: #008000;">格式化输出</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">$</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;date&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000; font-weight: bold;">%Y-%m-%d</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000;"><br />
</span><span style="color: #800000;">2009</span><span style="color: #000000;">-</span><span style="color: #800000;">12</span><span style="color: #000000;">-</span><span style="color: #800000;">07</span><span style="color: #000000;"><br />
<br />
</span><span style="color: #008000;">#</span><span style="color: #008000;">时间游走&nbsp;当前时间&nbsp;2009-12-07<br />
#&nbsp;year&nbsp;,&nbsp;month&nbsp;,&nbsp;day&nbsp;,hour&nbsp;,&nbsp;minute,second&nbsp;&nbsp;-&nbsp;ago<br />
#昨天输出</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">$</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;date&nbsp;&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">d&nbsp;</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000; font-weight: bold;">1&nbsp;day&nbsp;ago</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000; font-weight: bold;">%Y-%m-%d</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000;"><br />
</span><span style="color: #800000;">2009</span><span style="color: #000000;">-</span><span style="color: #800000;">12</span><span style="color: #000000;">-</span><span style="color: #800000;">06</span><span style="color: #000000;"><br />
<br />
</span><span style="color: #008000;">#</span><span style="color: #008000;">2秒后输出</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">$</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;date&nbsp;&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">d&nbsp;</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000; font-weight: bold;">2&nbsp;second</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000; font-weight: bold;">%Y-%m-%d&nbsp;%H:%M.%S</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000;"><br />
</span><span style="color: #800000;">2009</span><span style="color: #000000;">-</span><span style="color: #800000;">12</span><span style="color: #000000;">-</span><span style="color: #800000;">07</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000;">15</span><span style="color: #000000;">:</span><span style="color: #800000;">50.04</span><span style="color: #000000;"><br />
<br />
</span><span style="color: #008000;">#</span><span style="color: #008000;">传说中的&nbsp;1234567890&nbsp;秒</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">$</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">date&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">d&nbsp;</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000; font-weight: bold;">1970-01-01&nbsp;&nbsp;1234567890&nbsp;seconds</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000; font-weight: bold;">%Y-%m-%d&nbsp;%H:%m:%S</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000;"><br />
</span><span style="color: #800000;">2009</span><span style="color: #000000;">-</span><span style="color: #800000;">02</span><span style="color: #000000;">-</span><span style="color: #800000;">13</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000;">23</span><span style="color: #000000;">:</span><span style="color: #800000;">02</span><span style="color: #000000;">:</span><span style="color: #800000;">30</span><span style="color: #000000;"><br />
<br />
</span><span style="color: #008000;">#</span><span style="color: #008000;">其他格式的转换</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">date&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">d&nbsp;</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000; font-weight: bold;">$(echo&nbsp;</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #800000;">03</span><span style="color: #000000;">/</span><span style="color: #000000;">Nov</span><span style="color: #000000;">/</span><span style="color: #800000;">2009</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000;">11</span><span style="color: #000000;">:</span><span style="color: #800000;">04</span><span style="color: #000000;">:</span><span style="color: #800000;">28</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000; font-weight: bold;">&nbsp;|perl&nbsp;-ne&nbsp;'print&nbsp;</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000;">$</span><span style="color: #800000;">2</span><span style="color: #000000;">&nbsp;$</span><span style="color: #800000;">1</span><span style="color: #000000;">&nbsp;$</span><span style="color: #800000;">3</span><span style="color: #000000;">&nbsp;$</span><span style="color: #800000;">4</span><span style="color: #000000;">\</span><span style="color: #000000;">n</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000; font-weight: bold;">&nbsp;if&nbsp;/(.*?)</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000;">/</span><span style="color: #000000;">(</span><span style="color: #000000;">.*?</span><span style="color: #000000;">)</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000; font-weight: bold;">/(.*?)&nbsp;(.*)/;')&nbsp;</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">+</span><span style="color: #800080;">%Y</span><span style="color: #000000;">-</span><span style="color: #800080;">%m</span><span style="color: #000000;">-</span><span style="color: #800080;">%d</span><span style="color: #000000;"><br />
</span><span style="color: #800000;">2009</span><span style="color: #000000;">-</span><span style="color: #800000;">11</span><span style="color: #000000;">-</span><span style="color: #800000;">03</span><span style="color: #000000;"><br />
<br />
</span><span style="color: #008000;">#</span><span style="color: #008000;">普通&nbsp;转格式</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">$</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;date&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">d&nbsp;</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000; font-weight: bold;">2009-12-12</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000; font-weight: bold;">%Y/%m/%d&nbsp;%H:%M.%S</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000;"><br />
</span><span style="color: #800000;">2009</span><span style="color: #000000;">/</span><span style="color: #800000;">12</span><span style="color: #000000;">/</span><span style="color: #800000;">12</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000;">00</span><span style="color: #000000;">:</span><span style="color: #800000;">00.00</span><span style="color: #000000;"><br />
<br />
</span><span style="color: #008000;">#</span><span style="color: #008000;">apache&nbsp;格式转换</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">$</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">date&nbsp;&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">d&nbsp;</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000; font-weight: bold;">Dec&nbsp;5,&nbsp;2009&nbsp;12:00:37&nbsp;AM</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000; font-weight: bold;">%Y-%m-%d&nbsp;%H:%M.%S</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000;"><br />
</span><span style="color: #800000;">2009</span><span style="color: #000000;">-</span><span style="color: #800000;">12</span><span style="color: #000000;">-</span><span style="color: #800000;">05</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000;">00</span><span style="color: #000000;">:</span><span style="color: #800000;">00.37</span><span style="color: #000000;"><br />
<br />
</span><span style="color: #008000;">#</span><span style="color: #008000;">格式转换&nbsp;后时间&nbsp;游走</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">$</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">date&nbsp;&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">d&nbsp;</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000; font-weight: bold;">Dec&nbsp;5,&nbsp;2009&nbsp;12:00:37&nbsp;AM&nbsp;2&nbsp;year&nbsp;ago</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000; font-weight: bold;">%Y-%m-%d&nbsp;%H:%M.%S</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000;"><br />
</span><span style="color: #800000;">2007</span><span style="color: #000000;">-</span><span style="color: #800000;">12</span><span style="color: #000000;">-</span><span style="color: #800000;">05</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000;">00</span><span style="color: #000000;">:</span><span style="color: #800000;">00.37</span><span style="color: #000000;"><br />
<br />
<br />
</span><span style="color: #008000;">#</span><span style="color: #008000;">时间差<br />
#一小时&nbsp;3600<br />
#一天&nbsp;86400&nbsp;秒</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">$</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">st</span><span style="color: #000000;">=</span><span style="color: #000000;">$(date&nbsp;&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">d&nbsp;</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000; font-weight: bold;">Dec&nbsp;5,&nbsp;2009&nbsp;12:00:37&nbsp;AM&nbsp;1&nbsp;day&nbsp;ago&nbsp;1&nbsp;hour&nbsp;ago&nbsp;</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000; font-weight: bold;">%s</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000;">)<br />
$</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">et</span><span style="color: #000000;">=</span><span style="color: #000000;">$(date&nbsp;&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">d&nbsp;</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000; font-weight: bold;">Dec&nbsp;5,&nbsp;2009&nbsp;12:00:37&nbsp;AM</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000; font-weight: bold;">%s</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000;">)<br />
$</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">echo&nbsp;</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000; font-weight: bold;">时间差$[($et-$st)/86400]天，$[($et-$st)/3600%24]小时</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000;"><br />
时间差1天，1小时</span></div>
<br />
<br />
<br />
<br />
<br />
date --help<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">Usage</span><span style="color: #000000;">:</span><span style="color: #000000;">&nbsp;date&nbsp;[OPTION]</span><span style="color: #000000;"><img src="http://www.blogjava.net/Images/dot.gif" alt="" /></span><span style="color: #000000;">&nbsp;[</span><span style="color: #000000;">+</span><span style="color: #0000ff;">FORMAT</span><span style="color: #000000;">]<br />
&nbsp;&nbsp;or</span><span style="color: #000000;">:</span><span style="color: #000000;">&nbsp;&nbsp;date&nbsp;[</span><span style="color: #000000;">-</span><span style="color: #000000;">u</span><span style="color: #000000;">|--</span><span style="color: #000000;">utc</span><span style="color: #000000;">|--</span><span style="color: #000000;">universal]&nbsp;[MMDDhhmm[[CC]YY][</span><span style="color: #000000;">.</span><span style="color: #000000;">ss]]<br />
Display&nbsp;the&nbsp;current&nbsp;</span><span style="color: #0000ff;">time</span><span style="color: #000000;">&nbsp;in&nbsp;the&nbsp;given&nbsp;</span><span style="color: #0000ff;">FORMAT</span><span style="color: #000000;">,</span><span style="color: #000000;">&nbsp;or&nbsp;set&nbsp;the&nbsp;</span><span style="color: #0000ff;">system</span><span style="color: #000000;">&nbsp;date</span><span style="color: #000000;">.</span><span style="color: #000000;"><br />
<br />
&nbsp;&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">d</span><span style="color: #000000;">,</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">--</span><span style="color: #000000;">date</span><span style="color: #000000;">=</span><span style="color: #000000;">STRING&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;display&nbsp;</span><span style="color: #0000ff;">time</span><span style="color: #000000;">&nbsp;described&nbsp;by&nbsp;STRING</span><span style="color: #000000;">,</span><span style="color: #000000;">&nbsp;not&nbsp;`now</span><span style="color: #000000; font-weight: bold;">'</span><span style="color: #000000; font-weight: bold;"><br />
&nbsp;&nbsp;-f,&nbsp;--file=DATEFILE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;like&nbsp;--date&nbsp;once&nbsp;for&nbsp;each&nbsp;line&nbsp;of&nbsp;DATEFILE<br />
&nbsp;&nbsp;-r,&nbsp;--reference=FILE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;display&nbsp;the&nbsp;last&nbsp;modification&nbsp;time&nbsp;of&nbsp;FILE<br />
&nbsp;&nbsp;-R,&nbsp;--rfc-2822&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;output&nbsp;date&nbsp;and&nbsp;time&nbsp;in&nbsp;RFC&nbsp;2822&nbsp;format<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--rfc-3339=TIMESPEC&nbsp;&nbsp;&nbsp;output&nbsp;date&nbsp;and&nbsp;time&nbsp;in&nbsp;RFC&nbsp;3339&nbsp;format.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TIMESPEC=`date</span><span style="color: #000000; font-weight: bold;">'</span><span style="color: #000000;">,</span><span style="color: #000000;">&nbsp;`seconds</span><span style="color: #000000; font-weight: bold;">'</span><span style="color: #000000; font-weight: bold;">,&nbsp;or&nbsp;`ns</span><span style="color: #000000; font-weight: bold;">'</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;date&nbsp;and&nbsp;</span><span style="color: #0000ff;">time</span><span style="color: #000000;">&nbsp;to&nbsp;the&nbsp;indicated&nbsp;precision</span><span style="color: #000000;">.</span><span style="color: #000000;"><br />
&nbsp;&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">s</span><span style="color: #000000;">,</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">--</span><span style="color: #000000;">set</span><span style="color: #000000;">=</span><span style="color: #000000;">STRING&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set&nbsp;</span><span style="color: #0000ff;">time</span><span style="color: #000000;">&nbsp;described&nbsp;by&nbsp;STRING<br />
&nbsp;&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">u</span><span style="color: #000000;">,</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">--</span><span style="color: #000000;">utc</span><span style="color: #000000;">,</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">--</span><span style="color: #000000;">universal&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">print</span><span style="color: #000000;">&nbsp;or&nbsp;set&nbsp;Coordinated&nbsp;Universal&nbsp;</span><span style="color: #0000ff;">Time</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">--</span><span style="color: #000000;">help&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;display&nbsp;this&nbsp;help&nbsp;and&nbsp;</span><span style="color: #0000ff;">exit</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">--</span><span style="color: #000000;">version&nbsp;&nbsp;output&nbsp;version&nbsp;information&nbsp;and&nbsp;</span><span style="color: #0000ff;">exit</span><span style="color: #000000;"><br />
</span></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<img src ="http://www.blogjava.net/Skynet/aggbug/305016.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Skynet/" target="_blank">刘凯毅</a> 2009-12-07 16:14 <a href="http://www.blogjava.net/Skynet/archive/2009/12/07/305016.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>给自己的 图片处理工具 (py2exe)</title><link>http://www.blogjava.net/Skynet/archive/2009/12/07/305005.html</link><dc:creator>刘凯毅</dc:creator><author>刘凯毅</author><pubDate>Mon, 07 Dec 2009 07:12:00 GMT</pubDate><guid>http://www.blogjava.net/Skynet/archive/2009/12/07/305005.html</guid><wfw:comment>http://www.blogjava.net/Skynet/comments/305005.html</wfw:comment><comments>http://www.blogjava.net/Skynet/archive/2009/12/07/305005.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Skynet/comments/commentRss/305005.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Skynet/services/trackbacks/305005.html</trackback:ping><description><![CDATA[<br />
<br />
工具为&nbsp; dist/myImg.exe<br />
<br />
<br />
工具使用:<br />
在 dist 中<br />
myImg.exe Ratio&nbsp; c:/需要等比压缩图片/*.jpg&nbsp; d:/等比后路径&nbsp;&nbsp; 等比款width&nbsp; 等比高height <br />
myImg.exe Watermark c:/水印图片/x.png&nbsp; c:/需要加水印图片/*.jpg&nbsp; d:/添加水印后图片&nbsp;&nbsp; 加水印width处&nbsp; 加水印height处<br />
<br />
等比压缩实例:<br />
myImg.exe Ratio &nbsp;<br />
&nbsp;&nbsp; &nbsp;"C:"Documents and Settings"lky"My Documents"My Dropbox"tools"img"src"python"dist"test"img"*.jpg" <br />
&nbsp;&nbsp; &nbsp;"C:"Documents and Settings"lky"My Documents"MyDropbox"tools"img"src"python"dist"test"toimg2" <br />
&nbsp;&nbsp; &nbsp;600 400<br />
结果在&nbsp; ../dist"test"toimg&nbsp; 目录下 生成 等比图片 testratio_600_400.jpg<br />
<br />
<br />
水印添加实例:<br />
myImg.exe Watermark <br />
&nbsp;&nbsp; &nbsp;"C:"Documents and Settings"lky"My Documents"My Dropbox"tools"img"src"python"dist"test"img"logo.png"&nbsp; &nbsp;<br />
&nbsp;&nbsp; &nbsp;"C:"Documents and Settings"lky"My Documents"My Dropbox"tools"img"src"python"dist"test"toimg2"*.jpg" <br />
&nbsp;&nbsp; &nbsp;"C:"Documents and Settings"lky"My Documents"My Dropbox"tools"img"src"python"dist"test"toimg3" <br />
&nbsp;&nbsp; &nbsp;100 220<br />
结果在&nbsp; ../dist"test"toimg3&nbsp; 目录下 生成 等比图片 test_ratio_600_400_watermark_100_220.jpg<br />
<br />
<br />
<br />
安装 python PIL 包<br />
和安装 python py2exe <br />
<br />
工具脚本 py <br />
<br />
<br />
工具编译过程:<br />
python setup.py py2exe <br />
<br />
<br />
<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;sys<br />
<br />
</span><span style="color: #0000ff;">def</span><span style="color: #000000;">&nbsp;imgRatio(imgpath,tpath</span><span style="color: #000000;">=</span><span style="color: #800000;">'</span><span style="color: #800000;">.</span><span style="color: #800000;">'</span><span style="color: #000000;">,width</span><span style="color: #000000;">=</span><span style="color: #000000;">600</span><span style="color: #000000;">,height</span><span style="color: #000000;">=</span><span style="color: #000000;">400</span><span style="color: #000000;">):<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;Image,os<br />
&nbsp;&nbsp;&nbsp;&nbsp;im&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Image.open(&nbsp;imgpath&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;im.thumbnail(&nbsp;(width,height)&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;imgpath&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;os.path.split(imgpath)[</span><span style="color: #000000;">1</span><span style="color: #000000;">]<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">not</span><span style="color: #000000;">&nbsp;os.path.exists(tpath)&nbsp;:&nbsp;os.makedirs(tpath)<br />
&nbsp;&nbsp;&nbsp;&nbsp;im.save(&nbsp;tpath</span><span style="color: #000000;">+</span><span style="color: #800000;">'</span><span style="color: #800000;">/</span><span style="color: #800000;">'</span><span style="color: #000000;">+</span><span style="color: #000000;">imgpath.split(</span><span style="color: #800000;">'</span><span style="color: #800000;">.</span><span style="color: #800000;">'</span><span style="color: #000000;">)[0]</span><span style="color: #000000;">+</span><span style="color: #800000;">'</span><span style="color: #800000;">_ratio_</span><span style="color: #800000;">'</span><span style="color: #000000;">+</span><span style="color: #000000;">str(width)</span><span style="color: #000000;">+</span><span style="color: #800000;">'</span><span style="color: #800000;">_</span><span style="color: #800000;">'</span><span style="color: #000000;">+</span><span style="color: #000000;">str(height)</span><span style="color: #000000;">+</span><span style="color: #800000;">'</span><span style="color: #800000;">.jpg</span><span style="color: #800000;">'</span><span style="color: #000000;">&nbsp;)<br />
<br />
<br />
</span><span style="color: #0000ff;">def</span><span style="color: #000000;">&nbsp;imgWatermark(imgwate,imgpath,sw</span><span style="color: #000000;">=</span><span style="color: #000000;">100</span><span style="color: #000000;">,sh</span><span style="color: #000000;">=</span><span style="color: #000000;">50</span><span style="color: #000000;">,tpath</span><span style="color: #000000;">=</span><span style="color: #800000;">'</span><span style="color: #800000;">.</span><span style="color: #800000;">'</span><span style="color: #000000;">):<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;Image,os<br />
&nbsp;&nbsp;&nbsp;&nbsp;baseim&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Image.open(&nbsp;imgpath&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;floatim&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Image.open(&nbsp;imgwate&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;baseim.paste(&nbsp;floatim,&nbsp;(sw,sh&nbsp;)&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;imgpath&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;os.path.split(imgpath)[</span><span style="color: #000000;">1</span><span style="color: #000000;">]<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">not</span><span style="color: #000000;">&nbsp;os.path.exists(tpath)&nbsp;:&nbsp;os.makedirs(tpath)<br />
&nbsp;&nbsp;&nbsp;&nbsp;baseim.save(&nbsp;tpath</span><span style="color: #000000;">+</span><span style="color: #800000;">'</span><span style="color: #800000;">/</span><span style="color: #800000;">'</span><span style="color: #000000;">+</span><span style="color: #000000;">imgpath.split(</span><span style="color: #800000;">'</span><span style="color: #800000;">.</span><span style="color: #800000;">'</span><span style="color: #000000;">)[0]</span><span style="color: #000000;">+</span><span style="color: #800000;">'</span><span style="color: #800000;">_watermark_</span><span style="color: #800000;">'</span><span style="color: #000000;">+</span><span style="color: #000000;">str(sw)</span><span style="color: #000000;">+</span><span style="color: #800000;">'</span><span style="color: #800000;">_</span><span style="color: #800000;">'</span><span style="color: #000000;">+</span><span style="color: #000000;">str(sh)</span><span style="color: #000000;">+</span><span style="color: #800000;">'</span><span style="color: #800000;">.jpg</span><span style="color: #800000;">'</span><span style="color: #000000;">&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
<br />
args&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;sys.argv<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;glob,os<br />
<br />
</span><span style="color: #008000;">#</span><span style="color: #008000;">&nbsp;Ratio&nbsp;&nbsp;/path/*.jpg&nbsp;&nbsp;/tpath&nbsp;&nbsp;&nbsp;width&nbsp;&nbsp;height&nbsp;&nbsp;</span><span style="color: #008000;"><br />
</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;args[</span><span style="color: #000000;">1</span><span style="color: #000000;">]&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000;">'</span><span style="color: #800000;">Ratio</span><span style="color: #800000;">'</span><span style="color: #000000;">&nbsp;:<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;img&nbsp;</span><span style="color: #0000ff;">in</span><span style="color: #000000;">&nbsp;glob.glob(args[</span><span style="color: #000000;">2</span><span style="color: #000000;">])&nbsp;:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;imgRatio(os.path.abspath(img),args[</span><span style="color: #000000;">3</span><span style="color: #000000;">],int(args[</span><span style="color: #000000;">4</span><span style="color: #000000;">]),int(args[</span><span style="color: #000000;">5</span><span style="color: #000000;">]))<br />
</span><span style="color: #008000;">#</span><span style="color: #008000;">&nbsp;Watermark&nbsp;/path/x.png&nbsp;&nbsp;/path/*.jpg&nbsp;&nbsp;/tpath&nbsp;&nbsp;&nbsp;width&nbsp;&nbsp;height&nbsp;</span><span style="color: #008000;"><br />
</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;args[</span><span style="color: #000000;">1</span><span style="color: #000000;">]&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000;">'</span><span style="color: #800000;">Watermark</span><span style="color: #800000;">'</span><span style="color: #000000;">&nbsp;:<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;img&nbsp;</span><span style="color: #0000ff;">in</span><span style="color: #000000;">&nbsp;glob.glob(args[</span><span style="color: #000000;">3</span><span style="color: #000000;">])&nbsp;:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;imgWatermark(args[</span><span style="color: #000000;">2</span><span style="color: #000000;">],img,int(args[</span><span style="color: #000000;">5</span><span style="color: #000000;">]),int(args[</span><span style="color: #000000;">6</span><span style="color: #000000;">]),args[</span><span style="color: #000000;">4</span><span style="color: #000000;">])<br />
<br />
<br />
</span></div>
<br />
<br />
py2exe<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008000;">#</span><span style="color: #008000;">!/usr/bin/python</span><span style="color: #008000;"><br />
#</span><span style="color: #008000;">&nbsp;-*-&nbsp;coding:&nbsp;utf-8&nbsp;-*-</span><span style="color: #008000;"><br />
#</span><span style="color: #008000;">&nbsp;&nbsp;py2exe&nbsp;file</span><span style="color: #008000;"><br />
#</span><span style="color: #008000;">&nbsp;1.install&nbsp;py2exe&nbsp;application</span><span style="color: #008000;"><br />
#</span><span style="color: #008000;">&nbsp;2.python&nbsp;setup.py&nbsp;py2exe</span><span style="color: #008000;"><br />
</span><span style="color: #0000ff;">from</span><span style="color: #000000;">&nbsp;distutils.core&nbsp;</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;setup<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;py2exe<br />
setup(console</span><span style="color: #000000;">=</span><span style="color: #000000;">[</span><span style="color: #800000;">'</span><span style="color: #800000;">myImg.py</span><span style="color: #800000;">'</span><span style="color: #000000;">])<br />
</span></div>
<br />
<br />
<img src ="http://www.blogjava.net/Skynet/aggbug/305005.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Skynet/" target="_blank">刘凯毅</a> 2009-12-07 15:12 <a href="http://www.blogjava.net/Skynet/archive/2009/12/07/305005.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>跟我一起学 - 算法导论 - 快速排序</title><link>http://www.blogjava.net/Skynet/archive/2009/12/03/304668.html</link><dc:creator>刘凯毅</dc:creator><author>刘凯毅</author><pubDate>Thu, 03 Dec 2009 09:11:00 GMT</pubDate><guid>http://www.blogjava.net/Skynet/archive/2009/12/03/304668.html</guid><wfw:comment>http://www.blogjava.net/Skynet/comments/304668.html</wfw:comment><comments>http://www.blogjava.net/Skynet/archive/2009/12/03/304668.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Skynet/comments/commentRss/304668.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Skynet/services/trackbacks/304668.html</trackback:ping><description><![CDATA[<br />
# 快排 和 分治 很像 都是<strong>分而治之</strong> ，但他们却是 相反的 方式排序 ：<br />
分治 是想拆分完成后，合并以有序的小段进行 <strong>排序</strong> ，而快排是直接由原始的&#8220;拆分&#8221;来<strong>排序</strong> 。<br />
<br />
<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008000;">#</span><span style="color: #008000;">encoding=utf-8</span><span style="color: #008000;"><br />
#</span><span style="color: #008000;">从&nbsp;大&nbsp;到&nbsp;小</span><span style="color: #008000;"><br />
</span><span style="color: #0000ff;">def</span><span style="color: #000000;">&nbsp;partition(A,p,r):<br />
&nbsp;&nbsp;&nbsp;&nbsp;tmp</span><span style="color: #000000;">=</span><span style="color: #000000;">A[p]<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">&nbsp;True&nbsp;:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">&nbsp;p</span><span style="color: #000000;">+</span><span style="color: #000000;">1</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">r&nbsp;</span><span style="color: #0000ff;">and</span><span style="color: #000000;">&nbsp;A[p]&nbsp;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;tmp&nbsp;:&nbsp;p</span><span style="color: #000000;">+=</span><span style="color: #000000;">1</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">&nbsp;r</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">p&nbsp;</span><span style="color: #0000ff;">and</span><span style="color: #000000;">&nbsp;A[r]&nbsp;</span><span style="color: #000000;">&lt;=</span><span style="color: #000000;">&nbsp;tmp&nbsp;:&nbsp;r</span><span style="color: #000000;">-=</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;A[p]</span><span style="color: #000000;">&lt;=</span><span style="color: #000000;">A[r]:&nbsp;A[p],A[r]</span><span style="color: #000000;">=</span><span style="color: #000000;">A[r],A[p]<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;r</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">&lt;=</span><span style="color: #000000;">p&nbsp;:&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;p<br />
<br />
<br />
</span><span style="color: #0000ff;">def</span><span style="color: #000000;">&nbsp;quickSort(A,p,r):<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;p</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">r:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;q</span><span style="color: #000000;">=</span><span style="color: #000000;">partition(A,p,r)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;quickSort(A,p,q)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;quickSort(A,q</span><span style="color: #000000;">+</span><span style="color: #000000;">1</span><span style="color: #000000;">,r)<br />
<br />
A</span><span style="color: #000000;">=</span><span style="color: #000000;">[</span><span style="color: #000000;">9</span><span style="color: #000000;">,</span><span style="color: #000000;">61</span><span style="color: #000000;">,</span><span style="color: #000000;">7</span><span style="color: #000000;">,</span><span style="color: #000000;">14</span><span style="color: #000000;">,</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">,</span><span style="color: #000000;">7</span><span style="color: #000000;">,</span><span style="color: #000000;">667</span><span style="color: #000000;">,</span><span style="color: #000000;">3</span><span style="color: #000000;">,</span><span style="color: #000000;">6</span><span style="color: #000000;">,</span><span style="color: #000000;">8</span><span style="color: #000000;">]<br />
</span><span style="color: #0000ff;">print</span><span style="color: #000000;">&nbsp;A<br />
quickSort(A,0,len(A)</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">)<br />
</span><span style="color: #0000ff;">print</span><span style="color: #000000;">&nbsp;A<br />
<strong># 结果 </strong></span><strong>[667, 61, 14, 9, 8, 7, 7, 6, 3, -1]</strong></div>
<br />
<br />
<br />
图解：<br />
一次迭代过程描述 （从小到大）：<br />
1. 以 A[0] 为切分点 用临时变量 记录 这里是 <strong>切分点</strong> = [5] <br />
2. 分别起 2枚指针 [切分起左,右]<br />
3. 分别向中间 靠拢 ， 当左指针指向值大于 切分点 停止 左 ， 右指针指向值 小于 切分点 停止 右 。<br />
4. 判断 是否是&nbsp; 停止点 上 左值 小于 右值 是：交换两指针值 ！ <br />
<img src="http://www.blogjava.net/images/blogjava_net/skynet/42926/qs.jpg" alt="" border="0" /><br />
<strong>第一次迭代后 :&nbsp; <br />
&nbsp; 以初始分隔 [5]&nbsp; 就已经切分好了 小于 5 的左 ，大于等于5 的右</strong><br />
<br />
<img src ="http://www.blogjava.net/Skynet/aggbug/304668.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Skynet/" target="_blank">刘凯毅</a> 2009-12-03 17:11 <a href="http://www.blogjava.net/Skynet/archive/2009/12/03/304668.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>