技术头条 - 一个快速在微博传播文章的方式     搜索本站
您现在的位置首页 --> 其他 --> 使用 Perl 来开发 Nginx 的模块

使用 Perl 来开发 Nginx 的模块

浏览:3308次  出处信息

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

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

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

./configure --with-http_perl_module
make
make install

 

 

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

看如下的例子,就会了。

1.  其中 perl_set 是第一种方法,直接给要写的子函数写到 Nginx 的文件中。语法是:
perl_set 函数名 sub { 函数内容 }.

2.  第二种方法,直接在 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__

 

 

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]) - 设置变量的值

建议继续学习:

  1. 配置Nginx+uwsgi更方便地部署python应用    (阅读:105407)
  2. 搜狐闪电邮箱的 Nginx/Postfix 使用模式    (阅读:32532)
  3. 解析nginx负载均衡    (阅读:14527)
  4. 在Apache2.2.XX下安装Mod-myvhost模块    (阅读:11720)
  5. Nginx模块开发入门    (阅读:9888)
  6. perl更新/修改/删除文本文件内容    (阅读:9443)
  7. 检查nginx配置,重载配置以及重启的方法    (阅读:9109)
  8. Cacti 添加 Nginx 监控    (阅读:8925)
  9. Nginx+FastCgi+Php 的工作机制    (阅读:8862)
  10. nginx的配置文件    (阅读:8838)
QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
© 2009 - 2024 by blogread.cn 微博:@IT技术博客大学习

京ICP备15002552号-1