See sample_httpd.conf for examples

The basic module loading directive is
    LoadModule lua_module modules/mod_lua.so

The handler name is "lua-script" so you can use the normal
AddHandler directive, such as "AddHandler lua-script .lua" to
set anything ending in .lua to use mod_lua to evaluate

mod_lua exports several additional directives:

    LuaRoot /path/to/a/directory
        Specify the base path which will be used to evaluate all
        relative paths within mod_lua. If not specified they
        will be resolved relative to the current working directory,
        which may not always work well for a server.

    LuaScope once|request|conn|server [max|min max]
        Specify the lifecycle scope of the Lua interpreter which will
        be used by handlers in this "Directory." The default is "once"
        
        once: use the interpreter once and throw it away.
        
        request: use the interpreter to handle anything based on 
                 the same file within this request, which is also 
                 request scoped.
                 
        conn: Same as request but attached to the connection_rec
        
        server: This one is different than others because the
                server scope is quite long lived, and multiple threads
                will have the same server_rec. To accommodate this
                server scoped interpreter are stored in an apr
                resource list. The min and max arguments are intended
                to specify the pool size, but are unused at this time.

    LuaMapHandler uri-pattern /path/to/lua/script.lua [function-name]
        This directive matches a uri pattern to invoke a specific
        handler function in a specific file. It uses PCRE regular
        expressions to match the uri, and supports interpolating
        match groups into both the file path and the function name
        be careful writing your regular expressions to avoid security
        issues.
        
        Examples:
            LuaMapHandler /(\w+)/(/w+) /scripts/$1.lua handle_$2
                This would match uri's such as /photos/show?id=9
                to the file /scripts/photos.lua and invoke the
                handler function handle_show on the lua vm after
                loading that file.
                
            LuaMapHandler /bingo /scripts/wombat.lua
                This would invoke the "handle" function, which
                is the default if no specific function name is
                provided.
    
    LuaPackagePath /path/to/include/?.lua
        Add a path to lua's module search path. Follows the same
        conventions as lua. This just munges the package.path in the 
        lua vms.
        
        Examples:
            LuaPackagePath /scripts/lib/?.lua
            LuaPackagePath /scripts/lib/?/init.lua

    LuaPackageCPath /path/to/include/?.soa
        Add a path to lua's shared library search path. Follows the same
        conventions as lua. This just munges the package.cpath in the 
        lua vms.
        
        Examples:
            LuaPackagePath /scripts/lib/?.so

    LuaCodeCache stat|forever|never
        Specify the behavior of the in-memory code cache. The default
        is stat, which stats the top level script (not any included
        ones) each time that file is needed, and reloads it if the
        modified time indicates it is newer than the one it has
        already loaded. The other values cause it to keep the file
        cached forever (don't stat and replace) or to never cache the 
        file.
        
        In general stat or forever is good production and stat or never
        for development.
        
        Examples:
            LuaCodeCache stat
            LuaCodeCache forever
            LuaCodeCache never
    
    LuaHookTranslateName  /path/to/lua/script.lua  hook_function_name
        Add a hook (at APR_HOOK_MIDDLE) to the translate name phase of
        request processing. The hook function receives a single
        argument, the request_rec, and should return a status code, 
        which is either an HTTP error code, or the constants defined
        in the apache2 module: apache2.OK, apache2.DECLINED, or
        apache2.DONE. 

        For those new to hooks, basically each hook will be invoked
        until one of them returns apache2.OK. If your hook doesn't
        want to do the translation it should just return
        apache2.DECLINED. If the request should stop processing, then
        return apache2.DONE.

        Example:
            LuaHookTranslateName /scripts/conf/hooks.lua silly_mapper

            -- /scripts/conf/hooks.lua --
            function silly_mapper(r)
                if r.uri == "/" then
                    r.file = "/var/www/home.lua"
                    return apache2.OK
                else
                    return apache2.DECLINED
                end
            end

    LuaHookFixups  /path/to/lua/script.lua  hook_function_name
        Just like LuaHookTranslateName, but executed at the fixups phase

    LuaHookMapToStorage  /path/to/lua/script.lua  hook_function_name
        ...

    LuaHookCheckUserID  /path/to/lua/script.lua  hook_function_name
        ...

    LuaHookTypeChecker  /path/to/lua/script.lua  hook_function_name
        ...

    LuaHookAuthChecker  /path/to/lua/script.lua  hook_function_name
        ...

    LuaHookAccessChecker  /path/to/lua/script.lua  hook_function_name
        ...

    LuaHookAuthChecker  /path/to/lua/script.lua  hook_function_name
        ...

    LuaHookInsertFilter  /path/to/lua/script.lua  hook_function_name
        Not Yet Implemented
 
