博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用 Perl 来开发 Nginx 的模块
阅读量:6209 次
发布时间:2019-06-21

本文共 4016 字,大约阅读时间需要 13 分钟。

hot3.png

现在使用 Nginx 的网站多了,所以我们试下,来使用 Perl 来开发 Nginx 的模块.比如可以做一些个性的设置,防盗链,SSI ,Header 替换之类一些特别的作用.另外,我们还可以使用 Nginx 加 Perl 来做一些动态的程序的处理.我近来就想使用这个来开发 Mogilefs 的接口.

配置 Nginx 来支持动态 Perl 很容易的,当然,我们得先下 Nginx 自己来编一个.因为 Nginx 更新太快,不要使用 RPM 了…

配置和安装很容易,不细讲,经典三步

./configure --with-http_perl_modulemakemake install

如果编码提示需要 ExtUtils::Embed 的话,记的使用 cpanm 来安装这个模块

 

 安装后,只要修改一下 Nginx 的配置就可以工作了,有二种方法

看如下的例子,就会了.

1. Nginx 配置文件直接操作 Perl 

其中 perl 和 perl_set 是第一种方法,直接给要写的子函数写到 Nginx 的文件中.语法是: 
perl  在 Nginx 的 localion 中,不想使用外部文件显示文件,可以使用

perl '        sub {            $r = shift;            # 正常的子函数处理            return 404; # HTTP 的响应码        }   ';

perl_set 来设置 Nginx 的变量

perl_set $value '      # value 是 nginx 本身的变量用来存 perl 语法改变的值    sub {        my $r = shift;        return "xxx";# 返回的内容会存到 $value 中         }';

2.  在 Nginx 中调用外面的 Perl 来使用

直接在 server 中的 location 中配置写上 perl 处理用的模块名,语法是: 
perl 模块名::handler

第二种方法,需要在配置中写上 perl_require 在 Nginx 启动时加载什么模块,还需要用 perl_modules 来指定,从那个目录中读.如下写的是 perl/lib ,其实是指地你的安装目录下的 perl/lib 目录来找 hello.pm 这个模块.

例如:/usr/local/nginx/perl/lib

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;    }  }}

如果我们使用第二种方法来处理,需要给 hello.pm 的模块放到 <A style="BOX-SIZING: border-box; TEXT-TRANSFORM: none; BACKGROUND-COLOR: rgb(255,255,255); TEXT-INDENT: 0px; FONT: 14px/20px 'Microsoft Yahei', 'WenQuanYi Zen Hei', SimSun; WHITE-SPACE: normal; LETTER-SPACING: normal; COLOR: rgb(51,122,183); WORD-SPACING: 0px; TEXT-DECORATION: none; -webkit-text-stroke-width: 0px" title=/usr/local/nginx/perl/lib>/usr/local/nginx/perl/lib 下.这个模块的写法,和普通的 Perl 的写法是一样的.但是有一点要注意,就是一定要 use nginx;

例如:

package hello;use nginx;  sub handler {  my $r = shift;  $r->send_http_header('Content-Type', 'text/html; charset=utf-8');  return OK if $r->header_only;    $r->print("hello!\n");  $r->rflush;    if (-f $r->filename or -d _) {    $r->print($r->uri, " exists!\n");  }    return OK;}  1;__END__

 实战:

我们来使用这个来过滤我的网站,设置 15 秒的过程值
如果打开的 t 后面加的时间过期超过 15 秒的时间,就会 403 来 deny.不然正常打开网页

http://www.php-oa.com:8080/?t=1306138966

下面是 nginx 的主配置,程序就要本身

perl_set $time_check '     sub {         my $r = shift;         my $args = $r->args;         if ($args =~ /t=(\d+)/){             my $time = $1;             if ( abs( $time - time() ) < 15 ){                 return 0;               }         }         return 1;     } ';  keepalive_timeout  65; server {     listen       8080;     server_name  _;     root   /usr/local/nginx/html;     if ($time_check = 1){         return 403;     }     location / {         # perl  hello::handler;     }

 备注: use nginx 可以调用的对象

当我们 use nginx 时,会有如下的对象可以调用.方便我们写程序

我们见到上面 shift 一个对象到 $r 上,我们就以 $r 来,说明有那些对象可以调用:

    • $r->args – 请求的参数 .

    • $r->discard_request_body – 这个参数是让 Nginx 放弃 request 的 body 的内容.

    • $r->filename – 返回合适的请求文件的名字

    • $r->has_request_body(function) – 如果没有请求主体,返回0,但是如果请求主体存在,那么建立传递的函数并返回1,在程序的最后,nginx将调用指定的处理器.

    • $r->header_in(header) – 查找请求头的信息

    • $r->header_only – 如果我们只要返回一个响应的头

    • $r->header_out(header, value) – 设置响应的头

    • $r->internal_redirect(uri) – 使内部重定向到指定的URI,重定向仅在完成perl脚本后发生.可以使用 header_out(Location….的方法来让浏览器自己重定向

    • $r->print(args, …) – 发送数据给客户端

    • $r->request_body – 得到客户端提交过来的内容 (body 的参数,可能需要修改 nginx 的 client_body_buffer_size. )

    • $r->request_body_file —给客户的 body 存成文件,并返回文件名

    • $r->request_method — 得到请求 HTTP method.

    • $r->remote_addr – 得到客户端的 IP 地址.

    • $r->rflush – 立即传送数据给客户端

    • $r->sendfile(file [, displacement [, length ] ) – 传送给客户端指定文件的内容,可选的参数表明只传送数据的偏移量与长度,精确的传递仅在perl脚本执行完毕后生效.这可是所谓的高级功能啊

    • $r->send_http_header(type) – 添加一个回应的 http 头的信息

    • $r->sleep(milliseconds, handler) – 设置为请求在指定的时间使用指定的处理方法和停止处理,在此期间nginx将继续处理其他的请求,超过指定的时间后,nginx将运行安装的处理方法,注意你需要为处理方法通过一个reference,在处理器间转发数据你可以使用$r->variable().

    • $r->status(code) – 设置 http 的响应码

    • $r->unescape(text) – 使用 http 方法加密内容如 %XX

    • $r->uri – 得到请求的 URL.

    • $r->variable(name[, value]) – 设置变量的值

转载于:https://my.oschina.net/liangzi1210/blog/411402

你可能感兴趣的文章
开发者论坛一周精粹(第五期):安全组规则让你的win主机更安全
查看>>
海子-JVM的内存区域划分
查看>>
广东横琴新区地税局打造“大数据下纳税遵从管理”
查看>>
深究移动终端大数据:如何做到忠诚度领先?
查看>>
《OSPF和IS-IS详解》一2.7 BGP-IGP的路由交换
查看>>
苹果遭铁杆粉丝吐糟:软件水平江河日下
查看>>
《善用佳软:高效能人士的软件应用之道》一2.1 LibreOffice:开源社区主导的OpenOffice分支...
查看>>
《Windows 程序设计(第3版)》——6.7 【实例】窗口查看器
查看>>
Gauge —— Go 开发的跨平台测试自动化工具
查看>>
《相关性准则——大数据时代的高效能之道》一一2.3 时间管理基础
查看>>
Web 调试代理 Betwixt.js
查看>>
我不是个内向的程序员,我只是很忙
查看>>
《淘宝店铺营销推广一册通》一2.3 热门赚钱行业网店成功秘诀
查看>>
程序员如何活得明白
查看>>
《软件定义网络:基于OpenFlow的SDN》一一1.5 北向接口
查看>>
《用友ERP-U8(8.72版)标准财务模拟实训》——第1章 安装用友软件 1.1 用友ERP-U8(8.72版)简介...
查看>>
Mozilla 开发者网络今天10岁了
查看>>
使用js控制表单重复提交(1加锁,2事件方式,3 EasyUI中解决表单重复提交)
查看>>
《数据科学:R语言实现》——3.3 转换数据类型
查看>>
《游戏大师Chris Crawford谈互动叙事》一9.1 文字冒险游戏
查看>>