After more than one week's active development, I'm happy to announce
that the new development version of ngx_openresty, 18.104.22.168, is now
Below is the change log for this release, as compared to the last release,
* upgraded LuaNginxModule to 0.5.0rc32.
* bugfix: header_filter_by_lua and its friend would leak
memory when it is the only directive of LuaNginxModule
configured in a location and the ngx.ctx API is also used
* bugfix: Lua global variables was dangerously shared by all
the concurrent requests if the special "_G" table was used
in all those *_by_lua and *_by_lua_file directives. thanks
chaoslawful for the patches. but please also note that "_G"
is still shared among all the requests if used in the
context of Lua modules, just like all those Lua module level
* bugfix: the ngx.arg API was not usable within external Lua
module files in set_by_lua or set_by_lua_file.
* bugfix: unexpected values on the Lua stack might be
concatenated when generating tracebacks for Lua errors and
the Lua VM would crash when there happened to be values on
the Lua stack that could not be concatenated (like "nil").
* bugfix: the Lua main thread stack might leak when
header_filter_by_lua or header_filter_by_lua_file are used.
* bugfix: the Lua VM might crash when calling the cosocket
methods with a bad-typed "self" argument.
* bufix: fixed the directive context for set_by_lua and
set_by_lua_file. they really work in the contexts "server",
"server if", "location", and "location if". thanks Liu
* feature: added new directives log_by_lua and log_by_lua_file
to support user Lua code running at the "log" request
processing phase. thanks Matthieu Tourne for the patches.
* feature: added new directives body_filter_by_lua and
body_filter_by_lua_file to allow the user implement nginx
output body filters in pure Lua.
* feature: added support for loading Lua/LuaJIT raw bytecode
files automatically in all those *_by_lua_file config
directives. thanks jinglong and chaoslawful for the patches.
benchmark results have shown that, for very big Lua-based
web applications, bytecode loading gives an order of
magnitude speedup at first requests that trigger the Lua
* feature: added new directive
lua_transform_underscores_in_response_headers. thanks Kindy
* optimize: now we no longer register the "ndk" and "ngx" API
for set_by_lua* and header_filter_by_lua* at config time
rather than request time. this makes these directives 200+%
* optimize: eliminated unnecessary string concatenations when
generating tracebacks for Lua errors.
* optimize: now we store the metatables for ngx.req.socket()
and ngx.socket.tcp() objects into the Lua registry.
* optimize: changed the string keys to light userdata for
various tracking tables (coroutines table, regex cache
table, cosocket connection pool table, ngx.ctx table, and
etc). This gives minor performance improvement from
eliminating key hashing and etc. thanks Dirk Feytons.
* diagnosis: now we issue user-friendly error messages when
the Nginx Lua APIs are used in the wrong configure directive
contexts (e.g., using ngx.location.capture in set_by_lua).
* docs: fixed a typo: ngx.now returns time of the resolution
of milliseconds, rather than microseconds. thanks Wang Xi.
* docs: added a note for installation with Lua 5.1 on ubuntu
11.10. thanks Dan Sosedoff.
* updated nginx-1.0.15-poll_del_event_at_exit.patch. thanks Maxim
The HTML version of the change log with lots of useful hyper-links can
be browsed here:
Special thanks go to all our contributors and users for helping make this
OpenResty (aka. ngx_openresty) is a full-fledged web application server by
bundling the standard Nginx core, lots of 3rd-party Nginx modules, as well
as most of their external dependencies. See OpenResty's homepage for more