Nginx Lua脚本编程

Nginx 很 cool 的一点就是可以通过在请求处理的各个阶段插入 Lua 脚本来控制它的功能。我已成功使用 rewrite_by_lua/file 指令来检查传入请求的正文并注入下游处理 PHP 的额外请求头。例如:

location /api{
  rewrite_by_lua_file "/path/to/rewrite.lua";
  lua_need_request_body "on";

}

然后在 rewrite.lua 中:

local uri = ngx.var.request_uri;
//检查 URI 并注入额外的头
ngx.req.set_header('headerName','headerValue');

此时,我也可以注入响应头。例如,

local cookieData = "cookieName=value;path=/;";
ngx.header['Set-Cookie'] = cookieData;

到目前为止还没有任何问题,但这并不是我想要做的。我想要的工作流程是这样的:

  • 检查 URI 并注入额外的请求头。
  • 我的 PHP 脚本检查额外的请求头,根据要求处理传入的数据,可能会注入额外的响应头。
  • 然后我想在另一个 Nginx Lua 脚本中检查响应头,并注入 cookie。

通过我的 PHP 脚本注入额外的响应头没有任何问题。我认为为了检查那些额外的头,我只需要设置

location /api {
  header_filter_by_lua_file "path/to/header.lua";
}

使用 header.lua 处理:

local cookieData = "cookieName=value;path=/;";
ngx.header['Set-Cookie'] = cookieData;

原则听起来完美。然而,我发现我的 header_filter_by_lua_file 指令被忽略了——重载配置时没有在 Nginx 日志中报告任何错误。

我一定在这里做错了什么,但我无法看出可能的错误。我使用的是 nginx 1.6.2 在 Ubuntu 14.10 上(x64)。Nginx 是通过 apt-get install nginx-extras 安装的。

如果有人能解释如何正确使用 header_filter_by_*,我将不胜感激。

点赞
用户282536
用户282536

这不是标准版 nginx 的特性。您需要安装 openresty(而不是 nginx)。

请参见 http://openresty.org/#Download 然后查看 http://openresty.org/#Installation

2015-12-02 05:01:31