From: Daniel Gruno
mod_lua<
What we will be discussing in this document
-This document will discuss how you can bla bla bla.
-In the first chapter, we will bla bla
+This document will discuss several cases where mod_lua
can be used
+to either ease up a phase of the request processing or create more transparency in
+the logic behind a decision made in a phase.
-
-In the second part of this document, we will be looking at bla bla bla
-
Prerequisites
@@ -72,12 +71,90 @@ and whys of various function calls.
-Enabling mod_lua
-
+
+Setting the right LuaScope
setting
+for your Lua scripts can be essential to your server's
+performance. By default, the scope is set to once
, which means
+that every call to a Lua script will spawn a new Lua state that handles that
+script and is destroyed immediately after. This option keeps the memory
+footprint of mod_lua low, but also affects the processing speed of a request.
+If you have the memory to spare, you can set the scope to thread
,
+which will make mod_lua spawn a Lua state that lasts the entirity of a thread's
+lifetime, speeding up request processing by 2-3 times. Since mod_lua will create
+a state for each script, this may be an expensive move, memory-wise, so to
+compromise between speed and memory usage, you can choose the server
+option to create a pool of Lua states to be used. Each request for a Lua script or
+a hook function will then acquire a state from the pool and release it back when it's
+done using it, allowing you to still gain a significant performance increase, while
+keeping your memory footprint low. Some examples of possible settings are:
+
-LoadModule lua_module modules/mod_lua.so +LuaScope once +LuaScope thread +LuaScope server 5 40+
+As a general rule of thumb: If your server has none to low usage, use once
+or request
, if your server has low to medium usage, use the server
+pool, and if it has high usage, use the thread
setting. As your server's
+load increases, so will the number of states being actively used, and having your scope
+set to once/request/conn
will stop being beneficial to your memory footprint.
+
+Note: The min
and max
settings for the
+server
scope denotes the minimum and maximum states to keep in a pool per
+server process, so keep this below your ThreadsPerChild
limit.
+
+By default, mod_lua
stats each Lua script to determine whether a reload
+(and thus, a re-interpretation and re-compilation) of a script is required. This is managed
+through the LuaCodeCache
directive. If you are running
+your scripts on a production server, and you do not need to update them regularly, it may be
+advantageous to set this directive to the forever
value, which will cause mod_lua
+to skip the stat process and always reuse the compiled byte-code from the first access to the
+script, thus speeding up the processing. For Lua hooks, this can prove to increase peformance,
+while for scripts handled by the lua-script
handler, the increase in performance
+may be negligible, as files httpd will stat the files regardless.
+
+For maximum performance, it is generally recommended that any initialization of libraries, +constants and master tables be kept outside the handle's scope: +
++--[[ This is good practice ]]-- +require "string" +require "someLibrary" +local masterTable = {} +local constant = "Foo bar baz" + +function handle(r) + do_stuff() +end ++ +
+--[[ This is bad practice ]]-- +require "string" + +function handle(r) + require "someLibrary" + local masterTable = {} + local constant = "Foo bar baz" + do_stuff() +end +@@ -101,8 +178,6 @@ LuaHookTranslateName /path/too/foo.lua remap This example will rewrite /foo/test.bar to the physical file /internal/test, somewhat like how mod_alias works. ]]-- -require 'apache2' -require 'string' function remap(r) -- Test if the URI matches our criteria @@ -125,8 +200,6 @@ end remap a file to one of two destinations, using a rewrite map. ]]-- -require 'apache2' -require 'string' local map = { photos = { @@ -190,8 +263,6 @@ LuaHookTranslateName /path/too/foo.lua mass_vhost This example will check a map for a virtual host and rewrite filename and document root accordingly. ]]-- -require 'apache2' -require 'string' local vhosts = { { domain = "example.com", home = "/www/example.com" }, @@ -226,8 +297,6 @@ end 60 seconds before checking for updates. For best performance, such scripts should generally be run with LuaScope set to 'thread' or 'server' ]]-- -require 'apache2' -require 'string' local cached_vhosts = {} local timeout = 60 @@ -282,9 +351,10 @@ LuaHookAuthChecker /path/too/foo.lua check_auth
-require 'apache2' -require 'string' - +--[[ + A simple authentication hook that checks a table containing usernames and + passwords of two accounts. +]]-- local accounts = { bob = 'somePassword', jane = 'Iloveponies' @@ -324,10 +394,10 @@ end--- An advanced authentication checker with a database backend, --- caching account entries for 1 minute -require 'apache2' -require 'string' +--[[ + An advanced authentication checker with a database backend, + caching account entries for 1 minute +]]-- local timeout = 60 -- Set account info to be refreshed every minute local accounts = {} @@ -402,6 +472,12 @@ LuaAuthzProvider rights /path/to/lua/script.lua rights_handler+--[[ + This script has two user groups; members and admins, and whichever + is refered to by the "Require rights" directive is checked to see + if the authenticated user belongs to this group. +]]-- + local members = { "rbowen", "humbedooh", "igalic", "covener" } local admins = { "humbedooh" } @@ -827,28 +903,14 @@ print(unescaped) -- prints "This is a test"HTTPd bindings: Request handling
-apache2.sendfile -
-apache2.port -
-apache2.options -
-apache2.allowoverrides -
apache2.requestbody
apache2.add_input_filter
apache2.get_basic_auth_pw
-apache2.get_limit_req_body -
-apache2.request_has_body -
apache2.set_document_root
-apache2.some_auth_required -
apache2.set_context_prefix
apache2.get_server_name_for_url @@ -857,18 +919,8 @@ print(unescaped) -- prints "This is a test"
apache2.make_etag
-apache2.flush -
apache2.send_interim_response
-apache2.get_server_name -
-apache2.auth_type -
-apache2.auth_name -
-apache2.satisfies -
apache2.add_input_filter( request_rec r, string filter @@ -904,131 +956,6 @@ apache2.add_input_filter(r, "SPAM_FILTER") -- Check input for spam..?
-
apache2.allowoverrides( - request_rec r - ) -
- --Returns the currently allowed overrides for this context (AuthCfg, Options etc) -
--Arguments: -
-
Argument | -Description | -
---|---|
r | -The mod_lua request handle | -
-Return value(s):
-
-The currently allowed overrides for this context (AuthCfg, Options etc)
-
-Example: -
--local ctx = apache2.allowoverrides(r) -if ctx:match("AuthCfg") then - r:puts("You are allowed to override AuthCfg stuff in your .htaccess") -end -- -
- -
-Returns the current Authorization realm -
--Arguments: -
-Argument | -Description | -
---|---|
r | -The mod_lua request handle | -
-Return value(s):
-
-The current authorization realm
-
- -
-Returns the current authentication type used in the request -
--Arguments: -
-Argument | -Description | -
---|---|
r | -The mod_lua request handle | -
-Return value(s):
-
-The current Authorization type used in the request
-
- -
-Flushes the content buffer, writing everything to the client immediately. -
--Arguments: -
-Argument | -Description | -
---|---|
r | -The mod_lua request handle | -
-Example: -
--r:puts("This is buffered") -apache2.flush(r) -- now it's written to the client. -- -
-
-
-Returns the current request body size limit -
--Arguments: -
-Argument | -Description | -
---|---|
r | -The mod_lua request handle | -
-Return value(s):
-
-The current request body size limit
-
-Example: -
--local limit = apache2.get_limit_req_body(r) -r:puts("You can't upload files bigger than ", limit, " bytes!") -- -
- -
-Returns the current server name from the request -
--Arguments: -
-Argument | -Description | -
---|---|
r | -The mod_lua request handle | -
-Return value(s):
-
-The server name
-
-Example: -
--local name = apache2.get_server_name(r) -r:puts("The ServerName is set to: ", name) -- -
-
-
-Returns the currently allowed options for this context (Indexes, MultiViews etc) -
--Arguments: -
-Argument | -Description | -
---|---|
r | -The mod_lua request handle | -
-Return value(s):
-
-The currently allowed options for this context.
-
-Example: -
--local ctx = apache2.options(r) -if ctx:match("MultiViews") then - r:puts("MultiViews is enabled!") -end -- -
- -
-Returns the port currently being used by the request -
--Arguments: -
-Argument | -Description | -
---|---|
r | -The mod_lua request handle | -
-Return value(s):
-
-The current port used by the request
-
-Example: -
--local port = apache2.port(r) -r:puts("We are listening on port ", port) -- -
- -
-Returns true if the request has a body(POST/PUT), false otherwise -
--Arguments: -
-Argument | -Description | -
---|---|
r | -The mod_lua request handle | -
-Return value(s):
-
-True if the request has a body(POST/PUT), false otherwise
-
-Example: -
--if apache2.request_has_body(r) then - -- do stuff with the req body -end -- -
-
-
-Returns how the requires lines must be met. -
--Arguments: -
-Argument | -Description | -
---|---|
r | -The mod_lua request handle | -
-Return value(s):
-
-How the requirements must be met (SATISFY_ANY, SATISFY_ALL, SATISFY_NOSPEC).
-
-Example: -
--local how = apache2.satisfies(r) -if how == "SATISFY_ANY" then - -- ... -end -- -
-
-
-Sends a file to the client via sendfile() if possible. -
--Arguments: -
-Argument | -Description | -
---|---|
r | -The mod_lua request handle | -
filename | -The file to send | -
-Example: -
--apache2.sendfile(r, "/foo/bar/test.png") -- sends /foo/bar/test.png via sendfile -- -
-
-
-Returns true if authorization is required for this request -
--Arguments: -
-Argument | -Description | -
---|---|
r | -The mod_lua request handle | -
-Return value(s):
-
-True if auth is required, false if not.
-
-Example: -
--if apache2.some_auth_required(r) then - print("debug: auth is required for this request\n") -end -- -
-
apache2.add_version_component
-apache2.banner
-
apache2.mpm_query
apache2.terminate
@@ -1745,14 +1378,8 @@ end
apache2.scoreboard_worker
-apache2.started
-
apache2.module_info
-apache2.get_server_built
-
-apache2.is_initial_req
-
apache2.loaded_modules
apache2.runtime_dir_relative
@@ -1802,25 +1429,6 @@ end
-
-Returns the server banner -
--Arguments: -
-None
-
-Return value(s):
-
-The server banner
-
-
-
-Returns the date the server was built -
--Arguments: -
-None
-
-Return value(s):
-
-The date the server was built
-
- -
-Returns true if this is the main request, false if it is a sub-request -
--Arguments: -
-Argument | -Description | -
---|---|
r | -The mod_lua request handle | -
-Return value(s):
-
-True if this is the main request, false if it is a sub-request
-
-
-
-Returns the time when the server was (re)started -
--Arguments: -
-Argument | -Description | -
---|---|
r | -The mod_lua request handle | -
-Return value(s):
-
-The time when the server was (re)started
-
-