From 7f96b2532dc6b4403fcb2ac376ea1651017b2935 Mon Sep 17 00:00:00 2001 From: Daniel Gruno <humbedooh@apache.org> Date: Wed, 8 Aug 2012 19:18:41 +0000 Subject: [PATCH] xforms git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1370901 13f79535-47bb-0310-9956-ffa450edef68 --- docs/manual/developer/lua.html.en | 665 +++++------------------------- 1 file changed, 99 insertions(+), 566 deletions(-) diff --git a/docs/manual/developer/lua.html.en b/docs/manual/developer/lua.html.en index 4f1787c10a..3150424374 100644 --- a/docs/manual/developer/lua.html.en +++ b/docs/manual/developer/lua.html.en @@ -28,6 +28,7 @@ additional ways of using mod_lua for writing hooks and scripts.</p> </div> <div id="quickview"><ul id="toc"><li><img alt="" src="../images/down.gif" /> <a href="#introduction">Introduction</a></li> +<li><img alt="" src="../images/down.gif" /> <a href="#enabling">Optimizing mod_lua for production servers</a></li> <li><img alt="" src="../images/down.gif" /> <a href="#basic_remap">Example 1: A basic remapping module</a></li> <li><img alt="" src="../images/down.gif" /> <a href="#mass_vhost">Example 2: Mass virtual hosting</a></li> <li><img alt="" src="../images/down.gif" /> <a href="#basic_auth">Example 3: A basic authorization hook</a></li> @@ -51,13 +52,11 @@ Stuff about what <code class="module"><a href="../mod/mod_lua.html">mod_lua</a>< <h3><a name="contents" id="contents">What we will be discussing in this document</a></h3> <p> -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 <code class="module"><a href="../mod/mod_lua.html">mod_lua</a></code> 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. </p> -<p> -In the second part of this document, we will be looking at bla bla bla -</p> <h3><a name="prerequisites" id="prerequisites">Prerequisites</a></h3> @@ -72,12 +71,90 @@ and whys of various function calls. -<h3><a name="enabling" id="enabling">Enabling mod_lua</a></h3> - +</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div> +<div class="section"> +<h2><a name="enabling" id="enabling">Optimizing mod_lua for production servers</a></h2> + +<h3>Setting a scope for Lua states</h3> +<p> +Setting the right <code class="directive"><a href="../mod/mod_lua.html#luascope">LuaScope</a></code> setting +for your Lua scripts can be essential to your server's +performance. By default, the scope is set to <code>once</code>, 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 <code>thread</code>, +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 <code>server</code> +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: +</p> <pre class="prettyprint lang-config"> -LoadModule lua_module modules/mod_lua.so +LuaScope once +LuaScope thread +LuaScope server 5 40 </pre> +<p> +As a general rule of thumb: If your server has none to low usage, use <code>once</code> +or <code>request</code>, if your server has low to medium usage, use the <code>server</code> +pool, and if it has high usage, use the <code>thread</code> setting. As your server's +load increases, so will the number of states being actively used, and having your scope +set to <code>once/request/conn</code> will stop being beneficial to your memory footprint. +</p> +<p> +<strong>Note:</strong> The <code>min</code> and <code>max</code> settings for the +<code>server</code> scope denotes the minimum and maximum states to keep in a pool per +server <em>process</em>, so keep this below your <code>ThreadsPerChild</code> limit. +</p> + + +<h3>Using code caching</h3> +<p> +By default, <code class="module"><a href="../mod/mod_lua.html">mod_lua</a></code> 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 <code class="directive"><a href="../mod/mod_lua.html#luacodecache">LuaCodeCache</a></code> 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 <code>forever</code> 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 <code>lua-script</code> handler, the increase in performance +may be negligible, as files httpd will stat the files regardless. +</p> + + +<h3>Keeping the scope clean</h3> +<p> +For maximum performance, it is generally recommended that any initialization of libraries, +constants and master tables be kept outside the handle's scope: +</p> +<pre class="prettyprint lang-lua"> +--[[ This is good practice ]]-- +require "string" +require "someLibrary" +local masterTable = {} +local constant = "Foo bar baz" + +function handle(r) + do_stuff() +end +</pre> + +<pre class="prettyprint lang-lua"> +--[[ This is bad practice ]]-- +require "string" + +function handle(r) + require "someLibrary" + local masterTable = {} + local constant = "Foo bar baz" + do_stuff() +end +</pre> @@ -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 <pre class="prettyprint lang-lua"> -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 <pre class="prettyprint lang-lua"> --- 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 <pre class="prettyprint lang-lua"> +--[[ + 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" <h2><a name="Request_handling" id="Request_handling">HTTPd bindings: Request handling</a></h2> <p> -<a href="#apache2.sendfile">apache2.sendfile</a> -<br /> -<a href="#apache2.port">apache2.port</a> -<br /> -<a href="#apache2.options">apache2.options</a> -<br /> -<a href="#apache2.allowoverrides">apache2.allowoverrides</a> -<br /> <a href="#apache2.requestbody">apache2.requestbody</a> <br /> <a href="#apache2.add_input_filter">apache2.add_input_filter</a> <br /> <a href="#apache2.get_basic_auth_pw">apache2.get_basic_auth_pw</a> <br /> -<a href="#apache2.get_limit_req_body">apache2.get_limit_req_body</a> -<br /> -<a href="#apache2.request_has_body">apache2.request_has_body</a> -<br /> <a href="#apache2.set_document_root">apache2.set_document_root</a> <br /> -<a href="#apache2.some_auth_required">apache2.some_auth_required</a> -<br /> <a href="#apache2.set_context_prefix">apache2.set_context_prefix</a> <br /> <a href="#apache2.get_server_name_for_url">apache2.get_server_name_for_url</a> @@ -857,18 +919,8 @@ print(unescaped) -- prints "This is a test" <br /> <a href="#apache2.make_etag">apache2.make_etag</a> <br /> -<a href="#apache2.flush">apache2.flush</a> -<br /> <a href="#apache2.send_interim_response">apache2.send_interim_response</a> <br /> -<a href="#apache2.get_server_name">apache2.get_server_name</a> -<br /> -<a href="#apache2.auth_type">apache2.auth_type</a> -<br /> -<a href="#apache2.auth_name">apache2.auth_name</a> -<br /> -<a href="#apache2.satisfies">apache2.satisfies</a> -<br /> </p> <h3><a name="apache2.add_input_filter" id="apache2.add_input_filter">apache2.add_input_filter( request_rec<em> r</em>, string<em> filter</em> @@ -904,131 +956,6 @@ apache2.add_input_filter(r, "SPAM_FILTER") -- Check input for spam..? <p> </p> -<h3><a name="apache2.allowoverrides" id="apache2.allowoverrides">apache2.allowoverrides( - request_rec<em> r</em> - ) - </a></h3> - -<p> -Returns the currently allowed overrides for this context (AuthCfg, Options etc) - </p> -<p> -<em>Arguments:</em> -</p> -<table class="bordered"> -<tr> -<th>Argument</th> -<th>Description</th> -</tr> -<tr> -<td>r</td> -<td>The mod_lua request handle</td> -</tr> -</table> -<p> -<em>Return value(s):</em> -<br /> -The currently allowed overrides for this context (AuthCfg, Options etc) - </p> -<p> -<em>Example:</em> -</p> -<pre class="prettyprint lang-lua"> -local ctx = apache2.allowoverrides(r) -if ctx:match("AuthCfg") then - r:puts("You are allowed to override AuthCfg stuff in your .htaccess") -end - </pre> - -<p> </p> - -<h3><a name="apache2.auth_name" id="apache2.auth_name">apache2.auth_name( - request_rec<em> r</em> - ) - </a></h3> - -<p> -Returns the current Authorization realm - </p> -<p> -<em>Arguments:</em> -</p> -<table class="bordered"> -<tr> -<th>Argument</th> -<th>Description</th> -</tr> -<tr> -<td>r</td> -<td>The mod_lua request handle</td> -</tr> -</table> -<p> -<em>Return value(s):</em> -<br /> -The current authorization realm - </p> -<p> </p> - -<h3><a name="apache2.auth_type" id="apache2.auth_type">apache2.auth_type( - request_rec<em> r</em> - ) - </a></h3> - -<p> -Returns the current authentication type used in the request - </p> -<p> -<em>Arguments:</em> -</p> -<table class="bordered"> -<tr> -<th>Argument</th> -<th>Description</th> -</tr> -<tr> -<td>r</td> -<td>The mod_lua request handle</td> -</tr> -</table> -<p> -<em>Return value(s):</em> -<br /> -The current Authorization type used in the request - </p> -<p> </p> - -<h3><a name="apache2.flush" id="apache2.flush">apache2.flush( - request_rec<em> r</em> - ) - </a></h3> - -<p> -Flushes the content buffer, writing everything to the client immediately. - </p> -<p> -<em>Arguments:</em> -</p> -<table class="bordered"> -<tr> -<th>Argument</th> -<th>Description</th> -</tr> -<tr> -<td>r</td> -<td>The mod_lua request handle</td> -</tr> -</table> -<p> -<em>Example:</em> -</p> -<pre class="prettyprint lang-lua"> -r:puts("This is buffered") -apache2.flush(r) -- now it's written to the client. - </pre> - -<p> </p> - <h3><a name="apache2.get_basic_auth_pw" id="apache2.get_basic_auth_pw">apache2.get_basic_auth_pw( request_rec<em> r</em> ) @@ -1057,78 +984,6 @@ The password from a basic authorization request or nil if none was supplied </p> <p> </p> -<h3><a name="apache2.get_limit_req_body" id="apache2.get_limit_req_body">apache2.get_limit_req_body( - request_rec<em> r</em> - ) - </a></h3> - -<p> -Returns the current request body size limit - </p> -<p> -<em>Arguments:</em> -</p> -<table class="bordered"> -<tr> -<th>Argument</th> -<th>Description</th> -</tr> -<tr> -<td>r</td> -<td>The mod_lua request handle</td> -</tr> -</table> -<p> -<em>Return value(s):</em> -<br /> -The current request body size limit - </p> -<p> -<em>Example:</em> -</p> -<pre class="prettyprint lang-lua"> -local limit = apache2.get_limit_req_body(r) -r:puts("You can't upload files bigger than ", limit, " bytes!") - </pre> - -<p> </p> - -<h3><a name="apache2.get_server_name" id="apache2.get_server_name">apache2.get_server_name( - request_rec<em> r</em> - ) - </a></h3> - -<p> -Returns the current server name from the request - </p> -<p> -<em>Arguments:</em> -</p> -<table class="bordered"> -<tr> -<th>Argument</th> -<th>Description</th> -</tr> -<tr> -<td>r</td> -<td>The mod_lua request handle</td> -</tr> -</table> -<p> -<em>Return value(s):</em> -<br /> -The server name - </p> -<p> -<em>Example:</em> -</p> -<pre class="prettyprint lang-lua"> -local name = apache2.get_server_name(r) -r:puts("The ServerName is set to: ", name) - </pre> - -<p> </p> - <h3><a name="apache2.get_server_name_for_url" id="apache2.get_server_name_for_url">apache2.get_server_name_for_url( request_rec<em> r</em> ) @@ -1185,117 +1040,6 @@ The entity tag </p> <p> </p> -<h3><a name="apache2.options" id="apache2.options">apache2.options( - request_rec<em> r</em> - ) - </a></h3> - -<p> -Returns the currently allowed options for this context (Indexes, MultiViews etc) - </p> -<p> -<em>Arguments:</em> -</p> -<table class="bordered"> -<tr> -<th>Argument</th> -<th>Description</th> -</tr> -<tr> -<td>r</td> -<td>The mod_lua request handle</td> -</tr> -</table> -<p> -<em>Return value(s):</em> -<br /> -The currently allowed options for this context. - </p> -<p> -<em>Example:</em> -</p> -<pre class="prettyprint lang-lua"> -local ctx = apache2.options(r) -if ctx:match("MultiViews") then - r:puts("MultiViews is enabled!") -end - </pre> - -<p> </p> - -<h3><a name="apache2.port" id="apache2.port">apache2.port( - request_rec<em> r</em> - ) - </a></h3> - -<p> -Returns the port currently being used by the request - </p> -<p> -<em>Arguments:</em> -</p> -<table class="bordered"> -<tr> -<th>Argument</th> -<th>Description</th> -</tr> -<tr> -<td>r</td> -<td>The mod_lua request handle</td> -</tr> -</table> -<p> -<em>Return value(s):</em> -<br /> -The current port used by the request - </p> -<p> -<em>Example:</em> -</p> -<pre class="prettyprint lang-lua"> -local port = apache2.port(r) -r:puts("We are listening on port ", port) - </pre> - -<p> </p> - -<h3><a name="apache2.request_has_body" id="apache2.request_has_body">apache2.request_has_body( - request_rec<em> r</em> - ) - </a></h3> - -<p> -Returns true if the request has a body(POST/PUT), false otherwise - </p> -<p> -<em>Arguments:</em> -</p> -<table class="bordered"> -<tr> -<th>Argument</th> -<th>Description</th> -</tr> -<tr> -<td>r</td> -<td>The mod_lua request handle</td> -</tr> -</table> -<p> -<em>Return value(s):</em> -<br /> -True if the request has a body(POST/PUT), false otherwise - </p> -<p> -<em>Example:</em> -</p> -<pre class="prettyprint lang-lua"> -if apache2.request_has_body(r) then - -- do stuff with the req body -end - </pre> - -<p> </p> - <h3><a name="apache2.requestbody" id="apache2.requestbody">apache2.requestbody( request_rec<em> r</em>, number<em> size</em>, string<em> filename</em> ) @@ -1345,44 +1089,6 @@ end <p> </p> -<h3><a name="apache2.satisfies" id="apache2.satisfies">apache2.satisfies( - request_rec<em> r</em> - ) - </a></h3> - -<p> -Returns how the requires lines must be met. - </p> -<p> -<em>Arguments:</em> -</p> -<table class="bordered"> -<tr> -<th>Argument</th> -<th>Description</th> -</tr> -<tr> -<td>r</td> -<td>The mod_lua request handle</td> -</tr> -</table> -<p> -<em>Return value(s):</em> -<br /> -How the requirements must be met (SATISFY_ANY, SATISFY_ALL, SATISFY_NOSPEC). - </p> -<p> -<em>Example:</em> -</p> -<pre class="prettyprint lang-lua"> -local how = apache2.satisfies(r) -if how == "SATISFY_ANY" then - -- ... -end - </pre> - -<p> </p> - <h3><a name="apache2.send_interim_response" id="apache2.send_interim_response">apache2.send_interim_response( request_rec<em> r</em>, boolean<em> send_headers</em> ) @@ -1417,40 +1123,6 @@ apache2.send_interim_response(r, false) <p> </p> -<h3><a name="apache2.sendfile" id="apache2.sendfile">apache2.sendfile( - request_rec<em> r</em>, string<em> filename</em> - ) - </a></h3> - -<p> -Sends a file to the client via sendfile() if possible. - </p> -<p> -<em>Arguments:</em> -</p> -<table class="bordered"> -<tr> -<th>Argument</th> -<th>Description</th> -</tr> -<tr> -<td>r</td> -<td>The mod_lua request handle</td> -</tr> -<tr> -<td>filename</td> -<td>The file to send</td> -</tr> -</table> -<p> -<em>Example:</em> -</p> -<pre class="prettyprint lang-lua"> -apache2.sendfile(r, "/foo/bar/test.png") -- sends /foo/bar/test.png via sendfile - </pre> - -<p> </p> - <h3><a name="apache2.set_context_prefix" id="apache2.set_context_prefix">apache2.set_context_prefix( request_rec<em> r</em>, string<em> prefix</em>, string<em> document</em> ) @@ -1547,43 +1219,6 @@ True if keepalive can be set, false otherwise </p> <p> </p> -<h3><a name="apache2.some_auth_required" id="apache2.some_auth_required">apache2.some_auth_required( - request_rec<em> r</em> - ) - </a></h3> - -<p> -Returns true if authorization is required for this request - </p> -<p> -<em>Arguments:</em> -</p> -<table class="bordered"> -<tr> -<th>Argument</th> -<th>Description</th> -</tr> -<tr> -<td>r</td> -<td>The mod_lua request handle</td> -</tr> -</table> -<p> -<em>Return value(s):</em> -<br /> -True if auth is required, false if not. - </p> -<p> -<em>Example:</em> -</p> -<pre class="prettyprint lang-lua"> -if apache2.some_auth_required(r) then - print("debug: auth is required for this request\n") -end - </pre> - -<p> </p> - </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div> <div class="section"> <h2><a name="Parser_functions" id="Parser_functions">HTTPd bindings: Parser functions</a></h2> @@ -1735,8 +1370,6 @@ end <p> <a href="#apache2.add_version_component">apache2.add_version_component</a> <br /> -<a href="#apache2.banner">apache2.banner</a> -<br /> <a href="#apache2.mpm_query">apache2.mpm_query</a> <br /> <a href="#apache2.terminate">apache2.terminate</a> @@ -1745,14 +1378,8 @@ end <br /> <a href="#apache2.scoreboard_worker">apache2.scoreboard_worker</a> <br /> -<a href="#apache2.started">apache2.started</a> -<br /> <a href="#apache2.module_info">apache2.module_info</a> <br /> -<a href="#apache2.get_server_built">apache2.get_server_built</a> -<br /> -<a href="#apache2.is_initial_req">apache2.is_initial_req</a> -<br /> <a href="#apache2.loaded_modules">apache2.loaded_modules</a> <br /> <a href="#apache2.runtime_dir_relative">apache2.runtime_dir_relative</a> @@ -1802,25 +1429,6 @@ end <p> </p> -<h3><a name="apache2.banner" id="apache2.banner">apache2.banner( - - ) - </a></h3> - -<p> -Returns the server banner - </p> -<p> -<em>Arguments:</em> -</p> -<p>None</p> -<p> -<em>Return value(s):</em> -<br /> -The server banner - </p> -<p> </p> - <h3><a name="apache2.custom_response" id="apache2.custom_response">apache2.custom_response( request_rec<em> r</em>, number<em> status</em>, string<em> string</em> ) @@ -1891,53 +1499,6 @@ end <p> </p> -<h3><a name="apache2.get_server_built" id="apache2.get_server_built">apache2.get_server_built( - - ) - </a></h3> - -<p> -Returns the date the server was built - </p> -<p> -<em>Arguments:</em> -</p> -<p>None</p> -<p> -<em>Return value(s):</em> -<br /> -The date the server was built - </p> -<p> </p> - -<h3><a name="apache2.is_initial_req" id="apache2.is_initial_req">apache2.is_initial_req( - request_rec<em> r</em> - ) - </a></h3> - -<p> -Returns true if this is the main request, false if it is a sub-request - </p> -<p> -<em>Arguments:</em> -</p> -<table class="bordered"> -<tr> -<th>Argument</th> -<th>Description</th> -</tr> -<tr> -<td>r</td> -<td>The mod_lua request handle</td> -</tr> -</table> -<p> -<em>Return value(s):</em> -<br /> -True if this is the main request, false if it is a sub-request - </p> -<p> </p> - <h3><a name="apache2.loaded_modules" id="apache2.loaded_modules">apache2.loaded_modules( ) @@ -2136,34 +1697,6 @@ A table with information about the server program </p> <p> </p> -<h3><a name="apache2.started" id="apache2.started">apache2.started( - request_rec<em> r</em> - ) - </a></h3> - -<p> -Returns the time when the server was (re)started - </p> -<p> -<em>Arguments:</em> -</p> -<table class="bordered"> -<tr> -<th>Argument</th> -<th>Description</th> -</tr> -<tr> -<td>r</td> -<td>The mod_lua request handle</td> -</tr> -</table> -<p> -<em>Return value(s):</em> -<br /> -The time when the server was (re)started - </p> -<p> </p> - <h3><a name="apache2.state_query" id="apache2.state_query">apache2.state_query( number<em> field</em> ) -- 2.40.0