﻿<?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/category/38000.html</link><description /><language>zh-cn</language><lastBuildDate>Tue, 02 Feb 2010 06:35:22 GMT</lastBuildDate><pubDate>Tue, 02 Feb 2010 06:35:22 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>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>beanstalkd 消息队列的第一手资料</title><link>http://www.blogjava.net/Skynet/archive/2009/10/30/300325.html</link><dc:creator>刘凯毅</dc:creator><author>刘凯毅</author><pubDate>Fri, 30 Oct 2009 04:05:00 GMT</pubDate><guid>http://www.blogjava.net/Skynet/archive/2009/10/30/300325.html</guid><wfw:comment>http://www.blogjava.net/Skynet/comments/300325.html</wfw:comment><comments>http://www.blogjava.net/Skynet/archive/2009/10/30/300325.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Skynet/comments/commentRss/300325.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Skynet/services/trackbacks/300325.html</trackback:ping><description><![CDATA[<br />
beanstalk 消息队列 小结 <br />
协议说明和各状态转换情况<br />
<br />
<br />
<strong>基本知识点:</strong><br />
&nbsp; 1. 对于beanstalk 消息队列中每条数据都为 job<br />
&nbsp; 2. beanstalk service端 ，会维护 tubes[多个管道]<br />
&nbsp; 3. client端可以监听,使用多 tube<br />
&nbsp; 4. client端可以指定 use 管道[ client生成一个新的job时会把此job提交到 指定管道]<br />
&nbsp; 5. client端可以指定 watch 管道 [ client接收处理job时会到 指定管道得到待处理的job]<br />
<br />
<br />
<strong>官方示意图:</strong><br />
put&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; reserve&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; delete<br />
-----&gt; [READY] ---------&gt; [RESERVED] --------&gt; *poof*<br />
<br />
<strong>一般情况:</strong><br />
1. 任务提交到service端,job 管理放入内存空间并为其标记状态 [READY] <br />
2. client通过轮训竞争得到次状态, job 改为&nbsp; [RESERVED]<br />
&nbsp;&nbsp; 2.1 当在默认时间 120 秒内没处理完 , job.stats.timeouts 就会大于 0 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 同时其他 轮训竞争client会拿到这个job【 注意了 每次timeouts时,在轮训的客户端就会得到次job，状态都为 ready,timeouts&gt;0 】<br />
3. 随便其中一台client处理完 job.delete&nbsp;&nbsp; , 其他 client 中的此job 都会&nbsp;&nbsp;&nbsp; *poof*&nbsp; <br />
<br />
<br />
<br />
<br />
<strong>deom - python beanstalkc 中 job.stats 参考:</strong><br />
<strong>使用 easy_install beanstalkc </strong><br />
<strong>API 参考 : http://github.com/earl/beanstalkc/blob/master/TUTORIAL</strong><br />
刚生成的 beanstalk<br />
{'buries': 0, 'releases': 0, 'tube': 'default', 'timeouts': 0, 'ttr': 120, <br />
'age': 6, 'pri': 2147483648L, 'delay': 0, '<strong>state</strong>': '<strong>reserved</strong>', '<strong>time-left</strong>': <strong>114</strong>, <br />
'kicks': 0, 'id': 2}<br />
<br />
以timeout了的 beanstalk,并且在其他client轮训到 job<br />
{'buries': 0, 'releases': 0, 'tube': 'default', 'timeouts': 1, 'ttr': 120, <br />
'age': 417, 'pri': 2147483648L, 'delay': 0, '<strong>state</strong>': '<strong>reserved</strong>', '<strong>time-left</strong>': <strong>110</strong>, <br />
'kicks': 0, 'id': 2}<br />
{'buries': 0, 'releases': 0, 'tube': 'default', 'timeouts': 1, 'ttr': 120, 'age': 415, <br />
'pri': 2147483648L, 'delay': 0, '<strong>state</strong>': '<strong>reserved</strong>', '<strong>time-left</strong>': <strong>4294967163L</strong>, <br />
'kicks': 0, 'id': 2}<br />
<br />
当没所有client 的 job 都到期 了 状态<br />
{'buries': 0, 'releases': 0, 'tube': 'default', 'timeouts': 2, 'ttr': 120, <br />
'age': 417, 'pri': 2147483648L, 'delay': 0, '<strong>state</strong>': '<strong>ready</strong>', '<strong>time-left</strong>': <strong>4294967161L</strong>, <br />
'kicks': 0, 'id': 2}<br />
{'buries': 0, 'releases': 0, 'tube': 'default', 'timeouts': 2, 'ttr': 120, 'age': 415, <br />
'pri': 2147483648L, 'delay': 0, '<strong>state</strong>': '<strong>ready</strong>', '<strong>time-left</strong>': <strong>4294967163L</strong>, <br />
'kicks': 0, 'id': 2}<br />
<br />
其中 client1 job.delete<br />
client1 job.stats&nbsp; *poof*<br />
client2 job.stats&nbsp; *poof*<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
比较全的状态说明 - [官方文档]<br />
http://github.com/kr/beanstalkd/blob/v1.1/doc/protocol.txt?raw=true<br />
<br />
官方示意图:<br />
&nbsp;
<img src="http://www.blogjava.net/images/blogjava_net/skynet/beanstalk.jpg" alt="" border="0" /><br />
<br />
<br />
<strong>先简单说明下（完全自己理解的，欢迎拍砖。本人E人太差~看官档费劲，谅解下）: </strong><br />
job.stats状态 = [READY] 待处理,&nbsp; [RESERVED] 正处理, [DELAYED]延迟状态 ,&nbsp; [BURIED] 隐藏状态<br />
<br />
<strong>1. 延迟提交</strong><br />
py.client1.put&gt;&gt;&gt; beanstalk.put('yes!', delay=10)<br />
py.client3.reserve&gt;&gt;&gt; job = beanstalk.reserve()<br />
# 等待 10&nbsp; 秒<br />
<br />
<strong>2. 管道测试</strong><br />
put-job到service端 可以指定 put的tube管道<br />
如: <br />
<br />
py.client1.put&gt;&gt;&gt; beanstalk.use('foo') <br />
py.client1.put&gt;&gt;&gt; beanstalk.put('hey!')<br />
<br />
py.client2.reserve&gt;&gt;&gt; job = beanstalk.reserve()<br />
# 一直拥塞，应为 他 watch 管道 'default'<br />
<br />
py.client3.reserve&gt;&gt;&gt; beanstalk.watch('foo')<br />
# beanstalk.ignore('bar') 放弃监听 bar<br />
py.client3.reserve&gt;&gt;&gt; job = beanstalk.reserve()<br />
py.client3.reserve&gt;&gt;&gt; job.body #输出 'hey!' <br />
<br />
<br />
<br />
<strong>3. 隐藏状态 现在吧 client 1/2/3 的 use watch 的管道都调回 default</strong><br />
py.client2.reserve&gt;&gt;&gt; job = beanstalk.reserve()<br />
py.client3.reserve&gt;&gt;&gt; job = beanstalk.reserve()<br />
py.client1.put&gt;&gt;&gt; beanstalk.put('隐藏状态!')<br />
py.client2.reserve&gt;&gt;&gt; job.bury() #2 轮训得到 并且 修改 job 为隐藏状态<br />
# 120 秒后 client3 没有轮训得到 此job <br />
py.client2.reserve&gt;&gt;&gt; job.stats() <br />
{'buries': 1, 'releases': 0, 'tube': 'default', 'timeouts': 0, 'ttr': 120, <br />
'age': 188, 'pri': 2147483648L, 'delay': 0, 'state': 'buried',<br />
'time-left': 4294967228L, 'kicks': 0, 'id': 11}<br />
py.client2.reserve&gt;&gt;&gt; beanstalk.kick( job.stats()['id'] ) #修改状态为 reserved<br />
# 立刻 client3 得到 job<br />
py.client3.reserve&gt;&gt;&gt; job.stats()<br />
{'buries': 1, 'releases': 0, 'tube': 'default', 'timeouts': 0, 'ttr': 120, 'age': 313, <br />
'pri': 2147483648L, 'delay': 0, 'state': 'reserved', <br />
'time-left': 110, 'kicks': 1, 'id': 11}<br />
# 这时候 client2 / 3 同时 有 job 11 状态 'buries': 1,'timeouts': 0,'state': 'reserved'<br />
<br />
<strong>4. peek 窥见</strong><br />
&nbsp; 可以得到 一个 stats - read 的 job ，其他 client 可以 job = beanstalk.reserve() <br />
&nbsp; 后马上 job.stats 会变成&nbsp; [RESERVED] <br />
&nbsp; py.client2.reserve&gt;&gt;&gt; job = beanstalk.peek_ready()<br />
&nbsp; 取得 job 并看 本 client 能 处理能<br />
&gt;&gt;&gt; job = beanstalk.peek(3)<br />
&gt;&gt;&gt; job.body<br />
&nbsp;&nbsp;&nbsp; 'yes!'<br />
&gt;&gt;&gt; job.stats()['state']<br />
&nbsp;&nbsp;&nbsp; 'ready'<br />
这种形式西 job 不能 bury 等修改状态，但 可以 delete<br />
<br />
peek 系类<br />
&nbsp;peek_buried<br />
&nbsp;peek_ready<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<img src ="http://www.blogjava.net/Skynet/aggbug/300325.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-10-30 12:05 <a href="http://www.blogjava.net/Skynet/archive/2009/10/30/300325.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>消息队列  beanstalkd 介绍</title><link>http://www.blogjava.net/Skynet/archive/2009/10/28/300097.html</link><dc:creator>刘凯毅</dc:creator><author>刘凯毅</author><pubDate>Wed, 28 Oct 2009 11:21:00 GMT</pubDate><guid>http://www.blogjava.net/Skynet/archive/2009/10/28/300097.html</guid><wfw:comment>http://www.blogjava.net/Skynet/comments/300097.html</wfw:comment><comments>http://www.blogjava.net/Skynet/archive/2009/10/28/300097.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Skynet/comments/commentRss/300097.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Skynet/services/trackbacks/300097.html</trackback:ping><description><![CDATA[<br />
首先 好东西 <br />
&nbsp; http://kr.github.com/beanstalkd/<br />
<br />
<br />
其次 真的是好东西 支持 java , python ,perl,ruby,erlang 和我不知道的 语言<br />
&nbsp; 官方的原文介绍：<br />
<div>
<pre>$ ./beanstalkd -d -l 10.0.1.5 -p 11300<br />
<br />
</pre>
</div>
<p>This starts up <code>beanstalkd</code> as a daemon listening on address 10.0.1.5, port 11300.</p>
<h2 id="use_it">Use It</h2>
<p>Here&#8217;s an example in Ruby (see the <a href="http://kr.github.com/beanstalkd/client.html">client libraries</a> to find your favorite language).</p>
<p>First, have one process put a job into the queue:</p>
<div>
<pre>beanstalk = Beanstalk::Pool.new(['10.0.1.5:11300'])<br />
<br />
beanstalk.put('hello')<br />
<br />
</pre>
</div>
<p>Then start another process to take jobs out of the queue and run them:</p>
<div>
<pre>beanstalk = Beanstalk::Pool.new(['10.0.1.5:11300'])<br />
<br />
loop do<br />
<br />
job = beanstalk.reserve<br />
<br />
puts job.body # prints "hello"<br />
<br />
job.delete<br />
<br />
end<br />
<br />
<br />
<br />
</pre>
</div>
<br />
<br />
<h2 id="thanks">Thanks</h2>
<p>Many thanks to <a href="http://www.danga.com/memcached/">memcached</a>
for providing inspiration for simple protocol design and for the
structure of the documentation. Not to mention a fantastic piece of
software!</p>
<br />
<img src ="http://www.blogjava.net/Skynet/aggbug/300097.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-10-28 19:21 <a href="http://www.blogjava.net/Skynet/archive/2009/10/28/300097.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hadoop streaming( hadoop + perl  )小试</title><link>http://www.blogjava.net/Skynet/archive/2009/09/25/296420.html</link><dc:creator>刘凯毅</dc:creator><author>刘凯毅</author><pubDate>Fri, 25 Sep 2009 06:33:00 GMT</pubDate><guid>http://www.blogjava.net/Skynet/archive/2009/09/25/296420.html</guid><wfw:comment>http://www.blogjava.net/Skynet/comments/296420.html</wfw:comment><comments>http://www.blogjava.net/Skynet/archive/2009/09/25/296420.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Skynet/comments/commentRss/296420.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Skynet/services/trackbacks/296420.html</trackback:ping><description><![CDATA[参考:<br />
&nbsp; http://hadoop.apache.org/common/docs/r0.15.2/streaming.html<br />
<br />
注意<br />
&nbsp; 目前 streaming 对 linux pipe #也就是 cat |wc -l 这样的管道 不支持，但不妨碍我们使用perl,python 行式命令！！<br />
&nbsp; 原话是 ：<br />
&nbsp; Can I use UNIX pipes? For example, will -mapper "cut -f1 | sed s/foo/bar/g" work?<br />
&nbsp;&nbsp;&nbsp; Currently this does not work and gives an "java.io.IOException: Broken
pipe" error. <br />
&nbsp;&nbsp;&nbsp; This is probably a bug that needs to be investigated.
<br />
&nbsp; 但如果你是强烈的 linux shell pipe 发烧友 ！ 参考下面<br />
&nbsp; $&gt; perl -e 'open( my $fh, "grep -v null <strong>tt </strong>|sed -n 1,5p |");while ( &lt;$fh&gt; ) {print;} '<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong> #不过我没测试通过 ！！ </strong><br />
<br />
环境 ：hadoop-0.18.3<br />
$&gt; find . -type f -name "*streaming*.jar" <br />
./contrib/streaming/hadoop-0.18.3-streaming.jar<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: #808080;">-</span><span style="color: #000000;">bash</span><span style="color: #808080;">-</span><span style="color: #800000; font-weight: bold;">3.00</span><span style="color: #000000;">$&nbsp;head&nbsp;tt&nbsp;<br />
</span><span style="color: #0000ff;">null</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;false&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold;">3702</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold;">208100</span><span style="color: #000000;"><br />
</span><span style="color: #800000; font-weight: bold;">6005100</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;false&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold;">70</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold;">13220</span><span style="color: #000000;"><br />
</span><span style="color: #800000; font-weight: bold;">6005127</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;false&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold;">24</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold;">4640</span><span style="color: #000000;"><br />
</span><span style="color: #800000; font-weight: bold;">6005160</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;false&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold;">25</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold;">4820</span><span style="color: #000000;"><br />
</span><span style="color: #800000; font-weight: bold;">6005161</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;false&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold;">20</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold;">3620</span><span style="color: #000000;"><br />
</span><span style="color: #800000; font-weight: bold;">6005164</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;false&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold;">14</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold;">1280</span><span style="color: #000000;"><br />
</span><span style="color: #800000; font-weight: bold;">6005165</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;false&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold;">37</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold;">7080</span><span style="color: #000000;"><br />
</span><span style="color: #800000; font-weight: bold;">6005168</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;false&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold;">104</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold;">20140</span><span style="color: #000000;"><br />
</span><span style="color: #800000; font-weight: bold;">6005169</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;false&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold;">35</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold;">6680</span><span style="color: #000000;"><br />
</span><span style="color: #800000; font-weight: bold;">6005240</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;false&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold;">169</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold;">32140<br />
......<br />
</span></div>
<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: #000000;">c1</span><span style="color: #000000;">=</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000; font-weight: bold;">&nbsp; perl&nbsp;-ne&nbsp;&nbsp;'if(/.*</span><span style="color: #000000; font-weight: bold;">\</span><span style="color: #000000;">t(</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;">$sum+=</span><span style="color: #000000; font-weight: bold;">\</span><span style="color: #000000;">$</span><span style="color: #800000;">1</span><span style="color: #000000;">;}END{</span><span style="color: #0000ff;">print</span><span style="color: #000000;"> <strong>\"</strong></span><span style="color: #000000; font-weight: bold;">\</span><span style="color: #000000; font-weight: bold;">$sum\";}'</span><span style="color: #000000; font-weight: bold;">&nbsp; "<br />
# 注意 这里 $ 要写成 \$&nbsp;&nbsp;&nbsp; " 写成 \"<br />
</span><span style="color: #000000;">
echo $c1; # 打印输出&nbsp; </span>perl -ne 'if(/.*"t(.*)/){$sum+=$1;}END{print $sum;}'<br />
<span style="color: #000000;">hadoop&nbsp;jar&nbsp;hadoop</span><span style="color: #000000;">-</span><span style="color: #800000;">0.18</span><span style="color: #000000;">.</span><span style="color: #800000;">3</span><span style="color: #000000;">-</span><span style="color: #000000;">streaming</span><span style="color: #000000;">.</span><span style="color: #000000;">jar <br />
&nbsp;&nbsp; </span><span style="color: #000000;">-</span><span style="color: #000000;">input&nbsp;file</span><span style="color: #000000;">:///</span><span style="color: #000000;">data</span><span style="color: #000000;">/</span><span style="color: #000000;">hadoop</span><span style="color: #000000;">/</span><span style="color: #000000;">lky</span><span style="color: #000000;">/</span><span style="color: #000000;">jar</span><span style="color: #000000;">/</span><span style="color: #000000;">tt&nbsp; </span><span style="color: #000000;"><br />
&nbsp;&nbsp; -</span><span style="color: #000000;">mapper&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000; font-weight: bold;">/bin/cat</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000;">&nbsp; </span><span style="color: #000000;"><br />
&nbsp;&nbsp; -</span><span style="color: #000000;">reducer&nbsp;</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000; font-weight: bold;">$c1</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000;">&nbsp; <br />
&nbsp;&nbsp; </span><span style="color: #000000;">-</span><span style="color: #000000;">output&nbsp;file</span><span style="color: #000000;">:///</span><span style="color: #000000;">tmp</span><span style="color: #000000;">/</span><span style="color: #000000;">lky</span><span style="color: #000000;">/</span><span style="color: #000000;">streamingx8</span></div>
<br />
<br />
结果:<br />
cat <span style="color: #000000;">/</span><span style="color: #000000;">tmp</span><span style="color: #000000;">/</span><span style="color: #000000;">lky</span><span style="color: #000000;">/</span><span style="color: #000000;">streamingx8/*<br />
</span>1166480<br />
<br />
本地运行输出:<br />
perl -ne 'if(/.*"t(.*)/){$sum+=$1;}END{print $sum;}' &lt; tt<br />
1166480<br />
<br />
结果正确!!!!<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: #000000;">-</span><span style="color: #000000;">bash</span><span style="color: #000000;">-</span><span style="color: #000000;">3.00</span><span style="color: #000000;">$&nbsp;hadoop&nbsp;jar&nbsp;hadoop</span><span style="color: #000000;">-</span><span style="color: #000000;">0.18</span><span style="color: #000000;">.</span><span style="color: #000000;">3</span><span style="color: #000000;">-</span><span style="color: #000000;">streaming.jar&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">info<br />
</span><span style="color: #000000;">09</span><span style="color: #000000;">/</span><span style="color: #000000;">09</span><span style="color: #000000;">/</span><span style="color: #000000;">25</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">14</span><span style="color: #000000;">:</span><span style="color: #000000;">50</span><span style="color: #000000;">:</span><span style="color: #000000;">12</span><span style="color: #000000;">&nbsp;ERROR&nbsp;streaming.StreamJob:&nbsp;Missing&nbsp;required&nbsp;option&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">input<br />
Usage:&nbsp;$HADOOP_HOME</span><span style="color: #000000;">/</span><span style="color: #000000;">bin</span><span style="color: #000000;">/</span><span style="color: #000000;">hadoop&nbsp;[</span><span style="color: #000000;">--</span><span style="color: #000000;">config&nbsp;dir]&nbsp;jar&nbsp;\<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$HADOOP_HOME</span><span style="color: #000000;">/</span><span style="color: #000000;">hadoop</span><span style="color: #000000;">-</span><span style="color: #000000;">streaming.jar&nbsp;[options]<br />
Options:<br />
&nbsp;&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">input&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">path</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DFS&nbsp;input&nbsp;file(s)&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;the&nbsp;Map&nbsp;step<br />
&nbsp;&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">output&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">path</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DFS&nbsp;output&nbsp;directory&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;the&nbsp;Reduce&nbsp;step<br />
&nbsp;&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">mapper&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">cmd</span><span style="color: #000000;">|</span><span style="color: #000000;">JavaClassName</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;streaming&nbsp;command&nbsp;to&nbsp;run<br />
&nbsp;&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">combiner&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">JavaClassName</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;Combiner&nbsp;has&nbsp;to&nbsp;be&nbsp;a&nbsp;Java&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;"><br />
&nbsp;&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">reducer&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">cmd</span><span style="color: #000000;">|</span><span style="color: #000000;">JavaClassName</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;streaming&nbsp;command&nbsp;to&nbsp;run<br />
&nbsp;&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">file&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">file</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;File</span><span style="color: #000000;">/</span><span style="color: #000000;">dir&nbsp;to&nbsp;be&nbsp;shipped&nbsp;</span><span style="color: #0000ff;">in</span><span style="color: #000000;">&nbsp;the&nbsp;Job&nbsp;jar&nbsp;file<br />
&nbsp;&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">dfs&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">h:p</span><span style="color: #000000;">&gt;|</span><span style="color: #000000;">local&nbsp;&nbsp;Optional.&nbsp;Override&nbsp;DFS&nbsp;configuration<br />
&nbsp;&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">jt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">h:p</span><span style="color: #000000;">&gt;|</span><span style="color: #000000;">local&nbsp;&nbsp;Optional.&nbsp;Override&nbsp;JobTracker&nbsp;configuration<br />
&nbsp;&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">additionalconfspec&nbsp;specfile&nbsp;&nbsp;Optional.<br />
&nbsp;&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">inputformat&nbsp;TextInputFormat(</span><span style="color: #0000ff;">default</span><span style="color: #000000;">)</span><span style="color: #000000;">|</span><span style="color: #000000;">SequenceFileAsTextInputFormat</span><span style="color: #000000;">|</span><span style="color: #000000;">JavaClassName&nbsp;Optional.<br />
&nbsp;&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">outputformat&nbsp;TextOutputFormat(</span><span style="color: #0000ff;">default</span><span style="color: #000000;">)</span><span style="color: #000000;">|</span><span style="color: #000000;">JavaClassName&nbsp;&nbsp;Optional.<br />
&nbsp;&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">partitioner&nbsp;JavaClassName&nbsp;&nbsp;Optional.<br />
&nbsp;&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">numReduceTasks&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">num</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;&nbsp;Optional.<br />
&nbsp;&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">inputreader&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">spec</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;&nbsp;Optional.<br />
&nbsp;&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">jobconf&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">n</span><span style="color: #000000;">&gt;=&lt;</span><span style="color: #000000;">v</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;Optional.&nbsp;Add&nbsp;or&nbsp;</span><span style="color: #0000ff;">override</span><span style="color: #000000;">&nbsp;a&nbsp;JobConf&nbsp;property<br />
&nbsp;&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">cmdenv&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">n</span><span style="color: #000000;">&gt;=&lt;</span><span style="color: #000000;">v</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;Optional.&nbsp;Pass&nbsp;env.var&nbsp;to&nbsp;streaming&nbsp;commands<br />
&nbsp;&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">mapdebug&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">path</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;&nbsp;Optional.&nbsp;To&nbsp;run&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">&nbsp;script&nbsp;when&nbsp;a&nbsp;map&nbsp;task&nbsp;fails&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">reducedebug&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">path</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;&nbsp;Optional.&nbsp;To&nbsp;run&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">&nbsp;script&nbsp;when&nbsp;a&nbsp;reduce&nbsp;task&nbsp;fails&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">cacheFile&nbsp;fileNameURI<br />
&nbsp;&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">cacheArchive&nbsp;fileNameURI<br />
&nbsp;&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">verbose</span></div>
<br />
<br />
<img src ="http://www.blogjava.net/Skynet/aggbug/296420.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-09-25 14:33 <a href="http://www.blogjava.net/Skynet/archive/2009/09/25/296420.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hadoop jython ( windows )</title><link>http://www.blogjava.net/Skynet/archive/2009/09/04/293914.html</link><dc:creator>刘凯毅</dc:creator><author>刘凯毅</author><pubDate>Fri, 04 Sep 2009 09:14:00 GMT</pubDate><guid>http://www.blogjava.net/Skynet/archive/2009/09/04/293914.html</guid><wfw:comment>http://www.blogjava.net/Skynet/comments/293914.html</wfw:comment><comments>http://www.blogjava.net/Skynet/archive/2009/09/04/293914.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Skynet/comments/commentRss/293914.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Skynet/services/trackbacks/293914.html</trackback:ping><description><![CDATA[参考 ： <a id="viewpost1_TitleUrl" href="../../Skynet/archive/2009/07/08/285919.html">hadoop window  搭建</a> 后,由于对 py 的语法喜欢 ，一直想 把hadoop,改成jython 的 <br />
这次 在 自己电脑上&nbsp; 终于 完成,下面介绍过程:<br />
<br />
测试环境：<br />
依然的 windows + cygwin <br />
hadoop 0.18&nbsp; # C:/cygwin/home/lky/tools/java/hadoop-0.18.3<br />
jython 2.2.1 # C:/jython2.2.1<br />
<br />
参考: <a title="Click to do a full-text search for this title" href="http://wiki.apache.org/hadoop/PythonWordCount?action=fullsearch&amp;value=linkto%3A%22PythonWordCount%22&amp;context=180">PythonWordCount</a><br />
<br />
启动 hadoop 并到 hdoop_home 下<br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 0);"><strong># 在云环境中创建 input 目录</strong><br />
$&gt;bin/hadoop&nbsp;dfs -mkdir input</span><br />
<strong># 在 包 hadoop 的 NOTICE.txt 拷贝到 input 目录下</strong><br />
<span style="color: rgb(0, 0, 0);">$&gt;bin/hadoop&nbsp;dfs&nbsp;-copyFromLocal&nbsp;c:/cygwin/home/lky/tools/java/hadoop-0.18.3/NOTICE.txt&nbsp; hdfs:///user/lky/input<br />
<br />
$&gt;cd </span>src/examples/python<br />
<br />
<strong># 创建 个 脚本 ( jy-&gt;jar-&gt;hd run&nbsp; ) 一步完成!<br />
# 当然 在 linux 写个脚本比这 好看 呵呵！<br />
</strong>$&gt;vim run.bat<br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">C:\Program&nbsp;Files\Java\jdk1.6.0_11\bin\java.exe</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;-classpath&nbsp;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">C:\jython2.2.1\jython.jar;%CLASSPATH%</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&nbsp;org.python.util.jython&nbsp;C:\jython2</span><span style="color: rgb(0, 0, 0);">.2.1</span><span style="color: rgb(0, 0, 0);">\Tools\jythonc\jythonc.py&nbsp;&nbsp;&nbsp;-p&nbsp;org.apache.hadoop.examples&nbsp;-d&nbsp;-j&nbsp;wc.jar&nbsp;-c&nbsp;%</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);"><br />
<br />
<strong>sh&nbsp;</strong>C:\cygwin\home\lky\tools\java\hadoop-</span><span style="color: rgb(0, 0, 0);">0.18.3</span><span style="color: rgb(0, 0, 0);">\bin\hadoop&nbsp;jar&nbsp;wc.jar&nbsp;&nbsp;%</span><span style="color: rgb(0, 0, 0);">2</span><span style="color: rgb(0, 0, 0);">&nbsp;%</span><span style="color: rgb(0, 0, 0);">3</span><span style="color: rgb(0, 0, 0);">&nbsp;%</span><span style="color: rgb(0, 0, 0);">4</span><span style="color: rgb(0, 0, 0);">&nbsp;%</span><span style="color: rgb(0, 0, 0);">5</span><span style="color: rgb(0, 0, 0);">&nbsp;%</span><span style="color: rgb(0, 0, 0);">6</span><span style="color: rgb(0, 0, 0);">&nbsp;%</span><span style="color: rgb(0, 0, 0);">7</span><span style="color: rgb(0, 0, 0);">&nbsp;%</span><span style="color: rgb(0, 0, 0);">8</span><span style="color: rgb(0, 0, 0);">&nbsp;%</span><span style="color: rgb(0, 0, 0);">9</span><span style="color: rgb(0, 0, 0);"> <br />
</span></div>
<br />
<strong># 修改 jythonc 打包 环境 。 +hadoop jar </strong><br />
$&gt;vim C:\jython2.2.1\Tools\jythonc\jythonc.py<br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 128, 0);">#</span><span style="color: rgb(0, 128, 0);">&nbsp;Copyright&nbsp;(c)&nbsp;Corporation&nbsp;for&nbsp;National&nbsp;Research&nbsp;Initiatives</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 0);">#</span><span style="color: rgb(0, 128, 0);">&nbsp;Driver&nbsp;script&nbsp;for&nbsp;jythonc2.&nbsp;&nbsp;See&nbsp;module&nbsp;main.py&nbsp;for&nbsp;details</span><span style="color: rgb(0, 128, 0);"><br />
</span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);">&nbsp;sys,os,glob<br />
<strong><br />
</strong>
</span><strong><span style="color: rgb(0, 0, 255);">for</span><span style="color: rgb(0, 0, 0);">&nbsp;fn&nbsp;</span><span style="color: rgb(0, 0, 255);">in</span><span style="color: rgb(0, 0, 0);">&nbsp;glob.glob(</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">c:/cygwin/home/lky/tools/java/hadoop-0.18.3/*.jar</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">)&nbsp;:sys.path.append(fn)<br />
</span><span style="color: rgb(0, 0, 255);">for</span><span style="color: rgb(0, 0, 0);">&nbsp;fn&nbsp;</span><span style="color: rgb(0, 0, 255);">in</span><span style="color: rgb(0, 0, 0);">&nbsp;glob.glob(</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">c:/jython2.2.1/*.jar</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">)&nbsp;:sys.path.append(fn)<br />
</span><span style="color: rgb(0, 0, 255);">for</span><span style="color: rgb(0, 0, 0);">&nbsp;fn&nbsp;</span><span style="color: rgb(0, 0, 255);">in</span><span style="color: rgb(0, 0, 0);">&nbsp;glob.glob(</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">c:/cygwin/home/lky/tools/java/hadoop-0.18.3/lib/*.jar</span><span style="color: rgb(128, 0, 0);">'</span></strong><span style="color: rgb(0, 0, 0);"><strong>)&nbsp;:sys.path.append(fn)<br />
</strong>
<br />
</span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);">&nbsp;main<br />
main.main()<br />
<br />
</span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);">&nbsp;os<br />
os._exit(0)<br />
</span></div>
<br />
<br />
<strong># 运行</strong><br />
C:/cygwin/home/lky/tools/java/hadoop-0.18.3/src/examples/python&gt;<br />
&nbsp; run.bat WordCount.py&nbsp; hdfs:///user/lky/input&nbsp; file:///c:/cygwin/home/lky/tools/java/hadoop-0.18.3/tmp2<br />
<br />
<br />
</div>
<strong><br />
<br />
结果输出：</strong><br />
cat c:/cygwin/home/lky/tools/java/hadoop-0.18.3/tmp2/part-00000<br />
(http://www.apache.org/).&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1<br />
Apache&nbsp; 1<br />
Foundation&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1<br />
Software&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1<br />
The&nbsp;&nbsp;&nbsp;&nbsp; 1<br />
This&nbsp;&nbsp;&nbsp; 1<br />
by&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1<br />
developed&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1<br />
includes&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1<br />
product 1<br />
software&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1<br />
<br />
<strong>下面重头来了 ：（简洁的 jy hdoop 代码）</strong><br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 128, 0);">#<br />
#</span><span style="color: rgb(0, 128, 0);">&nbsp;Licensed&nbsp;to&nbsp;the&nbsp;Apache&nbsp;Software&nbsp;Foundation&nbsp;(ASF)&nbsp;under&nbsp;one</span><span style="color: rgb(0, 128, 0);"><br />
#</span><span style="color: rgb(0, 128, 0);">&nbsp;or&nbsp;more&nbsp;contributor&nbsp;license&nbsp;agreements.&nbsp;&nbsp;See&nbsp;the&nbsp;NOTICE&nbsp;file</span><span style="color: rgb(0, 128, 0);"><br />
#</span><span style="color: rgb(0, 128, 0);">&nbsp;distributed&nbsp;with&nbsp;this&nbsp;work&nbsp;for&nbsp;additional&nbsp;information</span><span style="color: rgb(0, 128, 0);"><br />
#</span><span style="color: rgb(0, 128, 0);">&nbsp;regarding&nbsp;copyright&nbsp;ownership.&nbsp;&nbsp;The&nbsp;ASF&nbsp;licenses&nbsp;this&nbsp;file</span><span style="color: rgb(0, 128, 0);"><br />
#</span><span style="color: rgb(0, 128, 0);">&nbsp;to&nbsp;you&nbsp;under&nbsp;the&nbsp;Apache&nbsp;License,&nbsp;Version&nbsp;2.0&nbsp;(the</span><span style="color: rgb(0, 128, 0);"><br />
#</span><span style="color: rgb(0, 128, 0);">&nbsp;"License");&nbsp;you&nbsp;may&nbsp;not&nbsp;use&nbsp;this&nbsp;file&nbsp;except&nbsp;in&nbsp;compliance</span><span style="color: rgb(0, 128, 0);"><br />
#</span><span style="color: rgb(0, 128, 0);">&nbsp;with&nbsp;the&nbsp;License.&nbsp;&nbsp;You&nbsp;may&nbsp;obtain&nbsp;a&nbsp;copy&nbsp;of&nbsp;the&nbsp;License&nbsp;at</span><span style="color: rgb(0, 128, 0);"><br />
#<br />
#</span><span style="color: rgb(0, 128, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http://www.apache.org/licenses/LICENSE-2.0</span><span style="color: rgb(0, 128, 0);"><br />
#<br />
#</span><span style="color: rgb(0, 128, 0);">&nbsp;Unless&nbsp;required&nbsp;by&nbsp;applicable&nbsp;law&nbsp;or&nbsp;agreed&nbsp;to&nbsp;in&nbsp;writing,&nbsp;software</span><span style="color: rgb(0, 128, 0);"><br />
#</span><span style="color: rgb(0, 128, 0);">&nbsp;distributed&nbsp;under&nbsp;the&nbsp;License&nbsp;is&nbsp;distributed&nbsp;on&nbsp;an&nbsp;"AS&nbsp;IS"&nbsp;BASIS,</span><span style="color: rgb(0, 128, 0);"><br />
#</span><span style="color: rgb(0, 128, 0);">&nbsp;WITHOUT&nbsp;WARRANTIES&nbsp;OR&nbsp;CONDITIONS&nbsp;OF&nbsp;ANY&nbsp;KIND,&nbsp;either&nbsp;express&nbsp;or&nbsp;implied.</span><span style="color: rgb(0, 128, 0);"><br />
#</span><span style="color: rgb(0, 128, 0);">&nbsp;See&nbsp;the&nbsp;License&nbsp;for&nbsp;the&nbsp;specific&nbsp;language&nbsp;governing&nbsp;permissions&nbsp;and</span><span style="color: rgb(0, 128, 0);"><br />
#</span><span style="color: rgb(0, 128, 0);">&nbsp;limitations&nbsp;under&nbsp;the&nbsp;License.</span><span style="color: rgb(0, 128, 0);"><br />
#<br />
</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 0, 255);">from</span><span style="color: rgb(0, 0, 0);">&nbsp;org.apache.hadoop.fs&nbsp;</span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);">&nbsp;Path<br />
</span><span style="color: rgb(0, 0, 255);">from</span><span style="color: rgb(0, 0, 0);">&nbsp;org.apache.hadoop.io&nbsp;</span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 0, 255);">from</span><span style="color: rgb(0, 0, 0);">&nbsp;org.apache.hadoop.mapred&nbsp;</span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);"><br />
<br />
</span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);">&nbsp;sys<br />
</span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);">&nbsp;getopt<br />
<br />
</span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);">&nbsp;WordCountMap(Mapper,&nbsp;MapReduceBase):<br />
&nbsp;&nbsp;&nbsp;&nbsp;one&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;IntWritable(</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">def</span><span style="color: rgb(0, 0, 0);">&nbsp;map(self,&nbsp;key,&nbsp;value,&nbsp;output,&nbsp;reporter):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">for</span><span style="color: rgb(0, 0, 0);">&nbsp;w&nbsp;</span><span style="color: rgb(0, 0, 255);">in</span><span style="color: rgb(0, 0, 0);">&nbsp;value.toString().split():<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;output.collect(Text(w),&nbsp;self.one)<br />
<br />
</span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);">&nbsp;Summer(Reducer,&nbsp;MapReduceBase):<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">def</span><span style="color: rgb(0, 0, 0);">&nbsp;reduce(self,&nbsp;key,&nbsp;values,&nbsp;output,&nbsp;reporter):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sum&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;0<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">while</span><span style="color: rgb(0, 0, 0);">&nbsp;values.hasNext():<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sum&nbsp;</span><span style="color: rgb(0, 0, 0);">+=</span><span style="color: rgb(0, 0, 0);">&nbsp;values.next().get()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;output.collect(key,&nbsp;IntWritable(sum))<br />
<br />
</span><span style="color: rgb(0, 0, 255);">def</span><span style="color: rgb(0, 0, 0);">&nbsp;printUsage(code):<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">print</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(128, 0, 0);">"</span><span style="color: rgb(128, 0, 0);">wordcount&nbsp;[-m&nbsp;&lt;maps&gt;]&nbsp;[-r&nbsp;&lt;reduces&gt;]&nbsp;&lt;input&gt;&nbsp;&lt;output&gt;</span><span style="color: rgb(128, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;sys.exit(code)<br />
<br />
</span><span style="color: rgb(0, 0, 255);">def</span><span style="color: rgb(0, 0, 0);">&nbsp;main(args):<br />
&nbsp;&nbsp;&nbsp;&nbsp;conf&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;JobConf(WordCountMap);<br />
&nbsp;&nbsp;&nbsp;&nbsp;conf.setJobName(</span><span style="color: rgb(128, 0, 0);">"</span><span style="color: rgb(128, 0, 0);">wordcount</span><span style="color: rgb(128, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">);<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;conf.setOutputKeyClass(Text);<br />
&nbsp;&nbsp;&nbsp;&nbsp;conf.setOutputValueClass(IntWritable);<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;conf.setMapperClass(WordCountMap);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;conf.setCombinerClass(Summer);<br />
&nbsp;&nbsp;&nbsp;&nbsp;conf.setReducerClass(Summer);<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">try</span><span style="color: rgb(0, 0, 0);">:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;flags,&nbsp;other_args&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;getopt.getopt(args[</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">:],&nbsp;</span><span style="color: rgb(128, 0, 0);">"</span><span style="color: rgb(128, 0, 0);">m:r:</span><span style="color: rgb(128, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">except</span><span style="color: rgb(0, 0, 0);">&nbsp;getopt.GetoptError:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printUsage(</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">&nbsp;len(other_args)&nbsp;</span><span style="color: rgb(0, 0, 0);">!=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">2</span><span style="color: rgb(0, 0, 0);">:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printUsage(</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">for</span><span style="color: rgb(0, 0, 0);">&nbsp;f,v&nbsp;</span><span style="color: rgb(0, 0, 255);">in</span><span style="color: rgb(0, 0, 0);">&nbsp;flags:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">&nbsp;f&nbsp;</span><span style="color: rgb(0, 0, 0);">==</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(128, 0, 0);">"</span><span style="color: rgb(128, 0, 0);">-m</span><span style="color: rgb(128, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conf.setNumMapTasks(int(v))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">elif</span><span style="color: rgb(0, 0, 0);">&nbsp;f&nbsp;</span><span style="color: rgb(0, 0, 0);">==</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(128, 0, 0);">"</span><span style="color: rgb(128, 0, 0);">-r</span><span style="color: rgb(128, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conf.setNumReduceTasks(int(v))<br />
&nbsp;&nbsp;&nbsp;&nbsp;conf.setInputPath(Path(other_args[0]))<br />
&nbsp;&nbsp;&nbsp;&nbsp;conf.setOutputPath(Path(other_args[</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">]))<br />
&nbsp;&nbsp;&nbsp;&nbsp;JobClient.runJob(conf);<br />
<br />
</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(128, 0, 128);">__name__</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">==</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(128, 0, 0);">"</span><span style="color: rgb(128, 0, 0);">__main__</span><span style="color: rgb(128, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">:<br />
&nbsp;&nbsp;&nbsp;&nbsp;main(sys.argv)<br />
</span></div>
<br />
<br />
<br />
<br />
<br />
<img src ="http://www.blogjava.net/Skynet/aggbug/293914.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-09-04 17:14 <a href="http://www.blogjava.net/Skynet/archive/2009/09/04/293914.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hadoop cascading demo </title><link>http://www.blogjava.net/Skynet/archive/2009/07/22/287807.html</link><dc:creator>刘凯毅</dc:creator><author>刘凯毅</author><pubDate>Wed, 22 Jul 2009 02:01:00 GMT</pubDate><guid>http://www.blogjava.net/Skynet/archive/2009/07/22/287807.html</guid><wfw:comment>http://www.blogjava.net/Skynet/comments/287807.html</wfw:comment><comments>http://www.blogjava.net/Skynet/archive/2009/07/22/287807.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Skynet/comments/commentRss/287807.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Skynet/services/trackbacks/287807.html</trackback:ping><description><![CDATA[<br />
Java 代码：<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;">package</span><span style="color: #000000;">&nbsp;com.xunjie.dmsp.olduser;<br />
<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.util.Properties;<br />
<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;cascading.flow.Flow;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;cascading.flow.FlowConnector;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;cascading.operation.regex.RegexSplitter;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;cascading.pipe.Each;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;cascading.pipe.Pipe;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;cascading.scheme.TextLine;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;cascading.tap.Hfs;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;cascading.tap.Tap;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;cascading.tuple.Fields;<br />
<br />
</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;*&nbsp;test.txt：&nbsp;<br />
&nbsp;*&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;a<br />
&nbsp;*&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;b<br />
&nbsp;*&nbsp;3&nbsp;&nbsp;&nbsp;&nbsp;c<br />
&nbsp;*&nbsp;<br />
&nbsp;*&nbsp;/data/hadoop/hadoop/bin/hadoop&nbsp;jar&nbsp;<br />
&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dmsp_test_jar-1.0-SNAPSHOT-dependencies.jar&nbsp;<br />
&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hdfs:/user/hadoop/test/lky/test.txt<br />
&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;file:///data/hadoop/test/lky/output<br />
&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Test2&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;main(String[]&nbsp;args)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">设定输入文件</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;sourcePath</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;args[</span><span style="color: #000000;">0</span><span style="color: #000000;">];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">设置输出文件夹</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;sinkPath&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;args[</span><span style="color: #000000;">1</span><span style="color: #000000;">];<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">定义读取列</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Fields&nbsp;inputfields&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Fields(</span><span style="color: #000000;">"</span><span style="color: #000000;">num</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">value</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">定义分解正则，默认&nbsp;\t</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RegexSplitter&nbsp;spliter&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;RegexSplitter(inputfields);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">管道定义</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Pipe&nbsp;p1&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Pipe(&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">test</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;">管道嵌套：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">分解日志源文件，输出给定字段</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p1&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Each(p1,</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Fields(</span><span style="color: #000000;">"</span><span style="color: #000000;">line</span><span style="color: #000000;">"</span><span style="color: #000000;">)&nbsp;,spliter);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">设定输入和输出&nbsp;，使用&nbsp;泛型Hfs</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Tap&nbsp;source&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Hfs(&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;TextLine(),&nbsp;&nbsp;sourcePath&nbsp;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Tap&nbsp;sink&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Hfs(&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;TextLine()&nbsp;,&nbsp;sinkPath&nbsp;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">配置job</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Properties&nbsp;properties&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Properties();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;properties.setProperty(</span><span style="color: #000000;">"</span><span style="color: #000000;">hadoop.job.ugi</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">hadoop,hadoop</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FlowConnector.setApplicationJarClass(&nbsp;properties,&nbsp;Main.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FlowConnector&nbsp;flowConnector&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;FlowConnector(properties);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Flow&nbsp;importFlow&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;flowConnector.connect(&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">import&nbsp;flow</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;source,sink,p1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;importFlow.start();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;importFlow.complete();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</span></div>
<br />
<br />
<img src ="http://www.blogjava.net/Skynet/aggbug/287807.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-07-22 10:01 <a href="http://www.blogjava.net/Skynet/archive/2009/07/22/287807.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hadoop window  搭建</title><link>http://www.blogjava.net/Skynet/archive/2009/07/08/285919.html</link><dc:creator>刘凯毅</dc:creator><author>刘凯毅</author><pubDate>Wed, 08 Jul 2009 03:07:00 GMT</pubDate><guid>http://www.blogjava.net/Skynet/archive/2009/07/08/285919.html</guid><wfw:comment>http://www.blogjava.net/Skynet/comments/285919.html</wfw:comment><comments>http://www.blogjava.net/Skynet/archive/2009/07/08/285919.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Skynet/comments/commentRss/285919.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Skynet/services/trackbacks/285919.html</trackback:ping><description><![CDATA[<br />
hadoop 原理参考：<a title="参考" href="http://www.ibm.com/developerworks/cn/opensource/os-cn-hadoop1/index.html">用 Hadoop 进行分布式并行编程</a><br />
官方中文文档：<a href="http://hadoop.apache.org/core/docs/r0.18.2/cn/index.html">http://hadoop.apache.org/core/docs/r0.18.2/cn/index.html</a><br />
<br />
1. 首先安装 cygwin ssh&nbsp; 参考 <a id="viewpost1_TitleUrl" href="http://www.blogjava.net/Skynet/archive/2009/05/12/270270.html">windows ssh 搭建</a><br />
2.&nbsp;搭建hadoop&nbsp; <a title="参考" href="http://www.linuxboy.net/wordpress2/2009/05/14/125.html">参考 </a><span class="Apple-style-span" style="word-spacing: 0px; font-family: Simsun; font-style: normal; font-variant: normal; font-weight: normal; font-size: 16px; line-height: normal; font-size-adjust: none; font-stretch: normal; text-transform: none; color: #000000; text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; orphans: 2; widows: 2;"><span class="Apple-style-span" style="font-size: 12px; color: #999999; line-height: 18px; font-family: 'Lucida Grande'; text-align: left;"><a href="http://www.linuxboy.net/wordpress2/2009/05/14/125.html"></a><a title="Permanent Link to Cygwin下的Hadoop快速入门-伪分布式模式的查缺补漏" style="margin: 0px; padding: 0px; color: #cccccc; text-decoration: none;" href="http://www.linuxboy.net/wordpress2/2009/05/14/125.html" rel="bookmark">Cygwin下的Hadoop快速入门-伪分布式模式的查缺补漏</a><br />
&nbsp;&nbsp;&nbsp;
</span></span>这里还有 cygwin putty 控制台方法设置<br />
3.&nbsp;开发环境和 demo <a title="参考" href="http://www.ibm.com/developerworks/cn/opensource/os-cn-hadoop2/index.html">参考</a><br />
<br />
通过参考应该环境的搭建没问题，我这搭建成功了，说下我这一些注意到地方吧<br />
1. 我这使用的最新版本的 hadoop-0.20.0 在参考文档中，修改 <span class="Apple-style-span" style="word-spacing: 0px; font-family: Simsun; font-style: normal; font-variant: normal; font-weight: normal; font-size: 19px; line-height: normal; font-size-adjust: none; font-stretch: normal; text-transform: none; color: #000000; text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; orphans: 2; widows: 2;"><span class="Apple-style-span" style="font-size: 14px; line-height: 22px; font-family: verdana;">hadoop-site.xml 。<br />
&nbsp;&nbsp; 在这个版本已经在conf下找不到了，我这尝试修改的 <font face="Verdana">hdfs-site.xml 。测试的时候竟然通过了。<br />
&nbsp;</font></span></span><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;">&lt;?</span><span style="color: #ff00ff;">xml&nbsp;version="1.0"</span><span style="color: #0000ff;">?&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;?</span><span style="color: #ff00ff;">xml-stylesheet&nbsp;type="text/xsl"&nbsp;href="configuration.xsl"</span><span style="color: #0000ff;">?&gt;</span><span style="color: #000000;"><br />
<br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">configuration</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">name</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">fs.default.name</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">name</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">value</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">hdfs://localhost:9000</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">value</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">property</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<br />
&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">name</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">mapred.job.tracker</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">name</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">value</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">localhost:9001</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">value</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">property</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<br />
&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">name</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">dfs.data.dir</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">name</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">linux&nbsp;</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">&lt;value&gt;/home/lky/tools/java/hadoop-0.18.3/dfs&lt;/value&gt;</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">value</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">C:\\cygwin\\home\\lky\\tools\\java\\hadoop-0.18.3\\dfs\\</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">value</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">property</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<br />
<br />
&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">name</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">hadoop.tmp.dir</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">name</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">value</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">/tmp</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">value</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">property</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<br />
<br />
<br />
&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">name</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">dfs.replication</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">name</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">value</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">1</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">value</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">property</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<br />
<br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">name</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">fs.trash.interval</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">name</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">value</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">60</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">value</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">description</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">Number&nbsp;of&nbsp;minutes&nbsp;between&nbsp;trash&nbsp;checkpoints.<br />
&nbsp;&nbsp;If&nbsp;zero,&nbsp;the&nbsp;trash&nbsp;feature&nbsp;is&nbsp;disabled.<br />
&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">description</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">property</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;<br />
</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">configuration</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<br />
</span></div>
<img src ="http://www.blogjava.net/Skynet/aggbug/285919.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-07-08 11:07 <a href="http://www.blogjava.net/Skynet/archive/2009/07/08/285919.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>svn 简单使用</title><link>http://www.blogjava.net/Skynet/archive/2009/05/19/271570.html</link><dc:creator>刘凯毅</dc:creator><author>刘凯毅</author><pubDate>Tue, 19 May 2009 09:37:00 GMT</pubDate><guid>http://www.blogjava.net/Skynet/archive/2009/05/19/271570.html</guid><wfw:comment>http://www.blogjava.net/Skynet/comments/271570.html</wfw:comment><comments>http://www.blogjava.net/Skynet/archive/2009/05/19/271570.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Skynet/comments/commentRss/271570.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Skynet/services/trackbacks/271570.html</trackback:ping><description><![CDATA[<br />
<br />
svn 帮助文档，大体上浏览了下 一些比较好的特性 有：<br />
<strong><a href="http://www.subversion.org.cn/svnbook/" target="_blank">http://www.subversion.org.cn/<wbr>svnbook/</a></strong><br />
<br />
<br />
<span style="border-collapse: separate; color: #000000; font-family: arial; font-size: 16px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;"><a href="http://svn.branchmerge.html/" style="background-color: #c0c0ff; color: purple; text-decoration: underline;" target="_blank">分支与合并</a><br />
</span><span style="border-collapse: separate; color: #000000; font-family: arial; font-size: 16px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;"><a href="http://svn.advanced.locking.html/" style="color: purple; text-decoration: underline;" target="_blank">锁定</a></span><br />
<span style="border-collapse: separate; color: #000000; font-family: arial; font-size: 16px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;"><a href="http://svn.ref.svnsync.html/" style="background-color: #c0c0ff; color: purple; text-decoration: underline;" target="_blank"><span style="font-family: 'courier new',courier,fixed; font-style: normal; font-weight: normal;"><strong>svnsync</strong></span></a></span><br />
<span style="border-collapse: separate; color: #000000; font-family: arial; font-size: 16px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;"><a href="http://svn.ref.reposhooks.html/" style="background-color: #c0c0ff; color: blue; text-decoration: underline;" target="_blank">版本库钩子</a><br />
</span><span style="border-collapse: separate; color: #000000; font-family: arial; font-size: 16px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;"><a href="http://svn.developer.usingapi.html/#svn.developer.usingapi.otherlangs.ex-2" style="color: purple; text-decoration: underline;" target="_blank">一个SVN&nbsp; Python状态爬虫</a></span><br />
<br />
<br />
<strong style="color: #cc0000;">注意 使用用户 (sysmen)&nbsp; ：</strong><br />
<strong>#指定新版本</strong><br />
vim ~.bashrc #添加了<br />
alias svn="/usr/local/subversion/
<div id=":c6" class="ii gt"><wbr>bin/svn"<br />
alias svnadmin="/usr/local/<wbr>subversion/bin/svnadmin"<br />
alias svnserve="/usr/local/<wbr>subversion/bin/svnserve"<br />
<br />
<strong>#最简单 svn 服务器搭建</strong><br />
cd /home/sysman/src/svn/<br />
svnadmin create test<br />
svnserve -d -r /home/sysman/src/svn/test/<br />
<br />
<strong>#最简单配置</strong><br />
#vim svnserve.conf<br />
[general]<br />
password-db = passwd<br />
realm = test<br />
<br />
anon-access = <strong>read</strong><br />
auth-access = <strong>write</strong><br />
<br />
<br />
<br />
<strong>#查看 </strong><br />
cd /home/sysman/src/svn/testsrc<br />
svn <strong>list&nbsp; </strong>svn://<a href="http://127.0.0.1/test" target="_blank">127.0.0.1/test</a> <br />
<br />
<br />
<strong>#迁出</strong><br />
cd /home/sysman/src/svn/testsrc<br />
svn <strong>checkout&nbsp; </strong>svn://<a href="http://127.0.0.1/test" target="_blank">127.0.0.1/test</a><br />
<br />
<br />
<strong>#迁入</strong><br />
cd test <br />
echo "google - baidu " &gt; baidu<br />
svn <strong>add </strong>baidu svn://<a href="http://127.0.0.1/test" target="_blank">127.0.0.1/test</a> <br />
svn <strong>commit </strong>-m 'add ok'<br />
svn list&nbsp; svn://<a href="http://127.0.0.1/test" target="_blank">127.0.0.1/test</a> <br />
# baidu<br />
# tt<br />
<br />
<br />
#详细参考 ：<br />
<strong><a href="http://www.subversion.org.cn/svnbook/" target="_blank">http://www.subversion.org.cn/<wbr>svnbook/</a></strong><br />
在文档中有关有意思的介绍 （svnsync）：<br />
<strong><a href="http://www.subversion.org.cn/svnbook/1.4/svn.ref.svnsync.html" target="_blank">http://www.subversion.org.cn/<wbr>svnbook/1.4/svn.ref.svnsync.<wbr>html</a></strong><br />
<br />
<br />
其他说明 ：<br />
<br />
1.帮助<br />
svn help<br />
或 <br />
svn help add<br />
<br />
2.一般操作<br />
更新你的工作拷贝<br />
&nbsp;&nbsp;&nbsp; svn update<br />
<br />
做出修改<br />
&nbsp;&nbsp;&nbsp; svn add<br />
&nbsp;&nbsp;&nbsp; svn delete<br />
&nbsp;&nbsp;&nbsp; svn copy<br />
&nbsp;&nbsp;&nbsp; svn move<br />
<br />
检验修改<br />
&nbsp;&nbsp;&nbsp; svn status<br />
&nbsp;&nbsp;&nbsp; svn diff<br />
<br />
可能会取消一些修改<br />
&nbsp;&nbsp;&nbsp; svn revert<br />
<br />
解决冲突（合并别人的修改）<br />
&nbsp;&nbsp;&nbsp; svn update<br />
&nbsp;&nbsp;&nbsp; svn resolved<br />
<br />
提交你的修改<br />
&nbsp;&nbsp;&nbsp; svn commit<br />
<br />
<br />
</div>
<br />
<br />
<img src ="http://www.blogjava.net/Skynet/aggbug/271570.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-05-19 17:37 <a href="http://www.blogjava.net/Skynet/archive/2009/05/19/271570.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> soap (java,perl,要写代码 还不过 100 char) </title><link>http://www.blogjava.net/Skynet/archive/2009/03/02/257264.html</link><dc:creator>刘凯毅</dc:creator><author>刘凯毅</author><pubDate>Sun, 01 Mar 2009 16:00:00 GMT</pubDate><guid>http://www.blogjava.net/Skynet/archive/2009/03/02/257264.html</guid><wfw:comment>http://www.blogjava.net/Skynet/comments/257264.html</wfw:comment><comments>http://www.blogjava.net/Skynet/archive/2009/03/02/257264.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Skynet/comments/commentRss/257264.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Skynet/services/trackbacks/257264.html</trackback:ping><description><![CDATA[<br />
<strong>可能最简单的 soap </strong>哦！<br />
服务器为 java tomcat <br />
下载服务器：http://www.apache.org/dist/ws/<br />
&nbsp;&nbsp; <a href="http://www.apache.org/dist/ws/axis/">axis/</a>   为java <br />
&nbsp;&nbsp; <a href="http://www.apache.org/dist/ws/axis-c/">axis-c/</a>  &nbsp;&nbsp; 为 c <br />
<br />
1.我这下载的 axis 1_4 版本 ，解压 /webapps/axis&nbsp; 放到 tomcat 的webapps <br />
启动tomcat（这就不修改任何，如有需要 该 web.xml 等配置了）<a href="http://suaihuang.blog.163.com/blog/?clsId=fks_087067083084086071085086074064084081085065086081087&amp;class=#" style="font-size: 12px;" onclick="NEBlog.gPrevBlog.oBlogList._oUpdownMenu.openBlog('blog/static/307422712007552499407', event);return false;"> 参考 &gt;&gt;</a><br />
&nbsp;&nbsp;&nbsp; blog 主 还有很多介绍 axis 大家可以 看看<a hidefocus="true" href="http://suaihuang.blog.163.com/blog/" onclick="">&nbsp; 日志</a> &gt; 其下的 "学习" <br />
<br />
直接写个文件 <strong>HelloWorld.jws</strong> 放到 %TOMCAT_HOME%"webapps"axis
<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;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;HelloWorld&nbsp;{&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;String&nbsp;sayHello()&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">HELLO&nbsp;soap!</span><span style="color: #000000;">"</span><span style="color: #000000;">;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br />
}&nbsp; <br />
</span></div>
<br />
等不及 可以使用 看看<br />
http://127.0.0.1:8080/axis/HelloWorld.jws?method=sayHello<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;">&lt;</span><span style="color: #800000;">soapenv:Envelope</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">soapenv:Body</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">sayHelloResponse&nbsp;</span><span style="color: #ff0000;">soapenv:encodingStyle</span><span style="color: #0000ff;">="http://schemas.xmlsoap.org/soap/encoding/"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">sayHelloReturn&nbsp;</span><span style="color: #ff0000;">xsi:type</span><span style="color: #0000ff;">="xsd:string"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">HELLO&nbsp;soap!</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">sayHelloReturn</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">sayHelloResponse</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">soapenv:Body</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">soapenv:Envelope</span><span style="color: #0000ff;">&gt;</span></div>
<br />
<br />
客户段<br />
perl cpan &gt;&gt; install&nbsp; SOAP::Lite<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;">!perl&nbsp;-w</span><span style="color: #008000;"><br />
</span><span style="color: #0000ff;">use</span><span style="color: #000000;">&nbsp;SOAP</span><span style="color: #000000;">::</span><span style="color: #000000;">Lite;<br />
</span><span style="color: #0000ff;">print</span><span style="color: #000000;">&nbsp;SOAP</span><span style="color: #000000;">::</span><span style="color: #000000;">Lite<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">&nbsp;proxy(</span><span style="color: #000000; font-weight: bold;">'</span><span style="color: #000000; font-weight: bold;">http://127.0.0.1:8080/axis/HelloWorld.jws</span><span style="color: #000000; font-weight: bold;">'</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">&nbsp;uri(</span><span style="color: #000000; font-weight: bold;">'</span><span style="color: #000000; font-weight: bold;">http://127.0.0.1:8080/axis/HelloWorld.jws</span><span style="color: #000000; font-weight: bold;">'</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">&nbsp;sayHello()<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">&nbsp;result;<br />
</span></div>
结果： <span style="color: #000000;">HELLO&nbsp;soap！</span><br />
<br />
<br />
<br />
<br />
<img src ="http://www.blogjava.net/Skynet/aggbug/257264.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-03-02 00:00 <a href="http://www.blogjava.net/Skynet/archive/2009/03/02/257264.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>