lua possibilities/limitations

agentzh agentzh at gmail.com
Mon Jul 4 13:30:50 MSD 2011


On Tue, Feb 15, 2011 at 12:27 PM, agentzh <agentzh at gmail.com> wrote:
> On Tue, Feb 15, 2011 at 7:46 AM, Richard Kearsley
> <Richard.Kearsley at m247.com> wrote:
>>
>> Is there something special with $limit_rate stopping me to set it? Is it a
>> string/int issue?
>>
>
> Yeah, $limit_rate is a special variable defined in the http core module:
>
>    http://wiki.nginx.org/NginxHttpCoreModule#.24limit_rate
>
> For now, ngx_lua's "ngx.var.foo = xxx" assignment does not support
> such special variables. This will change in a future release.
>

I've just committed a fix for nginx variable assignment in Lua to
ngx_lua's git master HEAD. Now all the nginx variables with a
set_handler is properly handled (like $args and $limit_rate).
Furthermore, only changeable nginx variables will be honored, so
writing to $arg_PARAM will result in a Lua exception (ready to be
caught by pcall/xpcall if LuaJIT 2.0 is used).

Here's the modified version of your sample config that should work for you:

    location /proxy {
        proxy_pass http://127.0.0.1:8012/;
    }

    location /main {
        set $limit_rate 99;
        rewrite_by_lua '
            local res = ngx.location.capture("/proxy",{ args = { bla =
"moo" } })
            if res.status == ngx.HTTP_OK then
                for k,v in pairs(res.header) do
                     if k == "X-Limit-Rate" then
                          ngx.var.limit_rate = v
                     end
                end

                return
            end

            ngx.exit(res.status)
    ';

    add_header X-Limit $limit_rate;
}

My modifications mainly correct the following mistake in your previous sample:

* content_by_lua always runs in the content phase while ngx_rewrite's
"set" command always runs at the earlier rewrite phase. So your
content_by_lua will always run *after* your "set" commands even if you
put it before them.

As a bonus, I also add reading support for nginx regex group capturing
variables like $1, $2, $3, and etc, in Lua.

Happy Lua hacking!

Best,
-agentzh



More information about the nginx mailing list