使用 Perl 来开发 Nginx 的模块
现在使用 Nginx 的网站多了,所以我们试下,来使用 Perl 来开发 Nginx 的模块.比如可以做一些个性的设置,防盗链,SSI,Header 替换之类一些特别的作用.另外,我们还可以使用 Nginx 加 Perl 来做一些动态的程序的处理.我近来就想使用这个来开发 Mogilefs 的接口. 配置 Nginx 来支持动态 Perl 很容易的,当然,我们得先下 Nginx 自己来编一个.因为 Nginx 更新太快,不要使用 RPM 了… 配置和安装很容易,不细讲,经典三步 ./configure?--with-http_perl_module make make?install 如果编码提示需要 ExtUtils::Embed 的话,记的使用 cpanm 来安装这个模块 ?安装后,只要修改一下 Nginx 的配置就可以工作了,有二种方法 看如下的例子,就会了. 1. Nginx 配置文件直接操作 Perl? 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 来使用 第二种方法,需要在配置中写上 perl_require 在 Nginx 启动时加载什么模块,还需要用 perl_modules 来指定,从那个目录中读.如下写的是 perl/lib,其实是指地你的安装目录下的 perl/lib 目录来找 hello.pm 这个模块. 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); TEXT-INDENT: 0px; FONT: 14px/20px 'Microsoft Yahei',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__ ?实战: 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 可以调用的对象 我们见到上面 shift 一个对象到 $r 上,我们就以 $r 来,说明有那些对象可以调用:
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |