Prof. Dr.-Ing. Oliver Radfelder
Informatik / Wirtschaftsinformatik
Hochschule Bremerhaven
Kurz und Knapp: Lua

Auch mit Lua lässt sich in unseren Docker-Containern eine Web-Seite ausliefern. Dort ist mod_lua installiert, so dass es ähnlich performant wie php funktioniert.

-- /var/www/html/docker-USER-web/demo.lua
function handle(r)
  r.content_type = "text/plain"

  if r.method == 'GET' then
    r:puts("Hello Lua World!\n")
    for k, v in pairs( r:parseargs() ) do
      r:puts( string.format("%s: %s\n", k, v) )
    end
  elseif r.method == 'POST' then
    r:puts("Hello Lua World!\n")
    for k, v in pairs( r:parsebody() ) do
      r:puts( string.format("%s: %s\n", k, v) )
    end
  else
    -- use the ErrorDocument
    return 501
  end
  return apache2.OK

end

Das Interessante an Lua ist aber eher, dass sich nicht nur Webseiten ausliefern lassen. Mit mod_lua lassen sich auch Handler in dem Apache registrieren, die zu bestimmten Zeiten der Verarbeitung im Server als Hooks aufgerufen werden.

mod_lua Dokumentation

Wenn man in der apache2.conf beispielsweise einen Hook hinterlegt:

LuaHookTranslateName /my/translatehandler.lua handle 

lässt sich der folgende Hook bei jedem Request aktivieren:

--/my/translatehandler
require 'apache2'
require 'string'

function handle(r)
	if string.match(r.uri,"^/docker-[^/]+-web/replace.txt$") then
	  r.filename = r.document_root .. "/replaced.txt"
	  return apache2.OK
	end
	return apache2.DECLINED
end

In den Docker-Containern ist eben jenes Skript exemplarisch als Translate-Handler eingebaut. Sie können es editieren, aber wenn es nicht mehr funktioniert, müssen Sie Ihren Docker-Container wieder aktivieren - die Dateien in /my werden also nicht gesichert.

curl https://informatik.hs-bremerhaven.de/docker-$USER-web/replace.txt

Lua lässt sich ebenfalls in haproxy nutzen: 5 ways to extend haproxy with lua

"With services, also known as applets, you can ask HAProxy to deliver a requests to your Lua script, which will then generate the response. No backend servers will be contacted. This is handy if you want to add some application logic to your proxy. Or, maybe you long for the old days of Apache + mod_php scripts. Who knows!"

Nun ja - wer auch immer damit gemeint ist ...

Eine Einführung in LuaLaTeX gibt es unter Introduction to LuaTeX.

Lua lässt sich in php als Sandbox einbinden:

$sandbox = new LuaSandbox;
$sandbox->setMemoryLimit( 5 * 1024 * 1024 );
$sandbox->setCPULimit( 10 );

function myfunction( $v ) {
    return  [ $v *10+3 ];
}

$sandbox->registerLibrary( 'php', [
    'myfunction' => 'myfunction',
    'output' => function ( $string ) {
        echo "$string\n";
    },
    'error' => function () {
        throw new LuaSandboxRuntimeError( "Something is wrong" );
    }
] );

// Execute some Lua code, including callbacks into PHP and into Lua
///php.output( "Hello, world" );

$luaCode = <<<EOF

return "Hello", function ( v )
    return php.myfunction( v *10 +2 )
end
EOF;

  list( $histring, $myfunc ) = $sandbox->loadString( $luaCode )->call();

  $result=$myfunc->call(1);
  echo "$histring ".$result[0]."\n";

  list( $ok, $message ) = $sandbox->loadString( 'return pcall( php.error )' )->call();

Sonstiges, wofür lua gut sein kann: nmap, minetest, pandoc, redis, prosody, torch, varnish, vim

Interessant zu lesen: a look at the design of lua

Interessant zu schauen: Lua Tutorial