使用 Perl 来开发 Nginx 的模块
来源:互联网 发布:猫猫包袋淘宝 编辑:程序博客网 时间:2024/05/17 06:34
现在使用 Nginx 的网站多了,所以我们试下,来使用 Perl 来开发 Nginx 的模块.比如可以做一些个性的设置,防盗链,SSI ,Header 替换之类一些特别的作用.另外,我们还可以使用 Nginx 加 Perl 来做一些动态的程序的处理.我近来就想使用这个来开发 Mogilefs 的接口
配置 Nginx 来支持动态 Perl 很容易的,当然,我们得先下 Nginx 自己来编一个.因为 Nginx 更新太快,不要使用 RPM 了…
配置和安装很容易,不细讲,经典三步
如果编码提示需要 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 来设置 Nginx 的变量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 的模块放到 /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.不然正常打开网页
下面是 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]) – 设置变量的值
如果我们使用第二种方法来处理,需要给 hello.pm 的模块放到 /usr/local/nginx/perl/lib 下.这个模块的写法,和普通的 Perl 的写法是一样的.但是有一点要注意,就是一定要 use nginx;
例如:如果我们使用第二种方法来处理,需要给 hello.pm 的模块放到 /usr/local/nginx/perl/lib 下.这个模块的写法,和普通的 Perl 的写法是一样的.但是有一点要注意,就是一定要 use nginx;
例如:如果我们使用第二种方法来处理,需要给 hello.pm 的模块放到 /usr/local/nginx/perl/lib 下.这个模块的写法,和普通的 Perl 的写法是一样的.但是有一点要注意,就是一定要 use nginx;
例如:
- 使用 Perl 来开发 Nginx 的模块
- 使用perl的Mail::SendEasy模块来发送邮件
- nginx模块开发--定时器的使用
- nginx的模块开发
- Nginx的模块开发指南
- Nginx模块开发 从url变量中key的值 来确定upstream服务器
- perl中LWP模块的使用
- Perl中LWP模块的使用
- perl File::Tail模块的使用
- perl 中 CGI 模块的使用简介
- nginx 限速模块的使用
- 使用 Nginx 和 GeoIP 模块来处理不同国家的访问1
- 使用 Nginx 和 GeoIP 模块来处理不同国家的访问2
- perl模块使用入门
- perl 模块使用范例
- perl模块 Getopt::Std模块的使用
- Perl模块的安装
- Perl模块的维护
- delphi 队列技术验证
- 【mysql】mysql存储过程in、out、inout参数使用
- Hdu 1022 - Train Problem I
- 加框
- 递归算法转换成非递归算法
- 使用 Perl 来开发 Nginx 的模块
- linux 系统调用跟踪---strace
- [cisily online]1021. Couples
- ARM协处理器
- 项目3:汉诺塔
- 扫描端口
- antlr-2.7.6.jar的作用
- 非完美C++ Singleton实现
- java利用正则表达式判断输入的日期格式为yyyy/MM/dd