手把手教你Nginx常用模块详解之ngx_http_perl_module(九)

简介: 手把手教你Nginx常用模块详解之ngx_http_perl_module(九)

本专栏非常感谢大家得关注和支持,本人开源项目站点https://erosbt.com 将自己热爱与信仰的技术,持续不辍地传递。


Nginx专栏



一. 指令


ngx_http_perl_module

该ngx_http_perl_module模块用于在Perl中实现位置和变量处理程序,并将Perl调用插入到SSI中。


该模块不是默认生成的,它应该使用–with-http_perl_module配置参数启用。


二. 语法


句法: perl module :: function ‘sub {…}’;
默认:—
语境: 位置,limit_except

为给定位置设置一个Perl处理程序。

句法: perl_modules路径;
默认:
语境: HTTP

为Perl模块设置额外的路径。

句法: perl_require模块;
默认:
语境: HTTP

定义每次重新配置期间将要加载的模块的名称。有几个perl_require指令可以存在。

句法: perl_set $ variable module :: function ‘sub {…}’;
默认:
语境: HTTP

为指定变量安装一个Perl处理程序。

从SSI调用Perl

调用Perl的SSI命令具有以下格式:

<!--# perl sub="module::function" arg="parameter1" arg="parameter2" ...
-->

$ r请求对象方法

r − > a r g s 返回请求参数。 r->args 返回请求参数。r>args返回请求参数。r->filename返回与请求URI相对应的文件名。如果请求中没有主体,则返回0。如果存在主体,则为请求设置指定的处理程序,并返回1。读取请求体后,nginx将调用指定的处理程序。请注意,处理函数应该通过引用传递。例:$r->has_request_body(handler)

package hello;
use nginx;
sub handler {
    my $r = shift;
    if ($r->request_method ne "POST") {
        return DECLINED;
    }
    if ($r->has_request_body(\&post)) {
        return OK;
    }
    return HTTP_BAD_REQUEST;
}
sub post {
    my $r = shift;
    $r->send_http_header;
    $r->print("request_body: \"", $r->request_body, "\"<br/>");
    $r->print("request_body_file: \"", $r->request_body_file, "\"<br/>\n");
    return OK;
}

$ r-> allow_ranges允许在发送响应时使用字节范围。 $ r-> discard_request_body指示nginx放弃请求主体。 $ r-> header_in(field)返回指定的客户端请求头字段的值。 $ r-> header_only决定整个响应还是只有它的头部应该被发送到客户端。 $ r-> header_out(field,value)为指定的响应头字段设置一个值。 $ r-> internal_redirect(uri)执行内部重定向到指定的uri。 在Perl处理程序执行完成后发生实际的重定向。


目前不支持重定向到指定位置。


$ r-> log_error(errno,message)将指定的消息写入error_log。如果errno不为零,则错误代码及其描述将被附加到消息中。 $ r-> print(text,…)将数据传递给客户端。如果没有写入临时文件,$ r-> request_body返回客户端请求主体。为了确保客户端请求主体在内存中,其大小应该由client_max_body_size来限制,并且应该使用client_body_buffer_size来设置足够的缓冲区大小。 $ r-> request_body_file返回文件的名称与客户端请求主体。处理完成后,该文件应该被删除。要始终将请求主体写入文件,应启用client_body_in_file_only。 $ r-> request_method返回客户端请求的HTTP方法。 $ r-> remote_addr返回客户端IP地址。 $ r-> flush立即向客户端发送数据。 $ r-> sendfile(name [,offset [,length]])将指定的文件内容发送到客户端。可选参数指定要传输的数据的初始偏移量和长度。实际的数据传输发生在Perl处理程序完成之后。 $ r-> send_http_header([type])将响应头发送给客户端。可选的类型参数设置“Content-Type”响应头字段的值。如果该值为空字符串,则不会发送“Content-Type”标题字段。 $ r->状态(代码)设置响应代码。 $ r-> sleep(毫秒,处理程序)设置指定的处理程序并停止指定时间的请求处理。与此同时,nginx继续处理其他请求。经过指定的时间后,nginx将调用已安装的处理程序。请注意,处理函数应该通过引用传递。为了在处理程序之间传递数据,应该使用$ r-> variable()。例:

package hello;
use nginx;
sub handler {
    my $r = shift;
    $r->discard_request_body;
    $r->variable("var", "OK");
    $r->sleep(1000, \&next);
    return OK;
}
sub next {
    my $r = shift;
    $r->send_http_header;
    $r->print($r->variable("var"));
    return OK;
}

$ r-> unescape(文本)解码以“%XX”格式编码的文本。 $ r-> uri返回一个请求URI。 $ r-> variable(name [,value])返回或设置指定变量的值。 每个请求的变量都是本地的。


三. 示例


  http {
    perl_modules perl/lib;
    perl_require hello.pm;
    perl_set $msie6 '
        sub {
            my $r = shift;
            my $ua = $r->header_in("User-Agent");
            return "" if $ua =~ /Opera/;
            return "1" if $ua =~ / MSIE [6-9]\.\d+/;
            return "";
        }
    ';
    server {
        location / {
            perl hello::handler;
        }
    }

该perl/lib/hello.pm模块:

package hello;
use nginx;
sub handler {
    my $r = shift;
    $r->send_http_header("text/html");
    return OK if $r->header_only;
    $r->print("hello!\n<br/>");
    if (-f $r->filename or -d _) {
        $r->print($r->uri, " exists!\n");
    }
    return OK;
}

以上更多详解请大家关注nginx官方网站https://nginx.org/en/docs/


    以上就是我们今天的教程,如果本文对你有所帮助,欢迎关注点赞,分享给您身边的朋友。您的鼓励就是对我的最大动力。

相关文章
|
2月前
|
负载均衡 应用服务中间件 API
Nginx:location配置模块的用法(一)
Nginx:location配置模块的用法(一)
257 2
|
2月前
|
缓存 应用服务中间件 nginx
安装nginx-http-flv-module模块
本文介绍如何为Nginx安装`nginx-http-flv-module`模块。此模块基于`nginx-rtmp-module`二次开发,不仅具备原模块的所有功能,还支持HTTP-FLV播放、GOP缓存、虚拟主机等功能。安装步骤包括:确认Nginx版本、下载相应版本的Nginx与模块源码、重新编译Nginx并加入新模块、验证模块安装成功。特别注意,此模块已包含`nginx-rtmp-module`功能,无需重复编译安装。
91 1
|
2月前
|
JSON API 数据格式
Python网络编程:HTTP请求(requests模块)
在现代编程中,HTTP请求几乎无处不在。无论是数据抓取、API调用还是与远程服务器进行交互,HTTP请求都是不可或缺的一部分。在Python中,requests模块被广泛认为是发送HTTP请求的最简便和强大的工具之一。本文将详细介绍requests模块的功能,并通过一个综合示例展示其应用。
|
2月前
|
负载均衡 应用服务中间件 Linux
在Linux中,常用的 Nginx 模块有哪些,常来做什么?
在Linux中,常用的 Nginx 模块有哪些,常来做什么?
|
2月前
|
缓存 应用服务中间件 API
Nginx七层(应用层)反向代理:HTTP反向代理proxy_pass篇(三)
Nginx七层(应用层)反向代理:HTTP反向代理proxy_pass篇(三)
34 3
|
2月前
|
缓存 前端开发 应用服务中间件
Nginx:location配置模块的用法(二)
Nginx:location配置模块的用法(二)
46 2
|
2月前
|
缓存 安全 应用服务中间件
Nginx七层(应用层)反向代理:HTTP反向代理proxy_pass篇(二)
Nginx七层(应用层)反向代理:HTTP反向代理proxy_pass篇(二)
31 1
|
2月前
|
运维 算法 应用服务中间件
运维系列.Nginx中使用HTTP压缩功能(一)
运维系列.Nginx中使用HTTP压缩功能(一)
35 1
|
2月前
|
缓存 应用服务中间件 nginx
[nginx]定制http头信息
[nginx]定制http头信息
|
3月前
|
应用服务中间件 Linux nginx
FFmpeg开发笔记(四十)Nginx集成rtmp模块实现RTMP推拉流
《FFmpeg开发实战》书中介绍了如何使用FFmpeg向网络推流,简单流媒体服务器MediaMTX不适用于复杂业务。nginx-rtmp是Nginx的RTMP模块,提供基本流媒体服务。要在Linux上集成rtmp,需从官方下载nginx和nginx-rtmp-module源码,解压后在nginx目录配置并添加rtmp模块,编译安装。配置nginx.conf启用RTMP服务,监听1935端口。使用ffmpeg推流测试,如能通过VLC播放,表明nginx-rtmp运行正常。更多详情见书本。
90 0
FFmpeg开发笔记(四十)Nginx集成rtmp模块实现RTMP推拉流
下一篇
无影云桌面