`

nginx_perl试用

阅读更多

因为空闲时间比较多,所以在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流媒体安装包(nginx_mod_h264_streaming,yamdi)

    Nginx_mod_h264_streaming是Nginx的一个扩展模块,专为支持H.264编码的流媒体内容设计。该模块允许Nginx直接处理H.264编码的视频流,提供HTTP Live Streaming (HLS)或MPEG-DASH服务,这两种协议广泛应用于移动端和...

    Nginx安装+nginx_upstream_check_module后端健康检查

    patch -p0 < ../nginx_upstream_check_module-master/check_1.9.2+.patch ./configure --prefix=/usr/local/nginx \ --with-http_ssl_module --with-http_stub_status_module --with-pcre \ --with-...

    nginx_tcp_proxy_module-master.zip

    nginx_tcp_proxy_module-master.zip

    nginx_upstream_check_module

    但是,原始的`upstream`模块并不具备健康检查功能,这就是`nginx_upstream_check_module`的用武之地。 ### Nginx Upstream Check Module特性 1. **健康检查**:该模块可以定期向后端服务器发送探测请求,如...

    nginx_upstream_hash-0.3.2.tar.gz

    《深入解析nginx_upstream_hash模块:打造高效负载均衡策略》 在互联网服务中,nginx作为一款高性能的HTTP和反向代理服务器,广泛应用于各种复杂的网络架构中。为了满足动态负载均衡的需求,nginx提供了丰富的...

    nginx.config_nginx_

    **Nginx基础配置与参数说明** Nginx是一款高性能的HTTP和反向代理服务器,以其轻量级、高并发处理能力以及优秀的稳定性而被广泛应用于互联网服务中。本文将详细解析`nginx.config`文件中的核心配置选项和参数,帮助...

    nginx_http_push_module

    1. **下载源码**:获取`nginx_http_push_module`的最新版本,例如`nginx_http_push_module-0.692`。 2. **编译Nginx**:将模块源码添加到Nginx的配置文件中,然后重新编译Nginx,确保模块被正确集成。 3. **配置...

    nginxdocker镜像(nginx-upstream-check健康检查)

    官方nginx 镜像不带主动健康,本镜像将 nginx_upstream_check健康检查 打包到了镜像中。

    nginx_tcp_proxy_module-master

    1. **获取源码**:首先,你需要从项目仓库下载`nginx_tcp_proxy_module`的源代码,如本例中的`nginx_tcp_proxy_module-master`压缩包。 2. **编译Nginx**:在编译Nginx时,将模块源码添加到配置中。这通常涉及以下...

    Nginx_upstream_hash-0.3.1.tar.gz

    在标题和描述中提到的"Nginx_upstream_hash-0.3.1.tar.gz"是一个Nginx的第三方模块,它扩展了upstream模块的功能,引入了基于URL哈希的分发策略。这个模块的版本为0.3.1,表明它是该功能的一个特定实现。 这个模块...

    nginx_upstream_check_module-master.zip

    nginx自带是没有针对负载均衡后端节点的健康检查的,但是可以通过默认自带的ngx_http_proxy_module 模块和ngx_http_upstream_module模块中的相关指令来完成当后端节点出现故障时,自动切换到健康节点来提供访问。

    nginx_mod_h264_streaming-2.2.7

    **Nginx_mod_h264_streaming-2.2.7 模块详解** `nginx_mod_h264_streaming-2.2.7` 是一个针对 Nginx 的扩展模块,它专为实现高效的 H264 视频流媒体服务而设计。H264,全称为 High Efficiency Video Coding(高效...

    nginx_upload_module-2.2.0.tar.gz

    安装 `nginx_upload_module` 需要先解压 `nginx_upload_module-2.2.0.tar.gz` 文件,然后在 Nginx 的源码构建过程中添加该模块。这通常涉及以下步骤: - 下载并解压 Nginx 源码。 - 将解压后的 `nginx_upload_module...

    nginx_upstream_check_module-master

    `nginx_upstream_check_module-master` 是一个由淘宝技术团队开发的Nginx扩展模块,主要用于健康检查和负载均衡器中的服务器状态监控。这个模块对于运行大规模分布式系统,尤其是那些依赖Nginx作为反向代理和负载...

    nginx_1.7.11.3_Gryphon.zip

    在这个名为 "nginx_1.7.11.3_Gryphon.zip" 的压缩包中,我们聚焦于 Nginx 的一个特定版本——1.7.11.3,它被特别优化用于媒体直播服务器。与 FFmpeg 集成后,这一版本的 Nginx 可以提供强大的流媒体服务功能。 1. *...

    05尚硅谷_Nginx_hit1qr_nginx尚硅谷_nginx_

    在“05尚硅谷_Nginx_hit1qr_nginx尚硅谷_nginx_”的学习资源中,我们将深入探讨 Nginx 的安装、配置以及如何实现负载均衡。 **一、Nginx 的安装** Nginx 的安装通常分为编译安装和使用软件包管理器安装两种方式。...

    nginx_upstream_check.tar.gz

    docker容器中编译安装第三方后端检查模块nginx_upstream_check_module 使用方法见:https://blog.csdn.net/pcn01/article/details/105182600

    一个工作在nginx_tcp中的集群聊天服务器,数据库用mysql部署,网络通信采用muduo和json消息作为通信协议.zip

    一个工作在nginx_tcp中的集群聊天服务器,数据库用mysql部署,网络通信采用muduo和json消息作为通信协议 一个工作在nginx_tcp中的集群聊天服务器,数据库用mysql部署,网络通信采用muduo和json消息作为通信协议 一个...

Global site tag (gtag.js) - Google Analytics