Luaw stands for "Lua web server". It also matches abbreviation for an air traffic controller command "Line Up And Wait" that closely resembles the way it handles multiple requests using event loop :)
Luaw is an event driven, non blocking IO based HTTP application server inspired by Node.js. It uses Node.js's excellent async library libuv to do non-blocking IO but instead of Javascript it uses Lua as its primary language for application development. Luaw takes advantage of Lua's first class coroutine support to avoid callback spaghetti problem. This makes writing async IO code as straight forward as writing sequential code while all the heavy-lifting of application state management is transparently handled by Lua coroutines. This mean a Luaw application developer gets best of both worlds - scale of event driven IO and code simplicity of blocking IO.
##Features
- Full HTTP 1.1 support with persistent/keep-alive connections and HTTP pipelining with configurable connect and read timeouts.
- Two ways to read and parse incoming HTTP requests,
- Reading whole request in memory and then parsing it which is suitable for majority of applications.
- Reading request as a stream and parsing it as it arrives in parts to minimize latency and server memory footprint for high traffic, high performance applications like HTTP proxies or HTTP load balancers.
- Similarly on the output side it supports,
- Buffering entire content in memory before writing it out to client with the correct "Content-Length" header, or
- Streaming response continuously as it is generated using HTTP 1.1 chunked encoding to keep server memory pressure minimum.
- Fully asynchronous DNS and HTTP client for making remote HTTP calls from server
- Sinatra like web application framework that supports mapping URLs to REST resources with full support for path and query parameters.
- Luaw template views for server side dynamic content generation . Luaw template views use streaming output with chunked encoding described above to eliminate need for huge server side memory buffers to buffer output generated by the templates.
- Support for spawning user threads that can hook into Luaw's async IO machinery for calling multiple backend services from Luaw server in parallel.
- Support for user timers for implementing periodic cron like jobs inside Luaw server.
- Log4j like logging framework with configurable log levels, log file size limits and automatic log rotation that integrates with syslog out of the box.
- MessagePack like library to efficiently serialize/deserialize arbitrarily complex data into compact and portable binary format for remote web service calls.
- Built in multipart file upload support.
##How To Build
-
Get necessary build tools. libuv, one of the Luaw dependencies uses autotools, autoconf and libtoolize in its build system. If your machine is not already setup with these, you can use following steps to get these tools.
sudo apt-get install make sudo apt-get install autotools-dev sudo apt-get install autoconf sudo apt-get install build-essential libtool
-
Clone Luaw repository
git clone --recursive https://github.com/raksoras/luaw.git
-
Build Luaw to use standard PUC-Rio Lua VM
cd luaw make linux
or, build Luaw to use LuaJit VM
cd luaw make LUAVM=luajit linux
While building on mac OS use target "macosx". For example
cd luaw make LUAVM=luajit macosx
-
Install Luaw binary - luaw_server - in directory of your choice. We will use
~/luawsample
in all our examples going forward as a directory of choice for Luaw installationmake INSTALL_ROOT=~/luawsample install
To install binaries along with the sample app provided
make INSTALL_ROOT=~/luawsample install-sample
##Luaw directory structure
In the tree diagram below ~/luawsample
is a directory that you chose in the make intsall
step above. It will act as a root for Luaw server's directory structure. The make install
step will create following directory structure under ~/luawsample
~/luawsample
|
|
+--- bin Directory that holds Luaw server binary we built
| along with all necessary Lua libraries
|
+--- conf Directory for server configuration
| |
│ +--- server.cfg Sample server configuration file, to be used as a starting point
|
+--- lib Directory to install any third party or user supplied Lua
| libraries that application may depend on.
|
+--- logs Directory for server logs
|
+--- webapps Directory to install Luaw webapps
##License
Luaw uses MIT license for all parts of Luaw that are not externally maintained libraries like libuv.
Please refer to the project wiki for documentation regarding how to build, configure, start and program using Luaw.
Please post your questions/comments on Google Group Luaw and follow @raksoras on Twitter