??xml version="1.0" encoding="utf-8" standalone="yes"?>黄色在线观看网,日本中文字幕一区二区有码在线,日韩中文字幕第一页http://www.aygfsteel.com/Skynet/archive/2010/01/31/311426.html刘凯?/dc:creator>刘凯?/author>Sun, 31 Jan 2010 15:08:00 GMThttp://www.aygfsteel.com/Skynet/archive/2010/01/31/311426.htmlhttp://www.aygfsteel.com/Skynet/comments/311426.htmlhttp://www.aygfsteel.com/Skynet/archive/2010/01/31/311426.html#Feedback0http://www.aygfsteel.com/Skynet/comments/commentRss/311426.htmlhttp://www.aygfsteel.com/Skynet/services/trackbacks/311426.html

作?NetSeek  http://www.linuxtone.org (ITq维专家||集群架构|性能调优)
Ƣ迎转蝲,转蝲时请务必以超链接形式标明文章原始出处和作者信息及本声?
首发旉: 2008-11-25     更新旉:2009-1-14

??br /> 一?nbsp;       Nginx 基础知识
二?nbsp;       Nginx 安装及调?/em>
三?nbsp;       Nginx Rewrite
四?nbsp;       Nginx Redirect
五?nbsp;       Nginx 目录自动加斜U?
六?nbsp;       Nginx Location
七?nbsp;       Nginx expires
八?nbsp;       Nginx 防盗?/em>
九?nbsp;       Nginx 讉K控制
十?nbsp;       Nginx日志处理
十一?nbsp;    Nginx Cache
十二?nbsp;    Nginx负蝲均衡
十三?      Nginx单优?/em>      
十四?nbsp;       如何构徏高性能的LEMP环境
十五?nbsp;       Nginx服务监控
十六?nbsp;       常见问题与错误处?
十七?nbsp;       相关资源下蝲

【前a】:
~写此技术指南在于推q普及NGINX在国内的使用Q更方便的帮助大家了解和掌握NGINX的一些用技巧。本指南很多技巧来自于|络和工作中或网l上朋友们问我的问题.在此对网l上愿意分n的朋友们表示感谢和致意!Ƣ迎大家和我一起丰富本技术指南提出更好的Q请朋友们关? http://www.linuxtone.org 技术分享社? 互想学习共同q步!

一?Nginx 基础知识
1、简?br />    Nginx ("engine x") 是一个高性能?HTTP ?反向代理 服务器,也是一?IMAP/POP3/SMTP 代理服务器?Nginx 是由 Igor Sysoev Z|斯讉K量第二的 Rambler.ru 站点开发的Q它已经在该站点q行过两年半了。Igor 源代码以类BSD许可证的形式发布。尽还是测试版Q但是,Nginx 已经因ؓ它的E_性、丰富的功能集、示例配|文件和低系l资源的消耗而闻名了?br /> 更多的请见官方wiki: http://wiki.codemongers.com/

2?Nginx的优?br /> nginx做ؓHTTP服务器,有以下几基本特性:
1)        处理静态文Ӟ索引文g以及自动索引Q打开文g描述W缓Ԍ
2)        无缓存的反向代理加速,单的负蝲均衡和容错.
3)        FastCGIQ简单的负蝲均衡和容错.
4)        模块化的l构。包括gzipping, byte ranges, chunked responses, 以及 SSI-filter{filter。如果由FastCGI或其它代理服务器处理单页中存在的多个SSIQ则q项处理可以q行q行Q而不需要相互等待?/span>
5)        支持SSL ?TLS SNIQ?br />
Nginx专ؓ性能优化而开发,性能是其最重要的考量, 实现上非常注重效?。它支持内核Poll模型Q能l受高负载的考验, 有报告表明能支持高达 50,000 个ƈ发连接数?br /> Nginxh很高的稳定性。其它HTTP服务器,当遇到访问的峰|或者有人恶意发h速连接时Q也很可能会D服务器物理内存耗尽频繁交换Q失d应,只能重启服务器。例如当前apache一旦上?00个以上进E,web? 应速度明N常缓慢了。而Nginx采取了分阶段资源分配技术,使得它的CPU与内存占用率非常低。nginx官方表示保持10,000个没有活动的q? 接,它只?.5M内存Q所以类似DOSq样的攻dnginx来说基本上是毫无用处的。就E_性而言, nginx比lighthttpd更胜一{V?br /> Nginx支持热部|Ӏ它的启动特别容? q且几乎可以做到7*24不间断运行,即ɘq行C月也不需要重新启动。你q能够在不间断服务的情况下,对Y件版本进行进行升U?br /> Nginx采用master-slave模型, 能够充分利用SMP的优势,且能够减工作进E在盘I/O的阻塞gq。当采用select()/poll()调用Ӟq可以限制每个进E的q接数?br /> Nginx 代码质量非常高,代码很规范, 手法成熟Q?模块扩展也很Ҏ。特别值得一提的是强大的Upstream与Filter链? Upstream如reverse proxy, 与其他服务器通信模块的编写奠定了很好的基。而Filter链最L部分是各个filter不必{待前一个filter执行完毕。它可以把前一? filter的输出做为当前filter的输入,q有点像Unix的管Uѝ这意味着Q一个模块可以开始压~从后端服务器发送过来的hQ且可以在模块接? 完后端服务器的整个请求之前把压羃{向客L?br /> Nginx采用了一些os提供的最新特性如对sendfile (Linux 2.2+)Qaccept-filter (FreeBSD 4.1+)QTCP_DEFER_ACCEPT (Linux 2.4+) 的支持,从而大大提高了性能

二?Nginx 安装及调?/strong>
1、Pcre 安装

  1. ./configure
  2.   make && make install
  3.   cd ../
复制代码

2.        nginx ~译安装

  1. ./configure --user=www --group=www --prefix=/usr/local/nginx/ --with-http_stub_status_module --with-openssl=/usr/local/openssl
  2. make && make install
复制代码

更详l的模块定制与安装请参照官方wiki.

3、Nginx 配置文g试Q?/p>

  1. # /usr/local/nginx/sbin/nginx -t  //Debug 配置文g的关键命令需要重Ҏ?
  2. 2008/12/16 09:08:35 [info] 28412#0: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
  3. 2008/12/16 09:08:35 [info] 28412#0: the configuration file /usr/local/nginx/conf/nginx.conf was tested successfully
复制代码

3、Nginx 启动Q?/p>

  1. # /usr/local/nginx/sbin/nginx
复制代码

4、Nginx 配置文g修改重新加蝲Q?/p>

  1. # kill -HUP `cat /usr/local/nginx/logs/nginx.pid
复制代码

`
三、Nginx Rewrite

1.  Nginx Rewrite 基本标记(flags)
last - 基本上都用这个Flag?/em>
ȝ当于Apache里的[L]标记Q表C完成rewriteQ不再匹配后面的规则
break - 中止RewirteQ不再l匹?/em>
redirect - q回临时重定向的HTTP状?02
permanent - q回怹重定向的HTTP状?01
      d有的url支持正则  重写的url不支持正?/strong>

2.  正则表达式匹配,其中Q?br />     * ~         为区分大写匚w
    * ~*       Z区分大小写匹?/em>
    * !~?~*   分别为区分大写不匹配及不区分大写不匹?/em>

3. 文g及目录匹配,其中Q?br />    * -f?-f用来判断是否存在文g
    * -d?-d用来判断是否存在目录
    * -e?-e用来判断是否存在文g或目?/em>
    * -x?-x用来判断文g是否可执?/em>


3.  Nginx 的一些可用的全局变量Q可用做条g判断Q?/p>

  1. $args
  2. $content_length
  3. $content_type
  4. $document_root
  5. $document_uri
  6. $host
  7. $http_user_agent
  8. $http_cookie
  9. $limit_rate
  10. $request_body_file
  11. $request_method
  12. $remote_addr
  13. $remote_port
  14. $remote_user
  15. $request_filename
  16. $request_uri
  17. $query_string
  18. $scheme
  19. $server_protocol
  20. $server_addr
  21. $server_name
  22. $server_port
  23. $uri
复制代码

四?Nginx Redirect
所有linuxtone.org与netseek.linuxtone.org域名全部自蟩转到http://www.linuxtone.org

  1. server
  2. {
  3. listen 80;
  4. server_name linuxtone.org netseek.linuxtone.org;
  5. index index.html index.php;
  6. root /data/www/wwwroot;
  7. if ($host !~ "^www.linxtone.org$") {
  8. rewrite ^(.*) http://www.linuxtone.org$1 redirect;
  9. }
  10. ........................
  11. }
复制代码

五?Nginx 目录自动加斜U?

  1. if (-d $request_filename){
  2.            rewrite ^/(.*)([^/])$ http://$host/$1$2/ permanent;
  3.      }
复制代码

?nbsp; Nginx Location

1Q基本语?[和上面rewrite正则匚w语法基本一致]
location [=|~|~*|^~] /uri/ { … }
    * ~  为区分大写匚w
    * ~* Z区分大小写匹?/em>
    * !~?~*分别为区分大写不匹配及不区分大写不匹?/em>

CZ1:
location = / {
# matches the query / only.
# 只匹?/ 查询?/em>
}
匚wM查询Q因为所有请求都?/ 开头。但是正则表辑ּ规则和长的块规则被优先和查询匹?/strong>

CZ2:
location ^~ /images/ {
# matches any query beginning with /images/ and halts searching,
# so regular expressions will not be checked.
# 匚wM?/images/ 开头的M查询q且停止搜烦。Q何正则表辑ּ不会被试?br />
CZ3:
location ~* .(gif|jpg|jpeg)$ {
# matches any request ending in gif, jpg, or jpeg. However, all
# requests to the /images/ directory will be handled by
}
# 匚wM?gif、jpg ?jpeg l尾的请求?/strong>


七?Nginx expires

1Q根据文件类型expires

  1. # Add expires header for static content
  2. location ~* .(js|css|jpg|jpeg|gif|png|swf)$ {
  3.     if (-f $request_filename) {
  4.        root /data/www/wwwroot/bbs;
  5.        expires      1d;
  6.        break;
  7.     }
  8. }
复制代码

2、根据判断某个目?/p>

  1. # serve static files
  2. location ~ ^/(images|javascript|js|css|flash|media|static)/  {
  3. root    /data/www/wwwroot/down;
  4.         expires 30d;
  5.   }
复制代码

八?nbsp; Nginx 防盗?/strong>

1.        针对不同的文件类?/p>

  1. #Preventing hot linking of images and other file types
  2. location ~* ^.+.(gif|jpg|png|swf|flv|rar|zip)$ {
  3.         valid_referers none blocked server_names *.linuxtone.org linuxtone.org http://localhost baidu.com;
  4. if ($invalid_referer) {
  5.       rewrite   ^/   ;
  6.      # return   403;
  7.       }
  8. }
复制代码

2.        针对不同的目?/p>

  1. location /img/ {
  2.     root /data/www/wwwroot/bbs/img/;
  3.     valid_referers none blocked server_names *.linuxtone.org http://localhost baidu.com;
  4.     if ($invalid_referer) {
  5.                    rewrite  ^/  ;
  6.                    #return   403;
  7.     }
  8. }
复制代码

3.        同实现防盗链和expires的方?/p>

  1. #Preventing hot linking of images and other file types
  2. location ~* ^.+.(gif|jpg|png|swf|flv|rar|zip)$ {
  3.         valid_referers none blocked server_names *.linuxtone.org linuxtone.org http://localhost ;
  4. if ($invalid_referer) {
  5.       rewrite   ^/   ;
  6.                      }
  7.      access_log off;
  8.      root /data/www/wwwroot/bbs;
  9. expires 1d;
  10.      break;
  11. }
复制代码

九?Nginx 讉K控制

1.        Nginx w䆾证验?/p>

  1. #cd /usr/local/nginx/conf
  2. #mkdir htpasswd
  3. /usr/local/apache2/bin/htpasswd -c /usr/local/nginx/conf/htpasswd/tongji linuxtone
  4. #d用户名ؓlinuxtone
  5. New password:   (此处输入你的密码)
  6. Re-type new password:   (再次输入你的密码)
  7. Adding password for user
  8. http://count.linuxtone.org/tongji/data/index.html(目录存在/data/www/wwwroot/tongji/data/目录?
  9. 下D配|放到虚拟主机目录,当访问http://count.linuxtone/tongji/xC密验?
  10. location ~ ^/(tongji)/  {
  11.                 root    /data/www/wwwroot/count;
  12.                         auth_basic              "LT-COUNT-TongJi";
  13.                         auth_basic_user_file  /usr/local/nginx/conf/htpasswd/tongji;
  14.                 }
复制代码

2.        Nginx 止讉K某类型的文g.
如,Nginx下禁止访?.txt文gQ配|方法如?

  1. location ~* .(txt|doc)$ {
  2.    if (-f $request_filename) {
  3.    root /data/www/wwwroot/linuxtone/test;
  4.    #rewrite …..可以重定向到某个URL
  5.    break;
  6.    }
  7. }
复制代码

Ҏ2:

  1. location ~* .(txt|doc)${
  2.         root /data/www/wwwroot/linuxtone/test;
  3.         deny all;
  4. }
复制代码

实例:
止讉K某个目录

  1. location ~ ^/(WEB-INF)/ {
  2.             deny all;
  3. }  
复制代码

3.        使用ngx_http_access_module限制ip讉K

  1. location / {
  2.     deny    192.168.1.1;
  3.     allow   192.168.1.0/24;
  4.     allow   10.1.1.0/16;
  5.     deny    all;
  6. }
复制代码

详细参见wiki: http://wiki.codemongers.com/NginxHttpAccessModule#allow

4.        Nginx 下蝲限制q发和速率

  1. limit_zone   linuxtone  $binary_remote_addr  10m;
  2. server
  3.        {
  4.                listen       80;
  5.                server_name  down.linuxotne.org;
  6.                index index.html index.htm index.php;
  7.                root   /data/www/wwwroot/down;
  8.                #Zone limit
  9.                location / {
  10.                    limit_conn   linuxtone  1;
  11.                    limit_rate  20k;
  12.                }
  13. ..........
  14.        }
复制代码

只允许客房端一个线E?每个U程20k.
【注?span style="color: #008000;">limit_zone   linuxtone  $binary_remote_addr  10m; q个可以定义在主?/span>


5.        Nginx 实现Apache一L录列?/p>

  1. location  /  {
  2.     autoindex  on;
  3. }
复制代码

6.        上文件大限?br /> 主配|文仉加入如下Q具体大根据你自己的业务做调整?br /> client_max_body_size 10m;                                                         

十?nbsp;       Nginx 日志处理

1.Nginx 日志切割
#contab -e
59 23 * * * /usr/local/sbin/logcron.sh /dev/null 2>&1
[root@count ~]# cat /usr/local/sbin/logcron.sh

  1. #!/bin/bash
  2. log_dir="/data/logs"
  3. time=`date +%Y%m%d`  
  4. /bin/mv  ${log_dir}/access_linuxtone.org.log ${log_dir}/access_count.linuxtone.org.$time.log
  5. kill -USR1 `cat  /var/run/nginx.pid`
复制代码

更多的日志分析与处理关?同时Ƣ迎你参加讨?:http://bbs.linuxtone.org/forum-8-1.html

2.利用AWSTATS分析NGINX日志
  讄好Nginx日志格式,仍后利用awstatsq行分析.
请参? http://bbs.linuxtone.org/thread-56-1-1.html

3.        Nginx 如何不记录部分日?br /> 日志太多Q每天好几个GQ少记录一些,下面的配|写到server{}D中可以了
location ~ .*.(js|jpg|JPG|jpeg|JPEG|css|bmp|gif|GIF)$
{
     access_log off;
}

十一、Nginx Cache服务配置

如果需要将文g~存到本圎ͼ则需要增加如下几个子参数Q?/p>

  1. proxy_store on;
  2. proxy_store_access user:rw group:rw all:rw;
  3. proxy_temp_path ~存目录;
复制代码

其中Q?br /> proxy_store on用来启用~存到本地的功能Q?br /> proxy_temp_path用来指定~存在哪个目录下Q如Qproxy_temp_path html;

在经q上一步配|之后,虽然文g被缓存到了本地磁盘上Q但每次h仍会向远端拉取文ӞZ避免去远端拉取文Ӟ必须修改

  1. proxy_passQ?/li>
  2. if ( !-e $request_filename) {
  3.     proxy_pass  http://mysvr;
  4. }
复制代码

x成有条g地去执行proxy_passQ这个条件就是当h的文件在本地的proxy_temp_path指定的目录下不存在时Q再向后端拉取?br />
   
更多更高U的应用可以研究ncache,详细请参?a target="_blank">http://bbs.linuxtone.org 里ncache相关的脓?

十二、Nginx 负蝲均衡
1. Nginx 负蝲均衡基础知识
nginx的upstream目前支持4U方式的分配
1)、轮询(默认Q?/span>
每个h按时间顺序逐一分配C同的后端服务器,如果后端服务器down掉,能自动剔除?/span>
2)、weight
指定轮询几率Qweight和访问比率成正比Q用于后端服务器性能不均的情c?/span>
2)、ip_hash
每个h按访问ip的hashl果分配Q这h个访客固定访问一个后端服务器Q可以解决session的问题?/span>
3)、fairQ第三方Q?/span>
按后端服务器的响应时间来分配hQ响应时间短的优先分配?
4)、url_hashQ第三方Q?/span>

2.        Nginx 负蝲均衡实例1

  1. upstream bbs.linuxtone.org {#定义负蝲均衡讑֤的Ip及设备状?/li>
  2.     server 127.0.0.1:9090 down;
  3.     server 127.0.0.1:8080 weight=2;
  4.     server 127.0.0.1:6060;
  5.     server 127.0.0.1:7070 backup;
  6. }
复制代码

在需要用负载均衡的server中增?br /> proxy_pass http://bbs.linuxtone.org/;

每个讑֤的状态设|ؓ:
a)        down 表示单前的server暂时不参与负?/span>
b)        weight 默认?.weight大Q负载的权重p大?/span>
c)        max_fails Q允许请求失败的ơ数默认?.当超q最大次数时Q返回proxy_next_upstream 模块定义的错?/span>
d)        fail_timeout:max_failsơ失败后Q暂停的旉?/span>
e)        backupQ?其它所有的非backup机器down或者忙的时候,hbackup机器。所以这台机器压力会最轅R?/span>

nginx支持同时讄多组的负载均衡,用来l不用的server来用?br />
client_body_in_file_only 讄为On 可以讲client postq来的数据记录到文g中用来做debug
client_body_temp_path 讄记录文g的目?可以讄最?层目?br /> location 对URLq行匚w.可以q行重定向或者进行新的代?负蝲均衡


3.        Nginx 负蝲均衡实例 2
按访问url的hashl果来分配请求,使每个url定向到同一个后端服务器Q后端服务器为缓存时比较有效,也可以用作提高Squid~存命中?

单的负蝲均等实例:
#vi nginx.conf  //nginx主配|文件核心配|?/p>

  1. ……….
  2. #loadblance my.linuxtone.org
  3.        upstream  my.linuxtone.org  {
  4.        ip_hash;
  5.        server   127.0.0.1:8080;
  6.        server   192.168.169.136:8080;
  7.        server   219.101.75.138:8080;
  8.        server   192.168.169.117;
  9.        server   192.168.169.118;
  10.        server   192.168.169.119;
  11.      }
  12. …………..
  13. include          vhosts/linuxtone_lb.conf;
  14. ………
  15. # vi proxy.conf
  16. proxy_redirect off;
  17. proxy_set_header Host $host;
  18. proxy_set_header X-Real-IP $remote_addr;
  19. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  20. client_max_body_size 50m;
  21. client_body_buffer_size 256k;
  22. proxy_connect_timeout 30;
  23. proxy_send_timeout 30;
  24. proxy_read_timeout 60;
  25. proxy_buffer_size 4k;
  26. proxy_buffers 4 32k;
  27. proxy_busy_buffers_size 64k;
  28. proxy_temp_file_write_size 64k;
  29. proxy_next_upstream error timeout invalid_header http_500 http_503 http_404;
  30. proxy_max_temp_file_size 128m;
  31. proxy_store on;
  32. proxy_store_access   user:rw  group:rw  all:r;
  33. #nginx cache               
  34. #client_body_temp_path  /data/nginx_cache/client_body 1 2;
  35. proxy_temp_path /data/nginx_cache/proxy_temp 1 2;
复制代码

#vi  linuxtone_lb.conf

  1. server
  2.     {
  3.         listen  80;
  4.         server_name my.linuxtone.org;
  5.         index index.php;
  6.         root /data/www/wwwroot/mylinuxtone;
  7.         if (-f $request_filename) {
  8.             break;
  9.            }
  10.         if (-f $request_filename/index.php) {
  11.           rewrite (.*) $1/index.php break;
  12.         }
  13.         error_page 403 http://my.linuxtone.org/member.php?m=user&a=login;
  14.         location / {
  15.            if ( !-e $request_filename) {
  16.                proxy_pass http://my.linuxtone.org;
  17.                break;
  18.            }
  19.            include /usr/local/nginx/conf/proxy.conf;
  20.         }
  21. }
复制代码



十三、Nginx单优?/strong>

1.        减小nginx~译后的文g大小 (Reduce file size of nginx)
默认的nginx~译选项里居然是用debug模式(-g)的(debug模式会插入很多跟t和ASSERT之类Q,~译以后一个nginx有好几兆。去掉nginx的debug模式~译Q编译以后只有几百K
?auto/cc/gccQ最后几行有Q?br /> # debug

  1. CFLAGS=”$CFLAGS -g”
复制代码

注释掉或删掉q几行,重新~译卛_?br />
2.        修改Nginx的header伪装服务?br /> 1)        修改nginx.h

  1. #vi nginx-0.7.30/src/core/nginx.h
  2. #define NGINX_VERSION      "1.8"
  3. #define NGINX_VER          "LTWS/" NGINX_VERSION
  4. #define NGINX_VAR          "NGINX"
  5. #define NGX_OLDPID_EXT     ".oldbin"
复制代码

2) 修改nginx_http_header_filter_module
#vi nginx-0.7.30/src/http/ngx_http_header_filter_module.c
如?/p>

  1. static char ngx_http_server_string[] = "Server: nginx" CRLF;
复制代码

修改?/p>

  1. static char ngx_http_server_string[] = "Server: LTWS" CRLF;
复制代码

a)        修改nginx_http_header_filter_module
#vi nginx-0.7.30/src/http/ngx_http_special_response.c
如下:

  1. static u_char ngx_http_error_full_tail[] =
  2. "<hr><center>" NGINX_VER "</center>" CRLF
  3. "</body>" CRLF
  4. "</html>" CRLF
  5. ;
复制代码
  1. static u_char ngx_http_error_tail[] =
  2. "<hr><center>nginx</center>" CRLF
  3. "</body>" CRLF
  4. "</html>" CRLF
  5. ;
复制代码

修改?

  1. static u_char ngx_http_error_full_tail[] =
  2. "<center> "NGINX_VER" </center>" CRLF
  3. "<hr><center>http://www.linuxtone.org</center>" CRLF
  4. "</body>" CRLF
  5. "</html>" CRLF
  6. ;
  7. static u_char ngx_http_error_tail[] =
  8. "<hr><center>LTWS</center>" CRLF
  9. "</body>" CRLF
  10. "</html>" CRLF
  11. ;
复制代码

修改后重新编译一下环?
404错误的时候显C效果图Q如果没有指定错误页的话Q:
404.png

利用curl命o查看服务器header
curl.png



 

3.为特定的CPU指定CPUcd~译优化.
默认nginx使用的GCC~译参数?O
需要更加优化可以用以下两个参?br /> --with-cc-opt='-O3'
--with-cpu-opt=opteron
使得~译针对特定CPU以及增加GCC的优?
此方法仅Ҏ能有所改善q不会有很大的性能提升Q供朋友们参?
CPUDcd定: # cat /proc/cpuinfo | grep "model name"
~译优化参数参考:http://en.gentoo-wiki.com/wiki/Safe_Cflags


4.Tcmalloc优化Nginx 性能

  1. # wget http://download.savannah.gnu.org/releases/libunwind/libunwind-0.99-alpha.tar.gz
  2. # tar zxvf libunwind-0.99-alpha.tar.gz
  3. # cd libunwind-0.99-alpha/
  4. # CFLAGS=-fPIC ./configure
  5. # make CFLAGS=-fPIC
  6. # make CFLAGS=-fPIC install
  7. # wget http://google-perftools.googlecode.com/files/google-perftools-0.98.tar.gz
  8. # tar zxvf google-perftools-0.98.tar.gz
  9. # cd google-perftools-0.98/
  10. # ./configure
  11. # make && make install
  12. # echo "/usr/local/lib" > /etc/ld.so.conf.d/usr_local_lib.conf
  13. # ldconfig
  14. # lsof -n | grep tcmalloc
复制代码

~译nginx 加蝲google_perftools_module:
./configure --with-google_perftools_module
在主配置文g加入nginx.conf d:
google_perftools_profiles /path/to/profile;

5.内核参数优化
# vi /etc/sysctl.conf   #在末֢加以下内容:

  1. net.ipv4.tcp_fin_timeout = 30
  2. net.ipv4.tcp_keepalive_time = 300
  3. net.ipv4.tcp_syncookies = 1
  4. net.ipv4.tcp_tw_reuse = 1
  5. net.ipv4.tcp_tw_recycle = 1
  6. net.ipv4.ip_local_port_range = 5000 65000
复制代码

#佉K|立即生?br /> /sbin/sysctl -p

十四、如何构建高性的LEMP
请参? http://www.linuxtone.org/lemp/lemp.pdf
1、提供完整的配置脚本下蝲Q?a target="_blank">http://www.linuxtone.org/lemp/scripts.tar.gz
2、提供NGINX常见配置范例?虚拟LQ防盗链QRewrite,讉K控制Q负载均?br /> Discuz相关E序静态化及等{?,你只要稍E修改即可线上应用?3、将原版的xcache替换成EAQƈ提供相关单调优脚本及配置文g?br /> 更多的及更新资料请关? http://www.linuxtone.org

十五、Nginx监控
1?nbsp;       RRDTOOL+Perl脚本d监控
先安装好rrdtool Q关于rrdtool本文不作介绍Q具体安装请参照linuxtone监控版块.
#cd /usr/local/sbnin
#wget http://blog.kovyrin.net/files/mrtg/rrd_nginx.pl.txt
#mv rrd_nginx.pl.txt rrd_nginx.pl
#chmod a+x rrd_nginx.pl

#vi rrd_nginx.pl   //配置脚本文g讄好\?br /> #!/usr/bin/perl
use RRDs;
use LWP::UserAgent;

# define location of rrdtool databases
my $rrd = '/data/www/wwwroot/nginx/rrd';
# define location of images
my $img = '/data/www/wwwroot/nginx/html';
# define your nginx stats URL
my $URL = "http://219.232.244.13/nginx_status";
…………
【注】根据自己具体的状况修改相应的\?
#crontab –e //加入如下
* * * * * /usr/local/sbin/rrd_nginx.pl
重启crond后,通过配置nginx虚拟L指到/data/www/wwwroot/nginx/html目录Q通过crond自动执行perl脚本会生成很多图?
http://xxx/connections-day.png卛_看到服务器状态图?br />
2?nbsp;       官方Nginx-rrd 监控服务Q多虚拟LQ(推荐Q?br /> |址Q?a target="_blank">http://www.nginx.eu/nginx-rrd.html
此解x案其实是Z上述监控Ҏ的一个改q和增强Q同样先安装好rrdtoolq个d工具和相应的perl模块再做如下操作Q?br /> # yum install perl-HTML*
先徏立好生成的库存和囄存放?/p>

  1. #mkdir -p /data/www/wwwroot/nginx/{rrd,html}
  2. #cd /usr/local/sbin
  3. #wget http://www.nginx.eu/nginx-rrd/nginx-rrd-0.1.4.tgz
  4. #tar zxvf nginx-rrd-0.1.4.tgz
  5. #cd nginx-rrd-0.1.4
  6. #cd etc/
  7. #cp nginx-rrd.conf /etc
  8. #cd etc/cron.d
  9. #cp nginx-rrd.cron /etc/cron.d
  10. #cd /usr/local/src/nginx-rrd-0.1.4/html
  11. # cp index.php /data/www/wwwroot/nginx/html/
  12. #cd /usr/local/src/nginx-rrd-0.1.4/usr/sbin
  13. #cp * /usr/sbin/
复制代码

#vi /etc/nginx-rrd.conf

  1. #####################################################
  2. #
  3. # dir where rrd databases are stored
  4. RRD_DIR="/data/www/wwwroot/nginx/rrd";
  5. # dir where png images are presented
  6. WWW_DIR="/data/www/wwwroot/nginx/html";
  7. # process nice level
  8. NICE_LEVEL="-19";
  9. # bin dir
  10. BIN_DIR="/usr/sbin";
  11. # servers to test
  12. # server_utl;server_name
  13. SERVERS_URL="http://219.32.205.13/nginx_status;219.32.205.13  http://www.linuxtone.org/nginx_status;www.linuxtone.org""
复制代码

//Ҏ你的具体情况做调?
SEVERS_URL 格式 http://domain1/nginx_status;domain1 http://domain2/nginx_status;domain2
q种格式监控多虚拟主接状态:
重点启crond服务Q仍后通过http://219.32.205.13/nginx/html/ 卛_讉K。配|过E很单!

3?nbsp;       CACTI模板监控Nginx
利用Nginx_status状态来d实现CACTI监控
nginx~译时允许http_stub_status_module

# vi /usr/local/nginx/conf/nginx.conf

  1. location /nginx_status {
  2. stub_status on;
  3. access_log off;
  4. allow 192.168.1.37;
  5. deny all;
  6. }
复制代码
  1. # kill -HUP `cat /usr/local/nginx/logs/nginx.pid`
  2. # wget http://forums.cacti.net/download.php?id=12676
  3. # tar xvfz cacti-nginx.tar.gz
  4. # cp cacti-nginx/get_nginx_socket_status.pl /data/cacti/scripts/
  5. # cp cacti-nginx/get_nginx_clients_status.pl /data/cacti/scripts/
  6. # chmod 755 /data/cacti/scripts/get_nginx*
复制代码

插?/p>

  1. # /data/cacti/scripts/get_nginx_clients_status.pl http://192.168.1.37/nginx_status
复制代码

在cacti理面板导入
cacti_graph_template_nginx_clients_stat.xml
cacti_graph_template_nginx_sockets_stat.xml

十六、常见问题与错误处理
1?00 bad request错误的原因和解决办法
配置nginx.conf相关讄如下.
client_header_buffer_size 16k;
large_client_header_buffers 4 64k;
Ҏ具体情况调整Q一般适当调整值就可以?br />
2、Nginx 502 Bad Gateway错误
proxy_next_upstream error timeout invalid_header http_500 http_503;
或者尝试设|?
large_client_header_buffers 4 32k;


3、Nginx出现?13 Request Entity Too Large错误
q个错误一般在上传文g的时候会出现Q?br /> ~辑Nginx主配|文件Nginx.confQ找到http{}D,d
client_max_body_size 10m; //讄多大Ҏ自己的需求作调整.
如果q行php的话q个大小client_max_body_size要和php.ini中的如下值的最大g致或者稍大,q样׃会因为提交数据大不一致出现的错误?br /> post_max_size = 10M
upload_max_filesize = 2M

4、解?04 Gateway Time-out(nginx)
遇到q个问题是在升discuz论坛的时候遇到的
一般看? q种情况可能是由于nginx默认的fastcgiq程响应的缓冲区太小造成? q将Dfastcgiq程被挂? 如果你的fastcgi服务对这个挂起处理的不好, 那么最后就极有可能D504 Gateway Time-out
现在的网? 其某些论坛有大量的回复和很多内容的, 一个页面甚x几百K?br /> 默认的fastcgiq程响应的缓冲区?K, 我们可以讄大点
在nginx.conf? 加入Q?fastcgi_buffers 8 128k
q表C|fastcgi~冲Zؓ8×128k
当然如果您在q行某一即时的操作, 可能需要nginx的超时参数调大点Q例如设|成60U:send_timeout 60;
只是调整了这两个参数, l果是没有再显C那个超? 可以说效果不? 但是也可能是׃其他的原? 目前关于nginx的资料不是很? 很多事情都需要长期的l验累计才有l果, 期待您的发现?

5、如何用Nginx Proxy
朋友一台服务器q行tomcat ?080端口,IP:192.168.1.2:8080,另一台机器IP:192.168.1.8. 朋友想通过讉Khttp://192.168.1.8卛_讉Ktomcat服务.配置如下:
?92.168.1.8的nginx.conf上配|如?

  1. server {
  2. listen 80;
  3. server_name java.linuxtone.org
  4. location / {
  5. proxy_pass http://192.168.1.2:8080;
  6. include /usr/local/nginx/conf/proxy.conf;
  7. }
  8. }
复制代码

6、如何关闭Nginx的LOG
access_log /dev/null; error_log /dev/null;

十七、相兌源下?/strong>

1.nginx配置CZ及脚本下?
# wget http://www.linuxtone.org/lemp/scripts.tar.gz #此脚本范例定期更?


相关话题 Q?a >查看更多Q?a >知识库搜?/a>Q?/strong>

其中以下q项挺值得留意的?br /> Tcmalloc 不单可用?Mysql 的优化,q能应用?Nginx
虽说 Nginx 本n的性能跟系l占用已l做到很优秀?/p>

4.Tcmalloc优化Nginx 性能

  1. # wget http://download.savannah.gnu.org/releases/libunwind/libunwind-0.99-alpha.tar.gz
  2. # tar zxvf libunwind-0.99-alpha.tar.gz
  3. # cd libunwind-0.99-alpha/
  4. # CFLAGS=-fPIC ./configure
  5. # make CFLAGS=-fPIC
  6. # make CFLAGS=-fPIC install
  7. # wget http://google-perftools.googlecode.com/files/google-perftools-0.98.tar.gz
  8. # tar zxvf google-perftools-0.98.tar.gz
  9. # cd google-perftools-0.98/
  10. # ./configure
  11. # make && make install
  12. # echo "/usr/local/lib" > /etc/ld.so.conf.d/usr_local_lib.conf
  13. # ldconfig
  14. # lsof -n | grep tcmalloc






]]>
libevent 学习W记http://www.aygfsteel.com/Skynet/archive/2010/01/05/308249.html刘凯?/dc:creator>刘凯?/author>Tue, 05 Jan 2010 03:21:00 GMThttp://www.aygfsteel.com/Skynet/archive/2010/01/05/308249.htmlhttp://www.aygfsteel.com/Skynet/comments/308249.htmlhttp://www.aygfsteel.com/Skynet/archive/2010/01/05/308249.html#Feedback0http://www.aygfsteel.com/Skynet/comments/commentRss/308249.htmlhttp://www.aygfsteel.com/Skynet/services/trackbacks/308249.html 学习Q?br /> http://blog.chinaunix.net/u1/59571/showart_2077664.html

个h对上面文章做?W记׃n出来 和大家分享!




]]>
beanstalkd 消息队列的第一手资?/title><link>http://www.aygfsteel.com/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.aygfsteel.com/Skynet/archive/2009/10/30/300325.html</guid><wfw:comment>http://www.aygfsteel.com/Skynet/comments/300325.html</wfw:comment><comments>http://www.aygfsteel.com/Skynet/archive/2009/10/30/300325.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/Skynet/comments/commentRss/300325.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/Skynet/services/trackbacks/300325.html</trackback:ping><description><![CDATA[<br /> beanstalk 消息队列 结 <br /> 协议说明和各状态{换情?br /> <br /> <br /> <strong>基本知识?</strong><br />   1. 对于beanstalk 消息队列中每条数据都?job<br />   2. beanstalk service?Q会l护 tubes[多个道]<br />   3. client端可以监?使用?tube<br />   4. client端可以指?use 道[ client生成一个新的job时会把此job提交?指定道]<br />   5. client端可以指?watch 道 [ client接收处理job时会?指定道得到待处理的job]<br /> <br /> <br /> <strong>官方C意?</strong><br /> put            reserve               delete<br /> -----> [READY] ---------> [RESERVED] --------> *poof*<br /> <br /> <strong>一般情?</strong><br /> 1. d提交到service?job 理攑օ内存I间qؓ其标记状?[READY] <br /> 2. client通过轮训竞争得到ơ状? job 改ؓ  [RESERVED]<br />    2.1 当在默认旉 120 U内没处理完 , job.stats.timeouts ׃大于 0 <br />       同时其他 轮训竞争client会拿到这个job?注意?每次timeouts?在轮训的客户端就会得到次jobQ状态都?ready,timeouts>0 ?br /> 3. 随便其中一台client处理?job.delete   , 其他 client 中的此job 都会    *poof*  <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,q且在其他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  *poof*<br /> client2 job.stats  *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 /> 官方C意?<br />   <img src="http://www.aygfsteel.com/images/blogjava_net/skynet/beanstalk.jpg" alt="" border="0" /><br /> <br /> <br /> <strong>先简单说明下Q完全自q解的Q欢q拍砖。本人E人太差~看官档费Ԍ谅解下): </strong><br /> job.stats状?= [READY] 待处?  [RESERVED] 正处? [DELAYED]延迟状?,  [BURIED] 隐藏状?br /> <br /> <strong>1. 延迟提交</strong><br /> py.client1.put>>> beanstalk.put('yes!', delay=10)<br /> py.client3.reserve>>> job = beanstalk.reserve()<br /> # {待 10  U?br /> <br /> <strong>2. 道试</strong><br /> put-job到service?可以指定 put的tube道<br /> ? <br /> <br /> py.client1.put>>> beanstalk.use('foo') <br /> py.client1.put>>> beanstalk.put('hey!')<br /> <br /> py.client2.reserve>>> job = beanstalk.reserve()<br /> # 一直拥塞,应ؓ ?watch 道 'default'<br /> <br /> py.client3.reserve>>> beanstalk.watch('foo')<br /> # beanstalk.ignore('bar') 攑ּ监听 bar<br /> py.client3.reserve>>> job = beanstalk.reserve()<br /> py.client3.reserve>>> job.body #输出 'hey!' <br /> <br /> <br /> <br /> <strong>3. 隐藏状?现在?client 1/2/3 ?use watch 的管道都调回 default</strong><br /> py.client2.reserve>>> job = beanstalk.reserve()<br /> py.client3.reserve>>> job = beanstalk.reserve()<br /> py.client1.put>>> beanstalk.put('隐藏状?')<br /> py.client2.reserve>>> job.bury() #2 轮训得到 q且 修改 job 为隐藏状?br /> # 120 U后 client3 没有轮训得到 此job <br /> py.client2.reserve>>> 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>>> beanstalk.kick( job.stats()['id'] ) #修改状态ؓ reserved<br /> # 立刻 client3 得到 job<br /> py.client3.reserve>>> 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 /> # q时?client2 / 3 同时 ?job 11 状?'buries': 1,'timeouts': 0,'state': 'reserved'<br /> <br /> <strong>4. peek H见</strong><br />   可以得到 一?stats - read ?job Q其?client 可以 job = beanstalk.reserve() <br />   后马?job.stats 会变?nbsp; [RESERVED] <br />   py.client2.reserve>>> job = beanstalk.peek_ready()<br />   取得 job q看 ?client ?处理?br /> >>> job = beanstalk.peek(3)<br /> >>> job.body<br />     'yes!'<br /> >>> job.stats()['state']<br />     'ready'<br /> q种形式?job 不能 bury {修改状态,?可以 delete<br /> <br /> peek pȝ<br />  peek_buried<br />  peek_ready<br /> <br /> <br /> <br /> <br /> <br /> <br /> <br /> <br /> <img src ="http://www.aygfsteel.com/Skynet/aggbug/300325.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/Skynet/" target="_blank">刘凯?/a> 2009-10-30 12:05 <a href="http://www.aygfsteel.com/Skynet/archive/2009/10/30/300325.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>消息队列 beanstalkd 介绍http://www.aygfsteel.com/Skynet/archive/2009/10/28/300097.html刘凯?/dc:creator>刘凯?/author>Wed, 28 Oct 2009 11:21:00 GMThttp://www.aygfsteel.com/Skynet/archive/2009/10/28/300097.htmlhttp://www.aygfsteel.com/Skynet/comments/300097.htmlhttp://www.aygfsteel.com/Skynet/archive/2009/10/28/300097.html#Feedback0http://www.aygfsteel.com/Skynet/comments/commentRss/300097.htmlhttp://www.aygfsteel.com/Skynet/services/trackbacks/300097.html 首先 好东?
  http://kr.github.com/beanstalkd/


其次 真的是好东西 支持 java , python ,perl,ruby,erlang 和我不知道的 语言
  官方的原文介l:
$ ./beanstalkd -d -l 10.0.1.5 -p 11300

This starts up beanstalkd as a daemon listening on address 10.0.1.5, port 11300.

Use It

Here’s an example in Ruby (see the client libraries to find your favorite language).

First, have one process put a job into the queue:

beanstalk = Beanstalk::Pool.new(['10.0.1.5:11300'])

beanstalk.put('hello')

Then start another process to take jobs out of the queue and run them:

beanstalk = Beanstalk::Pool.new(['10.0.1.5:11300'])

loop do

job = beanstalk.reserve

puts job.body # prints "hello"

job.delete

end





Thanks

Many thanks to memcached for providing inspiration for simple protocol design and for the structure of the documentation. Not to mention a fantastic piece of software!




]]>
hadoop streaming( hadoop + perl )试http://www.aygfsteel.com/Skynet/archive/2009/09/25/296420.html刘凯?/dc:creator>刘凯?/author>Fri, 25 Sep 2009 06:33:00 GMThttp://www.aygfsteel.com/Skynet/archive/2009/09/25/296420.htmlhttp://www.aygfsteel.com/Skynet/comments/296420.htmlhttp://www.aygfsteel.com/Skynet/archive/2009/09/25/296420.html#Feedback0http://www.aygfsteel.com/Skynet/comments/commentRss/296420.htmlhttp://www.aygfsteel.com/Skynet/services/trackbacks/296420.html   http://hadoop.apache.org/common/docs/r0.15.2/streaming.html

注意
  目前 streaming ?linux pipe #也就?cat |wc -l q样的管?不支持,但不妨碍我们使用perl,python 行式命oQ!
  原话?Q?br />   Can I use UNIX pipes? For example, will -mapper "cut -f1 | sed s/foo/bar/g" work?
    Currently this does not work and gives an "java.io.IOException: Broken pipe" error.
    This is probably a bug that needs to be investigated.
  但如果你是强烈的 linux shell pipe 发烧?Q?参考下?br />   $> perl -e 'open( my $fh, "grep -v null tt |sed -n 1,5p |");while ( <$fh> ) {print;} '
     #不过我没试通过 Q!

环境 Qhadoop-0.18.3
$> find . -type f -name "*streaming*.jar"
./contrib/streaming/hadoop-0.18.3-streaming.jar


试数据Q?br />
-bash-3.00$ head tt 
null    false    3702    208100
6005100    false    70    13220
6005127    false    24    4640
6005160    false    25    4820
6005161    false    20    3620
6005164    false    14    1280
6005165    false    37    7080
6005168    false    104    20140
6005169    false    35    6680
6005240    false    169    32140
......


q行Q?br />
c1="  perl -ne  'if(/.*\t(.*)/){\$sum+=\$1;}END{print \"\$sum\";}'  "
# 注意 q里 $ 要写?\$    " 写成 \"
echo $c1; # 打印输出  perl -ne 'if(/.*"t(.*)/){$sum+=$1;}END{print $sum;}'
hadoop jar hadoop-0.18.3-streaming.jar
  
-input file:///data/hadoop/lky/jar/tt 
   -
mapper   "/bin/cat" 
   -
reducer "$c1" 
  
-output file:///tmp/lky/streamingx8


l果:
cat /tmp/lky/streamingx8/*
1166480

本地q行输出:
perl -ne 'if(/.*"t(.*)/){$sum+=$1;}END{print $sum;}' < tt
1166480

l果正确!!!!


命o自带文档Q?br />
-bash-3.00$ hadoop jar hadoop-0.18.3-streaming.jar -info
09/09/25 14:50:12 ERROR streaming.StreamJob: Missing required option -input
Usage: $HADOOP_HOME
/bin/hadoop [--config dir] jar \
          $HADOOP_HOME
/hadoop-streaming.jar [options]
Options:
  
-input    <path>     DFS input file(s) for the Map step
  
-output   <path>     DFS output directory for the Reduce step
  
-mapper   <cmd|JavaClassName>      The streaming command to run
  
-combiner <JavaClassName> Combiner has to be a Java class
  
-reducer  <cmd|JavaClassName>      The streaming command to run
  
-file     <file>     File/dir to be shipped in the Job jar file
  
-dfs    <h:p>|local  Optional. Override DFS configuration
  
-jt     <h:p>|local  Optional. Override JobTracker configuration
  
-additionalconfspec specfile  Optional.
  
-inputformat TextInputFormat(default)|SequenceFileAsTextInputFormat|JavaClassName Optional.
  
-outputformat TextOutputFormat(default)|JavaClassName  Optional.
  
-partitioner JavaClassName  Optional.
  
-numReduceTasks <num>  Optional.
  
-inputreader <spec>  Optional.
  
-jobconf  <n>=<v>    Optional. Add or override a JobConf property
  
-cmdenv   <n>=<v>    Optional. Pass env.var to streaming commands
  
-mapdebug <path>  Optional. To run this script when a map task fails 
  
-reducedebug <path>  Optional. To run this script when a reduce task fails 
  
-cacheFile fileNameURI
  
-cacheArchive fileNameURI
  
-verbose




]]>
hadoop jython ( windows )http://www.aygfsteel.com/Skynet/archive/2009/09/04/293914.html刘凯?/dc:creator>刘凯?/author>Fri, 04 Sep 2009 09:14:00 GMThttp://www.aygfsteel.com/Skynet/archive/2009/09/04/293914.htmlhttp://www.aygfsteel.com/Skynet/comments/293914.htmlhttp://www.aygfsteel.com/Skynet/archive/2009/09/04/293914.html#Feedback0http://www.aygfsteel.com/Skynet/comments/commentRss/293914.htmlhttp://www.aygfsteel.com/Skynet/services/trackbacks/293914.htmlhadoop window 搭徏 ?׃?py 的语法喜?Q一直想 把hadoop,Ҏjython ?
q次 ?自己电脑?nbsp; l于 完成,下面介绍q程:

试环境Q?br /> 依然?windows + cygwin
hadoop 0.18  # C:/cygwin/home/lky/tools/java/hadoop-0.18.3
jython 2.2.1 # C:/jython2.2.1

参? PythonWordCount

启动 hadoop q到 hdoop_home ?br />
# 在云环境中创?input 目录
$>bin/hadoop dfs -mkdir input

# ??hadoop ?NOTICE.txt 拯?input 目录?/strong>
$>bin/hadoop dfs -copyFromLocal c:/cygwin/home/lky/tools/java/hadoop-0.18.3/NOTICE.txt  hdfs:///user/lky/input

$>cd
src/examples/python

# 创徏 ?脚本 ( jy->jar->hd run  ) 一步完?
# 当然 ?linux 写个脚本比这 好看 呵呵Q?br />
$>vim run.bat
"C:\Program Files\Java\jdk1.6.0_11\bin\java.exe"  -classpath "C:\jython2.2.1\jython.jar;%CLASSPATH%" org.python.util.jython C:\jython2.2.1\Tools\jythonc\jythonc.py   -p org.apache.hadoop.examples -d -j wc.jar -c %1

sh C:\cygwin\home\lky\tools\java\hadoop-
0.18.3\bin\hadoop jar wc.jar  %2 %3 %4 %5 %6 %7 %8 %9

# 修改 jythonc 打包 环境 ?+hadoop jar
$>vim C:\jython2.2.1\Tools\jythonc\jythonc.py
# Copyright (c) Corporation for National Research Initiatives
# Driver script for jythonc2.  See module main.py for details
import sys,os,glob

for fn in glob.glob('c:/cygwin/home/lky/tools/java/hadoop-0.18.3/*.jar') :sys.path.append(fn)
for fn in glob.glob('c:/jython2.2.1/*.jar') :sys.path.append(fn)
for fn in glob.glob('c:/cygwin/home/lky/tools/java/hadoop-0.18.3/lib/*.jar'
) :sys.path.append(fn)

import main
main.main()

import os
os._exit(0)


# q行
C:/cygwin/home/lky/tools/java/hadoop-0.18.3/src/examples/python>
  run.bat WordCount.py  hdfs:///user/lky/input  file:///c:/cygwin/home/lky/tools/java/hadoop-0.18.3/tmp2




l果输出Q?/strong>
cat c:/cygwin/home/lky/tools/java/hadoop-0.18.3/tmp2/part-00000
(http://www.apache.org/).       1
Apache  1
Foundation      1
Software        1
The     1
This    1
by      1
developed       1
includes        1
product 1
software        1

下面重头来了 Q(z的 jy hdoop 代码Q?/strong>
#
#
 Licensed to the Apache Software Foundation (ASF) under one
#
 or more contributor license agreements.  See the NOTICE file
#
 distributed with this work for additional information
#
 regarding copyright ownership.  The ASF licenses this file
#
 to you under the Apache License, Version 2.0 (the
#
 "License"); you may not use this file except in compliance
#
 with the License.  You may obtain a copy of the License at
#
#
     http://www.apache.org/licenses/LICENSE-2.0
#
#
 Unless required by applicable law or agreed to in writing, software
#
 distributed under the License is distributed on an "AS IS" BASIS,
#
 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#
 See the License for the specific language governing permissions and
#
 limitations under the License.
#

from org.apache.hadoop.fs import Path
from org.apache.hadoop.io import *
from org.apache.hadoop.mapred import *

import sys
import getopt

class WordCountMap(Mapper, MapReduceBase):
    one 
= IntWritable(1)
    
def map(self, key, value, output, reporter):
        
for w in value.toString().split():
            output.collect(Text(w), self.one)

class Summer(Reducer, MapReduceBase):
    
def reduce(self, key, values, output, reporter):
        sum 
= 0
        
while values.hasNext():
            sum 
+= values.next().get()
        output.collect(key, IntWritable(sum))

def printUsage(code):
    
print "wordcount [-m <maps>] [-r <reduces>] <input> <output>"
    sys.exit(code)

def main(args):
    conf 
= JobConf(WordCountMap);
    conf.setJobName(
"wordcount");
 
    conf.setOutputKeyClass(Text);
    conf.setOutputValueClass(IntWritable);
    
    conf.setMapperClass(WordCountMap);        
    conf.setCombinerClass(Summer);
    conf.setReducerClass(Summer);
    
try:
        flags, other_args 
= getopt.getopt(args[1:], "m:r:")
    
except getopt.GetoptError:
        printUsage(
1)
    
if len(other_args) != 2:
        printUsage(
1)
    
    
for f,v in flags:
        
if f == "-m":
            conf.setNumMapTasks(int(v))
        
elif f == "-r":
            conf.setNumReduceTasks(int(v))
    conf.setInputPath(Path(other_args[0]))
    conf.setOutputPath(Path(other_args[
1]))
    JobClient.runJob(conf);

if __name__ == "__main__":
    main(sys.argv)







]]>
hadoop cascading demo http://www.aygfsteel.com/Skynet/archive/2009/07/22/287807.html刘凯?/dc:creator>刘凯?/author>Wed, 22 Jul 2009 02:01:00 GMThttp://www.aygfsteel.com/Skynet/archive/2009/07/22/287807.htmlhttp://www.aygfsteel.com/Skynet/comments/287807.htmlhttp://www.aygfsteel.com/Skynet/archive/2009/07/22/287807.html#Feedback0http://www.aygfsteel.com/Skynet/comments/commentRss/287807.htmlhttp://www.aygfsteel.com/Skynet/services/trackbacks/287807.html Java 代码Q?br />
package com.xunjie.dmsp.olduser;

import java.util.Properties;

import cascading.flow.Flow;
import cascading.flow.FlowConnector;
import cascading.operation.regex.RegexSplitter;
import cascading.pipe.Each;
import cascading.pipe.Pipe;
import cascading.scheme.TextLine;
import cascading.tap.Hfs;
import cascading.tap.Tap;
import cascading.tuple.Fields;

/**
 * test.txtQ?nbsp;
 * 1    a
 * 2    b
 * 3    c
 * 
 * /data/hadoop/hadoop/bin/hadoop jar 
 *         dmsp_test_jar-1.0-SNAPSHOT-dependencies.jar 
 *             hdfs:/user/hadoop/test/lky/test.txt
 *             file:///data/hadoop/test/lky/output
 
*/
public class Test2 {
    
public static void main(String[] args) {
        
        
//讑֮输入文g
        String sourcePath= args[0];
        
//讄输出文g?/span>
        String sinkPath = args[1];

        
//定义d?/span>
        Fields inputfields = new Fields("num""value");
        
//定义分解正则Q默?nbsp;\t
        RegexSplitter spliter = new RegexSplitter(inputfields);
        
        
        
//道定义
        Pipe p1 = new Pipe( "test" );
        
//道嵌套Q?br />         //分解日志源文Ӟ输出l定字段
        p1 = new Each(p1,new Fields("line") ,spliter);
        
        
        
//讑֮输入和输?nbsp;Q?nbsp;泛型Hfs
        Tap source = new Hfs( new TextLine(),  sourcePath );
        Tap sink 
= new Hfs( new TextLine() , sinkPath );
        
        
        
        
//配置job
        Properties properties = new Properties();
        properties.setProperty(
"hadoop.job.ugi""hadoop,hadoop");
        
        FlowConnector.setApplicationJarClass( properties, Main.
class );
        FlowConnector flowConnector 
= new FlowConnector(properties);
        
        Flow importFlow 
= flowConnector.connect( "import flow", source,sink,p1);
        
        importFlow.start();
        importFlow.complete();
        

    }
}




]]>
hadoop window 搭徏http://www.aygfsteel.com/Skynet/archive/2009/07/08/285919.html刘凯?/dc:creator>刘凯?/author>Wed, 08 Jul 2009 03:07:00 GMThttp://www.aygfsteel.com/Skynet/archive/2009/07/08/285919.htmlhttp://www.aygfsteel.com/Skynet/comments/285919.htmlhttp://www.aygfsteel.com/Skynet/archive/2009/07/08/285919.html#Feedback0http://www.aygfsteel.com/Skynet/comments/commentRss/285919.htmlhttp://www.aygfsteel.com/Skynet/services/trackbacks/285919.html hadoop 原理参考:windows ssh 搭徏
2. 搭徏hadoop  Cygwin下的Hadoop快速入?伪分布式模式的查~?/a>
    q里q有 cygwin putty 控制台方法设|?br /> 3. 开发环境和 demo
hadoop-site.xml ?br />    在这个版本已l在conf下找不到了,我这试修改?hdfs-site.xml 。测试的时候竟焉过了?br />  
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>
  
<property>
    
<name>fs.default.name</name>
    
<value>hdfs://localhost:9000</value>
  
</property>

  
<property>
    
<name>mapred.job.tracker</name>
    
<value>localhost:9001</value>
  
</property>

  
<property>
    
<name>dfs.data.dir</name>
    
<!--linux -->
    
<!--<value>/home/lky/tools/java/hadoop-0.18.3/dfs</value>-->
    
<value>C:\\cygwin\\home\\lky\\tools\\java\\hadoop-0.18.3\\dfs\\</value>
  
</property>


  
<property>
    
<name>hadoop.tmp.dir</name>
    
<value>/tmp</value>
  
</property>



  
<property>
    
<name>dfs.replication</name>
    
<value>1</value>
  
</property>


<property>
  
<name>fs.trash.interval</name>
  
<value>60</value>
  
<description>Number of minutes between trash checkpoints.
  If zero, the trash feature is disabled.
  
</description>
</property>
  
</configuration>



]]>
svn 单?/title><link>http://www.aygfsteel.com/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.aygfsteel.com/Skynet/archive/2009/05/19/271570.html</guid><wfw:comment>http://www.aygfsteel.com/Skynet/comments/271570.html</wfw:comment><comments>http://www.aygfsteel.com/Skynet/archive/2009/05/19/271570.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/Skynet/comments/commentRss/271570.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/Skynet/services/trackbacks/271570.html</trackback:ping><description><![CDATA[<br /> <br /> svn 帮助文档Q大体上览了下 一些比较好的特?有:<br /> <strong><a 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 style="background-color: #c0c0ff; color: purple; text-decoration: underline;" target="_blank">分支与合q?/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 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 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 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 style="color: purple; text-decoration: underline;" target="_blank">一个SVN  Python状态爬?/a></span><br /> <br /> <br /> <strong style="color: #cc0000;">注意 使用用户 (sysmen)  Q?/strong><br /> <strong>#指定新版?/strong><br /> vim ~.bashrc #d?br /> alias svn="/usr/local/subversion/ <div class="wmqeeuq" 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  </strong>svn://<a target="_blank">127.0.0.1/test</a> <br /> <br /> <br /> <strong>#q出</strong><br /> cd /home/sysman/src/svn/testsrc<br /> svn <strong>checkout  </strong>svn://<a target="_blank">127.0.0.1/test</a><br /> <br /> <br /> <strong>#q入</strong><br /> cd test <br /> echo "google - baidu " > baidu<br /> svn <strong>add </strong>baidu svn://<a target="_blank">127.0.0.1/test</a> <br /> svn <strong>commit </strong>-m 'add ok'<br /> svn list  svn://<a target="_blank">127.0.0.1/test</a> <br /> # baidu<br /> # tt<br /> <br /> <br /> #详细参?Q?br /> <strong><a target="_blank">http://www.subversion.org.cn/<wbr>svnbook/</a></strong><br /> 在文档中有关有意思的介绍 QsvnsyncQ:<br /> <strong><a target="_blank">http://www.subversion.org.cn/<wbr>svnbook/1.4/svn.ref.svnsync.<wbr>html</a></strong><br /> <br /> <br /> 其他说明 Q?br /> <br /> 1.帮助<br /> svn help<br /> ?<br /> svn help add<br /> <br /> 2.一般操?br /> 更新你的工作拯<br />     svn update<br /> <br /> 做出修改<br />     svn add<br />     svn delete<br />     svn copy<br />     svn move<br /> <br /> 验修?br />     svn status<br />     svn diff<br /> <br /> 可能会取消一些修?br />     svn revert<br /> <br /> 解决冲突Q合q别人的修改Q?br />     svn update<br />     svn resolved<br /> <br /> 提交你的修改<br />     svn commit<br /> <br /> <br /> </div> <br /> <br /> <img src ="http://www.aygfsteel.com/Skynet/aggbug/271570.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/Skynet/" target="_blank">刘凯?/a> 2009-05-19 17:37 <a href="http://www.aygfsteel.com/Skynet/archive/2009/05/19/271570.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> soap (java,perl,要写代码 q不q?100 char) http://www.aygfsteel.com/Skynet/archive/2009/03/02/257264.html刘凯?/dc:creator>刘凯?/author>Sun, 01 Mar 2009 16:00:00 GMThttp://www.aygfsteel.com/Skynet/archive/2009/03/02/257264.htmlhttp://www.aygfsteel.com/Skynet/comments/257264.htmlhttp://www.aygfsteel.com/Skynet/archive/2009/03/02/257264.html#Feedback0http://www.aygfsteel.com/Skynet/comments/commentRss/257264.htmlhttp://www.aygfsteel.com/Skynet/services/trackbacks/257264.html 可能最单的 soap 哦!
服务器ؓ java tomcat
下蝲服务器:http://www.apache.org/dist/ws/
   axis/ 为java
   axis-c/    ?c

1.我这下蝲?axis 1_4 版本 Q解?/webapps/axis  攑ֈ tomcat 的webapps
启动tomcatQ这׃修改MQ如有需??web.xml {配|了Q?a style="font-size: 12px;" onclick="NEBlog.gPrevBlog.oBlogList._oUpdownMenu.openBlog('blog/static/307422712007552499407', event);return false;"> 参?>>
    blog ?q有很多介绍 axis 大家可以 看看  日志 > 其下?"学习"

直接写个文g HelloWorld.jws 攑ֈ %TOMCAT_HOME%"webapps"axis
public class HelloWorld {   
     
public String sayHello()   {   
     
return "HELLO soap!";    
 }    


{不?可以使用 看看
http://127.0.0.1:8080/axis/HelloWorld.jws?method=sayHello
l果 Q?br />
<soapenv:Envelope>
<soapenv:Body>
<sayHelloResponse soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<sayHelloReturn xsi:type="xsd:string">HELLO soap!</sayHelloReturn>
</sayHelloResponse>
</soapenv:Body>
</soapenv:Envelope>


客户D?br /> perl cpan >> install  SOAP::Lite
#!perl -w
use SOAP::Lite;
print SOAP::Lite
    
-> proxy('http://127.0.0.1:8080/axis/HelloWorld.jws')
    
-> uri('http://127.0.0.1:8080/axis/HelloWorld.jws')
    
-> sayHello()
    
-> result;
l果Q?HELLO soapQ?/span>






]]>
վ֩ģ壺 ͨ| | | | | ֵ| ײ| ʡ| | ƽң| ԭ| | | | | | | | | | ұ| | | Ϫ| ʯ̨| ƽ| | ƽ| | | | | | | | ɳ| ˷| ½| | | |