一个url请求,在经过代理层访问应用层后,会报502错误。检查发现应用层是Nginx0.7.64+Resin3的结构,代理层是Nginx1.2。直接访问Nginx0.7.64是没问题的,访问Nginx1.2就会返回”upstream sent invalid header while reading response header from upstream”。 继续阅读……
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”。 继续阅读……
20 Aug 2012 Posted in testing
之前有一个AnyEvent和Fork写的http压测工具,评论里有大神教导说用Coro控制并发更有效更方便。于是改写了下面的版本。从被压测的nginx server上,可以看到ESTABLISHED的数量确实大大增加,“”并发”两个字算是做到了。 继续阅读……
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);
继续阅读……
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;
继续阅读……
19 Jul 2012 Posted in testing
话不多说,先上第一版的代码:
```perl
use Time::HiRes qw/time/;
use AnyEvent::HTTP;
use AnyEvent;
use Coro;
继续阅读……
07 Jul 2012 Posted in perl
当你需要给一个集群的某项服务做简单的排他性管理的时候,强力推荐Veripool公司的一系列模块:IPC::Locker、Schedule::Load。 继续阅读……
02 Jul 2012 Posted in perl
很简单的一个实例,就是开一个端口接受url请求,然后向squid提交这个url的刷新。
```perl
use AnyEvent::HTTPD;
use AnyEvent::HTTP;
继续阅读……
29 Jun 2012 Posted in perl
14 Jun 2012 Posted in perl
STF项目,全称”Stepover Toehold Facelock“,原因是项目发起人喜欢这个动作,我勒个去……当然作者也给它找了个靠谱一点的解释,叫STorage Farm。 继续阅读……
13 Jun 2012 Posted in logstash
之前提到,用RabbitMQ作为消息队列。但是这个东西实在太过高精尖,不懂erlang不会调优的情况下,很容易挂掉——基本上我这里试验结果跑不了半小时日志传输就断了。所以改用简单易行的redis来干这个活。 继续阅读……
08 Jun 2012 Posted in CDN
08 Jun 2012 Posted in monitor
trafficserver提供了几种很不错的性能监控方式。首先是一个模仿cisco的shell工具./bin/traffic_shell——这个工具可以set变量,也可以show变量,另一个是类似squidclient的./bin/traffic_line工具——这个工具同样可以set和show变量,不过这里变量更接近源代码函数名的样子,相当于调用API了。此外还有Perl和Web的其他方式…… 继续阅读……
01 Jun 2012 Posted in logstash
上上篇讲到怎样用MRI的ruby在客户端收集日志。今天主要注意服务器端,考虑grok、elastic、web这几个功能在JRuby上才好。所以服务器端可以再开一个JRuby的进程。 继续阅读……
01 Jun 2012 Posted in perl
31 May 2012 Posted in logstash
在一般情况下,我们实验logstash都是直接用官网上下载的jar包,然后java运行即可。但如果在大规模场景下,这样其实并不是运维的最佳实践: 继续阅读……
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+)”)
继续阅读……
22 May 2012 Posted in devops
上篇说到怎样使用ENC脚本控制puppet的客户端配置,这篇说如何监控和展示客户端运行状态报告。 继续阅读……
18 May 2012 Posted in devops
今天研究puppet dashboard。主要有ENC和reports两个功能。其中ENC功能相当扯淡,因为你在web上点击添加的class/node/group,是没有任何依赖性检查(比如node命名是否符合fqdn,class是否存在)的,随便咋填绝无报错和拒绝!而且也没有提供类似report的导入工具,一旦启用就要完全重新手工输入所有配置……所以无论是从导入角度还是管理角度,自己实现一个靠谱点的ENC都是有必要的。 继续阅读……
10 May 2012 Posted in devops
使用puppet管理集群配置是个很靠谱的做法。跟其他同类产品相比,第一他的DSL语法很丰富够灵活,第二围绕他的生态圈活跃,资料比较多。 继续阅读……
08 May 2012 Posted in nginx
统计nginx的请求数据,一般有几个办法,一个是logrotate,通过access.log计算,这个很详细,但是实时性差一些;一个是Tengine提供的pipe,这个实时性更好,但是管道如果出现堵塞,麻烦就多了~这两种办法,归根结底都是把日志记录在本地(pipe方式如果要长期保留依然要记磁盘)然后由脚本完成计算。今天这里说另一种方法:在nginx内部,随着每次请求完成一些基础的数据统计,然后输出到存储里供长期调用。
代码如下:
继续阅读……
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