用systemtap定位nginx1.2在header解析时的报错

23 Aug 2012 Posted in  monitor

一个url请求,在经过代理层访问应用层后,会报502错误。检查发现应用层是Nginx0.7.64+Resin3的结构,代理层是Nginx1.2。直接访问Nginx0.7.64是没问题的,访问Nginx1.2就会返回”upstream sent invalid header while reading response header from upstream”。 继续阅读……


Coro::Semaphore和async_pool示例

20 Aug 2012 Posted in  testing

之前有一个AnyEvent和Fork写的http压测工具,评论里有大神教导说用Coro控制并发更有效更方便。于是改写了下面的版本。从被压测的nginx server上,可以看到ESTABLISHED的数量确实大大增加,“”并发”两个字算是做到了。 继续阅读……


一个Plack::Middleware的实例

30 Jul 2012 Posted in  dancer

做一个文件上传的网页,想稍微华丽一点,显示进度条出来。在Apache和Catalyst下都有现成的模块,不过Dancer上还没有。看了一下代码,Dancer::Request里没有像Catalyst那样暴露prepare_body_chunk方法。所以需要在plack上利用psgi.input来做。尽量重用现有代码,所以progress.css和progress.js都直接从Catalyst/Plugin/UploadProgress/example/Upload/root/static/里复制。
```perl
package Plack::Middleware::UploadProgress;
use strict;
use CHI;
use Carp;
use HTTP::Body;
use Plack::Request;
use Plack::TempBuffer;
use parent qw(Plack::Middleware); 继续阅读……


一个Dancer::Plugin的实例

30 Jul 2012 Posted in  dancer

公司内部工具统一使用passport认证登录,于是写这么一个小plugin,用来给dancer做的网站使用统一认证。
passport的原理很简单,将原先的页面url带入session转到passport的login,然后由passport通过user/password或者kerberos确认是否正确,并返回一个ticket参数,然后拿这个ticket再到passport的verify上校验一次username,正确的话写入session即可。代码如下:
```perl
package Dancer::Plugin::Auth::Passport;
use Dancer ‘:syntax’;
use Dancer::Plugin;
use Furl;
use warnings;
use strict; 继续阅读……


用AnyEvent和ForkManager写一个http协议的压测工具

19 Jul 2012 Posted in  testing

话不多说,先上第一版的代码:
```perl
use Time::HiRes qw/time/;
use AnyEvent::HTTP;
use AnyEvent;
use Coro; 继续阅读……


IPC::Locker模块介绍

07 Jul 2012 Posted in  perl

当你需要给一个集群的某项服务做简单的排他性管理的时候,强力推荐Veripool公司的一系列模块:IPC::Locker、Schedule::Load。 继续阅读……


AnyEvent::HTTPD和AnyEvent::HTTP使用实例

02 Jul 2012 Posted in  perl

很简单的一个实例,就是开一个端口接受url请求,然后向squid提交这个url的刷新。
```perl
use AnyEvent::HTTPD;
use AnyEvent::HTTP; 继续阅读……


【翻译】Coro::Intro文档

29 Jun 2012 Posted in  perl


STF介绍

14 Jun 2012 Posted in  perl

STF项目,全称”Stepover Toehold Facelock“,原因是项目发起人喜欢这个动作,我勒个去……当然作者也给它找了个靠谱一点的解释,叫STorage Farm。 继续阅读……


【Logstash系列】使用Redis并自定义Grok匹配

13 Jun 2012 Posted in  logstash

之前提到,用RabbitMQ作为消息队列。但是这个东西实在太过高精尖,不懂erlang不会调优的情况下,很容易挂掉——基本上我这里试验结果跑不了半小时日志传输就断了。所以改用简单易行的redis来干这个活。 继续阅读……


MogileFS安装

10 Jun 2012 Posted in  perl

纯属凑数的更新,写写安装过程而已。没有调优,没有测评,嗯…… 继续阅读……


淘宝TrafficServer的SSD分支测试与介绍

08 Jun 2012 Posted in  CDN

同事介绍说淘宝有关于trafficserver的一个分支支持SSD的。下来试试。下载地址 继续阅读……


用ganglia监控trafficserver

08 Jun 2012 Posted in  monitor

trafficserver提供了几种很不错的性能监控方式。首先是一个模仿cisco的shell工具./bin/traffic_shell——这个工具可以set变量,也可以show变量,另一个是类似squidclient的./bin/traffic_line工具——这个工具同样可以set和show变量,不过这里变量更接近源代码函数名的样子,相当于调用API了。此外还有Perl和Web的其他方式…… 继续阅读……


【Logstash系列】用rabbitmq和elasticsearch搭建分布式日志收集存储系统

01 Jun 2012 Posted in  logstash

上上篇讲到怎样用MRI的ruby在客户端收集日志。今天主要注意服务器端,考虑grok、elastic、web这几个功能在JRuby上才好。所以服务器端可以再开一个JRuby的进程。 继续阅读……


用Spork和Template::Toolkit生成slides胶片展示

01 Jun 2012 Posted in  perl

在不少技术集会上,大家都不再采用ppt而是使用pdf,甚至浏览器,编辑器来显示内容。利用js和css完成slide效果已经越来越花哨。另一个用vim的流派也让人很是惊叹~
那不会css的童鞋怎么办呢?这里有个笨办法。用Spork工具生成html页——反正slide一般内容不多,html代码重复一点也不浪费啥事儿~用template技术刚刚好。
Spork是一个在Sporx基础上构成的工具,可以直接cpan安装,不过默认情况下没有plugin。所以比较好的办法是上git找个带plugin的代码clone。这样页面样式好看点。
比方我用的这个就是Spork作者用的:Spork-pm 继续阅读……


【Logstash系列】使用原版Ruby1.8运行logstash的客户端程序

31 May 2012 Posted in  logstash

在一般情况下,我们实验logstash都是直接用官网上下载的jar包,然后java运行即可。但如果在大规模场景下,这样其实并不是运维的最佳实践: 继续阅读……


用perl和lua在nginx中验证url

25 May 2012 Posted in  nginx

和三年前的博客一样,还是时间加密钥加路径的加密方式。不过这次改用nginx,这样不用重新缓存后面的squid文件了。
先用ngx_lua做:
```nginx
set $expire “600”;
set $salt “mysalt”;
location ~* .mp3$ {
#local m = ngx.re.match(ngx.var.uri,”^/([0-9]{4})/([0-9]{2})/([0-9]{2})/([0-9]{2})/([0-9]{2})/([0-9a-z]{32})(/.*)”)
#用ngx.re.match就不能%d,用string.match就不能{2},郁闷
#而且ngx.re.match所有的捕获都在m数组里,这点类似perl的m//返回。
rewrite_by_lua ‘
local date = {}
local md5str
local path
date.year,date.month,date.day,date.hour,date.min,md5str,path = string.match(ngx.var.uri,”^/(%d+)/(%d+)/(%d+)/(%d+)/(%d+)/(%w+)(/%S+)”) 继续阅读……


【puppet系列】网页展示puppet的客户端报告

22 May 2012 Posted in  devops

上篇说到怎样使用ENC脚本控制puppet的客户端配置,这篇说如何监控和展示客户端运行状态报告。 继续阅读……


【puppet系列】puppet使用ENC定义节点

18 May 2012 Posted in  devops

今天研究puppet dashboard。主要有ENC和reports两个功能。其中ENC功能相当扯淡,因为你在web上点击添加的class/node/group,是没有任何依赖性检查(比如node命名是否符合fqdn,class是否存在)的,随便咋填绝无报错和拒绝!而且也没有提供类似report的导入工具,一旦启用就要完全重新手工输入所有配置……所以无论是从导入角度还是管理角度,自己实现一个靠谱点的ENC都是有必要的。 继续阅读……


【puppet系列】puppet安装/Facter插件和puppet模板编写

10 May 2012 Posted in  devops

使用puppet管理集群配置是个很靠谱的做法。跟其他同类产品相比,第一他的DSL语法很丰富够灵活,第二围绕他的生态圈活跃,资料比较多。 继续阅读……


通过lua统计nginx内部变量数据

08 May 2012 Posted in  nginx

统计nginx的请求数据,一般有几个办法,一个是logrotate,通过access.log计算,这个很详细,但是实时性差一些;一个是Tengine提供的pipe,这个实时性更好,但是管道如果出现堵塞,麻烦就多了~这两种办法,归根结底都是把日志记录在本地(pipe方式如果要长期保留依然要记磁盘)然后由脚本完成计算。今天这里说另一种方法:在nginx内部,随着每次请求完成一些基础的数据统计,然后输出到存储里供长期调用。
代码如下: 继续阅读……


Linux系统调优读书笔记

30 Apr 2012 Posted in  linux

今天在图书馆看书,摘抄一些有意思的细节。 继续阅读……


51CTO博客自动发布脚本

21 Apr 2012 Posted in  perl

#!/bin/env perl
use warnings;
use strict;
use File::Util;
use YAML::Syck;
use Perl6::Say;
use XMLRPC::Lite;
use Data::Dumper;
my $f = File::Util->new;
my @blogs = grep {/\.markdown$/} $f->list_dir('../_posts', '--recurse');
foreach (@blogs) {
    my $yaml = LoadFile($_);
    my $title = $yaml->{'title'};
    my $text = $f->load_file("$_");
    upload($title, $text);
};
sub upload {
    my ($title, $text) = @_;
    my $username = 'username';
    my $password = 'password';
    my $blogid   = '123456';
    my $proxyurl = 'http://blogname.blog.51cto.com/xmlrpc.php';
    my $res = XMLRPC::Lite->proxy($proxyurl)->call('metaWeblog.newPost', $blogid, $username, $password, { title => "$title", description => "$text", categories => ['【创作类型:原创】','IT管理', ]}, 1)->result;
    say "newPost id -- " . $res if $res;
};

目前还有几个问题: 继续阅读……


获取造价百强公司的真实位置

18 Apr 2012 Posted in  perl

很久没更新,没用技术,今天稍微geek一下下。给老婆搜索她行业百强公司的具体地点,看看如果换单位的话是否方便出行~代码如下: 继续阅读……


弹性集群监控中的配置自动生效问题研究

16 Apr 2012 Posted in  monitor

最近跟@画圈圈的星星 聊天,说到nagios在大规模集群运用中一个比较严重的瓶颈:修改配置需要重启进程。
听起来似乎不是什么问题,我个人之前对nagios的追求,也都放在怎么样提供一个及时高效的监控和数据展示上面—-这两个问题在 mod_gearmanpnp4nagios 的协助下已经很给力了。 继续阅读……