HttpLuaModule——翻译(Nginx API for Lua)

发布于 2014-02-06  102 次阅读


各种各样的*_by_lua和*_by_lua_file配置文件服务在都在nginx.conf文件内。这些LUA API只能运行在这些配置文件里面。
这个API有两个标准的包NGX和NDK。这个包在ngx_lua内默认的包。
这个软件包可以这样的引入外部的文件
    local say = ngx.say

    module(...)

    function foo(a)
        say(a)
    end
强烈不推荐使用package.seeall标志,这样会引起很多意想不到的后果。
也可以直接引用LUA包:
    local ngx = require "ngx"
    local ndk = require "ndk"
在我们的代码里面使用网络I/O操作时,最好使用LUA的API,因为NGINX是非阻塞的,如果不这样做可能死循环或者导致性能的直线下降。磁盘操作的数据量相对较小,可以采用标准的Lua的IO库,但巨大的文件阅读和写作应尽可能避免。强烈建议所有的网络和磁盘I/O操作Nginx的子请求(通过ngx.location.capture方法和类似)的最大性能。

ngx.arg
语法:val = ngx.arg[index]
环境:set_by_lua*,body_filter_by_lua*

当它运行在set_by_lua或者set_by_lua_file指令的时候,这个table是只读的并且包括配置指令的输入参数,例如:value = ngx.arg[n]
这里有个例子:
    location /foo {
        set $a 32;
        set $b 56;

        set_by_lua $res
            'return tonumber(ngx.arg[1]) + tonumber(ngx.arg[2])'
            $a $b;

        echo $sum;
    }
输出的结果是 88
当这ngx.arg是根据body_filter_by_lua或body_filter_by_lua_file的上下文使用,第一个元素,在过滤器的输出代码中保存的输入数据块和所述第二元件持有“EOF”的标志,表示整个输出数据流的结束的布尔标志。
数据块和“EOF”标志传递给下游的Nginx的输出滤波器,直接对应的表元素赋值,也可以覆盖。当设置为零或空的Lua字符串值ngx.arg的[1],没有数据块会被传递给所有的下游的Nginx的输出滤波器。