OpenResty released

Hi folks

I am happy to announce the new formal release,, of the
OpenResty web platform based on NGINX and Lua:

Both the (portable) source code distribution and the Win32 binary
distribution are provided there.

Special thanks go to all our contributors and users around the globe.

This is the first OpenResty formal version based on the NGINX 1.9.7

One highlight of this version is the reduction of in-pool memory
allocations in the cosocket implementation to support long-running
requests (like C2000K in a single box, as tested by one of our team

Also we include various small features like,
ngx.worker.count(), ngx.timer.pending_count(),
ngx.timer.running_count(), ngx.redirect(uri, 307), and etc.

Changes since the last (formal) release,

  • upgraded the Nginx core to 1.9.7.

  • “./configure”: now we automatically set the environment
    “MACOSX_DEPLOYMENT_TARGET” to the current Mac OS X version
    (unless the environment is already set) to ensure the LuaJIT
    build uses the current versions of the system libraries. thanks
    bsyk for the report.

  • win32: use Windows line breaks in the “resty” script file of the
    binary distribution.

  • win32: upgraded pcre to 8.38 and openssl to 1.0.2e.

  • win32: enabled ngx_http_realip_module, ngx_http_addition_module
    ngx_http_sub_module, and ngx_http_stub_status_module in the
    win32 binary package by default.

  • upgraded the ngx_lua module to 0.9.20.

    • feature: added new API functions ngx.worker.count() and for returning the total count of nginx
      worker processes and the ordinal number (0, 1, 2, and etc)
      of the current worker. thanks YuanSheng Wang for the patch.
      also added pure C API for them.

    • feature: added new API functions ngx.timer.pending_count()
      and ngx.timer.running_count(). thanks Simon Eskildsen for
      the patch.

    • feature: added new config directive
      access_by_lua_no_postpone. thanks Delta Y. for the patch.

    • feature: added new constant “ngx.HTTP_TEMPORARY_REDIRECT”
      (307) and support for 307 in ngx.redirect(). thanks RocFang
      for the patch.

    • feature: added new API function ngx.req.is_internal() for
      testing if the current request is an internal request.
      thanks Ruoshan Huang for the patch.

    • feature: added many more HTTP status constants as
      “ngx.HTTP_XXX”. thanks Vadim A. Misbakh-Soloviov for the

    • bugfix: bogus “nginx.conf” parse failure “Lua code block
      missing the “}” character” might happen when there are many
      Lua code blocks inlined. thanks Andreas Lubbe for the

    • bugfix: bogus “subrequests cycle” errors might occur with
      nginx 1.9.5+ due to the recent changes in the nginx core.

    • bugfix: ngx.req.get_uri_args/ngx.req.get_post_args: avoided
      allocating a zero-size buffer in the nginx memory pool since
      it might cause problems. thanks Chuanwen Chen for the report
      and patch.

    • bugfix: modifying the built-in header “X-Forwarded-For” via
      ngx.req.set_header() or ngx.req.clear_header() might not
      take effect in some parts of the nginx core (like
      $proxy_add_x_forwarded_for). thanks aviramc for the patch.

    • bugfix: we lacked detailed context info in error messages
      due to use of disabled Lua API in body_filter_by_lua*.
      thanks Dejiang Zhu for the patch.

    • bugfix: fixed a potential data alignment issue in the
      ngx.var setter API.

    • bugfix: we had data alignment issues in the subrequest API
      which can explode on systems like ARM. thanks Stefan P.
      for providing the test environment.

    • bugfix: there was a data alignment issue in the
      tcpsock:setkeepalive() implementation which might lead to
      crashes on ARM systems. thanks Stefan P. for the report.

    • bugfix: fixed C compiler warnings “comparison between signed
      and unsigned integer expressions” on Windows.

    • optimize: avoided allocating in the nginx request memory
      pool in stream-typed cosockets’ receive*() methods. thanks
      Lourival Vieira Neto for the patch.

    • optimize: reduced memory allocations in stream-typed
      cosockets. thanks Dejiang Zhu for the patch.

      • avoided allocating the host name buffer when getting
        peers from the connection pool.

      • recycled the stream cosockets’ request cleanup records.

    • doc: documented the minimum size threshold in
      lua_shared_dict. thanks mlr3000 for the original patch.

  • upgraded the lua-resty-core library to 0.1.3.

    • Makefile: added support for relative paths in “LUA_LIB_DIR”.

    • minor code adjustments from Aapo Talvensaari.

  • upgraded the ngx_headers_more module to 0.29.

    • bugfix: changing the built-in header “X-Forwarded-For” via
      more_set_input_headers or more_clear_input_headers might not
      take effect in some parts of the nginx core (like
  • upgraded the lua-resty-redis library to 0.22.

    • tweaked Makefile to allow relative paths in “LUA_LIB_DIR”
      when “DESTDIR” is not specified.

    • optimize: moved string concatenation for the Redis request
      construction onto the C land (taking advantage of the
      feature that cosockets’ send method accepts a table of
      strings). thanks Dejiang Zhu for the patch.

    • optimize: minor optimizations from Aapo Talvensaari.

  • upgraded resty-cli to 0.05.

    • bugfix: resty: nginx might report the error “The system
      cannot find the file specified” in “CreateFile()” on Windows
      XP. thanks cover_eye for the report.
  • upgraded LuaJIT to v2.1-20151219:
    Tags · openresty/luajit2 · GitHub

    • Makefile: ensure we always install the symbolic link for the
      “luajit” file.

    • imported Mike Pall’s latest changes:

      • FFI: Fix SPLIT pass for CONV i64.u64.

      • x64 LJ_GC64: Fix stack growth in vararg function setup.

      • DynASM/x86: Add rdpmc instruction.

      • OSX: Switch to Clang as the default compiler.

      • iOS: Disable os.execute() when building for iOS >= 8.0.

      • x86/x64: Disassemble AVX AVX2 instructions.

      • DynASM/x86: Add AVX and AVX2 opcodes.

      • DynASM/x86: Add AES-NI opcodes.

      • DynASM/x86: Restrict shld/shrd to operands with same

      • DynASM/x86: Fix some SSE instruction templates.

      • Fix pairs() recording.

      • FFI: Fix ipairs() recording.

      • Drop marks from replayed instructions when sinking.

The HTML version of the change log with lots of helpful hyper-links
can be browsed here:

OpenResty (aka. ngx_openresty) is a full-fledged web platform
by bundling the standard Nginx core, Lua/LuaJIT, lots of
3rd-party Nginx modules and Lua libraries, as well as most of their
dependencies. See OpenResty’s homepage for details:

We have run extensive testing on our Amazon EC2 test cluster and
ensured that all the components (including the Nginx core) play well
together. The latest test report can always be found here:


And Merry Christmas if you celebrate it.

Best regards,