当前位置:首页 > 开发 > 开源软件 > 正文

nginx_perl试用

发表于: 2015-07-03   作者:ronin47   来源:转载   浏览:
摘要: 因为空闲时间比较多,所以在CPAN上乱翻,看到了nginx_perl这个项目(原名Nginx::Engine),现在托管在github.com上。地址见:https://github.com/zzzcpan/nginx-perl 这个模块的目的,是在nginx内置官方perl模块的基础上,实现一系列异步非阻塞的api。用connector/writer/reader完成类似proxy的功能(这里

因为空闲时间比较多,所以在CPAN上乱翻,看到了nginx_perl这个项目(原名Nginx::Engine),现在托管在github.com上。地址见:https://github.com/zzzcpan/nginx-perl

这个模块的目的,是在nginx内置官方perl模块的基础上,实现一系列异步非阻塞的api。用connector/writer/reader完成类似proxy的功能(这里因为是交给perl完成,所以不单单局限在http上了),用take_connection/give_connection完成类似websocket的功能,用ssl_handshaker完成ssl的解析,用timer完成定时器,用resolver完成域名解析…使用方法简单来说,就是用main_count_inc/finalize_request控制计数器,用NGX_READ/NGX_WRITE/NGX_CLOSE等控制callback。

其他内容和apache的mod_perl,或者nginx.org的perl类似。最新版的POD地址见:http://zzzcpan.github.com/nginx-perl/Nginx.html

最后举例一个自己写的简单的例子:

package HelloWorld;
use Nginx;
use strict;
#用来在nginx启动的时候做的事情,这里单纯显示一下
sub init_worker {
    warn 'nginx_perl start [OK]';
};
#这里是nginx的http模块中调用的handler,alexander有计划改成tcp级别的
sub handler {
    my $r = shift;
#增加主循环的计数器
    $r->main_count_inc;
#使用非阻塞的连接器连接127.0.0.1的80端口,10秒超时
    ngx_connector '127.0.0.1', 80, 10, sub {
#如果连接出问题,会记录在$!中
        if ($!) {
            $r->send_http_header('text/html');
            $r->print("Connection failed, $!\n");
            $r->send_special(NGX_HTTP_LAST);
#不管怎么处理这次连接,最后一定要记得用$r->finalize_request(),会decrease之前$r->main_count_inc;里加上的计数。
            $r->finalize_request(NGX_OK);
            return NGX_CLOSE;
        };
#返回$c是建立的连接
        my $c = shift;
        my $req_buf = "GET /index.php HTTP/1.0\x0d\x0a".
              "Host: chenlinux.com\x0d\x0a".
              "Connection: close\x0d\x0a".
              "\x0d\x0a";
#这里记住定义buffer的时候不要搞成undef了,会报段错误的,不过俄国佬回信说他修复了
        my $res_buf = '';
#非阻塞写入,超时10秒
        ngx_writer $c, $req_buf, 10, sub {
            if ($!) {
                 ......
            };
            $req_buf = '';
#之前的buffer测试就是这里,如果加一个warn,就不会报错……汗
#warn "$req_buf\n$res_buf\n";
#写入完成后,开始调用读取
            return NGX_READ;
        };
#读取到buffer,最短0字节,最长8000字节,超时10秒
        ngx_reader $c, $res_buf, 0, 8000, 10, sub {
            if ($!) {
            ......
            }
            $r->send_http_header('text/html');
            $r->print($res_buf);
            $r->send_special(NGX_HTTP_LAST);
            $r->finalize_request(NGX_OK);
            return NGX_CLOSE;
        };
#这个是connector的语句,表示连接成功后调用写入
        return NGX_WRITE;
    };
#各个非阻塞调用完成后的返回,NGX_DONE只能用在http的handler里,不能在ngx_*r里用,里面请用NGX_CLOSE。
    return NGX_DONE;
};
1;

另:源码中带有一个真正的反向http的例子Nginx::Util和一个Redis的例子。并且与nodejs读取redis的性能做了对比。可以参见~~

Perl在nginx里的应用

nginx_perl试用

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
我平常写python使用的编辑器: 1、vim + pycomplete插件 2、Aptana Studio(其实就是eclipse + PyDE
最近试用了MindManager,感觉还是挺不错的,虽然还没能感觉到思维导图中的科学研究,但是蛮喜欢这种方式
小修小改列表如下 http://jedit.sourceforge.net/CHANGES43.txt 或者猛冲到此处下载 http://jedit.s
周海汉 /文 09.11.11 光棍节 ablozhou # gmail.com Wine 是一个在linux下模拟windows环境并执行wind
在初步看完 pro git 后,很被 git 的分布式仓库设计吸引,决定试用一下git,并将lite-ext 迁移到git
一。简介 google的一款安全扫描工具,项目地址在http://code.google.com/p/skipfish/ A fully autom
昨天看到了Office的下载地址,就安装了一个试了试,总体感觉和Office2007变化不大,外观配色上看起
由于工作需要,终于要开始使用大名鼎鼎的ubuntu了,从网上下了个ubuntu-12.04.3-desktop-amd64,通
最近项目中需要进行性能优化,用到了googleperftools,它可以对cpu的使用率进行统计,这里简要记录
在2014年的最后一天360发布了360ForLinux,虽然已经好多年没有用过该公司的产品(身边很多人用,有
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号