Skip to content

A high-performance, multithreaded FastCGI server with stateful Lua scripts

License

Notifications You must be signed in to change notification settings

EssGeeEich/luafcgid2

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Summary

luafcgid2 is a multithreaded FastCGI server that runs under BSD/Linux. It manages a number of independent, persistent Lua states, that are then loaded with Lua scripts from the file system. These scripts are loaded/initialized on demand, and held in memory for as long as possible. The Lua scripts are also allowed to interface with the FastCGI libraries: thus providing an extremely fast, streamlined and lightweight platform from which to develop web-centric apps in Lua.

License

See the LICENSE file included with the source code

Testing

All development testing is done with a Raspberry Pi Zero W, and sometimes on a Debian x64 distro.

Software:

  • Debian Stretch
  • nginx web server
  • Lua 5.3

Installation

On Debian Stretch (including Raspbian Stretch), simply run the following:

# apt-get -y install libfcgi-dev liblua5.3-dev git make build-essential
$ git clone --recursive https://github.com/EssGeeEich/luafcgid2.git
$ cd luafcgid2
$ make
# make install install-daemon

You may need to tinker with the Makefile on other distros.

If you just want to update the daemon, without touching the configuration files, you can do the following:

$ make clean; make
# make update

Webserver (nginx):

Add the following lines to your /etc/nginx/sites-available/your-site-here in the server{} section:

location ~ \.lua$ {
	fastcgi_pass   unix:/var/tmp/luafcgid2.sock;
	fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
	include        fastcgi_params;
}

NOTE: make sure your root directive is set correctly, and the DOCUMENT_ROOT variable is set correctly

Design

luafcgid2 spawns and manages a number of worker threads that each contain an isolated blocking accept loop. The FastCGI libraries provide a connect queue for each worker thread so that transient load spikes can be handled with a minimum of fuss.

Lua is then introduced into the picture by created a shared Lua state for each Lua script that is requested. A script will be loaded multiple times. All scripts - including duplicates (clones) - are completely isolated from each other. After a state is initialized and loaded with a script, it is usually kept in memory forever. Each Lua VM is run within a worker thread as needed. The use of on-demand clones allows for multiple workers to run the same popular script. There is a configurable limit to the total number of Lua states that luafcgid will maintain. When this limit is reached, a new state gets generated at runtime.

About

A high-performance, multithreaded FastCGI server with stateful Lua scripts

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages

  • C++ 83.5%
  • Shell 6.8%
  • Makefile 4.9%
  • Lua 4.8%