IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

使用 Perl 来开发 Nginx 的模块

扶凯 2010-09-26 08:57:47 累计浏览 4,185 次
本机暂存

现在使用 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. SmartPerfetto 2026.06.04-07.17 六周更新复盘:从 v1.0.28 到 v1.1.1 (2026-07-17 00:00:00)
  2. 用 CLIProxyAPI 把 Codex 变成一个 OpenAI 兼容的 API 服务 (2026-07-12 22:05:00)
  3. 读完 Bun 用 Rust 重写:1 个人 11 天重写 50 万行代码是怎么做到的 (2026-07-12 08:00:00)

查看更多 后端 文章 →

建议继续学习

  1. 配置Nginx+uwsgi更方便地部署python应用 (累计阅读 107,669)
  2. 搜狐闪电邮箱的 Nginx/Postfix 使用模式 (累计阅读 33,963)
  3. 记录一个软中断问题 (累计阅读 17,014)
  4. 解析nginx负载均衡 (累计阅读 16,688)
  5. server日志的路径分析 (累计阅读 11,281)
  6. Nginx模块开发入门 (累计阅读 11,234)
  7. 检查nginx配置,重载配置以及重启的方法 (累计阅读 10,966)
  8. Cacti 添加 Nginx 监控 (累计阅读 10,753)
  9. perl更新/修改/删除文本文件内容 (累计阅读 10,700)
  10. fsockopen 异步处理 (累计阅读 10,409)