In this guide we create and deploy a simple Lua-based HTTP web server.
To run this example, follow these steps:
Install the kraft
CLI tool and a container runtime engine, e.g. Docker.
Clone the examples
repository and cd
into the examples/http-lua5.1/
directory:
git clone https://github.com/kraftcloud/examples
Make sure to log into Unikraft Cloud by setting your token and a metro close to you.
We use fra0
(Frankfurt, 🇩🇪) in this guide:
# Set Unikraft Cloud access token
# Set metro to Frankfurt, DE
When done, invoke the following command to deploy this application on Unikraft Cloud:
kraft cloud deploy -p 443:8080 .
The output shows the instance URL and other details:
[ ● ] Deployed successfully!
├ ────────── name : http-lua51-ma2i9
├ ────────── uuid : e7389eee-9808-4152-b2ec-1f3c0541fd05
├ ───────── state : running
├ ─────────── url : https://young-night-5fpf0jj8.fra0.kraft.host
├ ───────── image : http-lua51@sha256:278cb8b14f9faf9c2702dddd8bfb6124912d82c11b4a2c6590b6e32fc4049472
├ ───── boot time : 15.09 ms
├ ──────── memory : 128 MiB
├ ─────── service : young-night-5fpf0jj8
├ ── private fqdn : http-lua51-ma2i9.internal
├ ──── private ip : 172.16.3.3
└ ────────── args : /usr/bin/lua /http_server.lua
In this case, the instance name is http-lua51-ma2i9
and the URL is https://young-night-5fpf0jj8.fra0.kraft.host
.
They are different for each run.
Use curl
to query the Unikraft Cloud instance of the Lua-based HTTP web server:
curl https://young-night-5fpf0jj8.fra0.kraft.host
At any point in time, you can list information about the instance:
kraft cloud instance list
NAME FQDN STATE CREATED AT IMAGE MEMORY ARGS BOOT TIME
http-lua51-ma2i9 young-night-5fpf0jj8.fra0.kraft.host running 1 minute ago http-lua51@sha256:278cb8b14f9faf9c27... 128 MiB /usr/bin/lua /http_server.lua 15094us
When done, you can remove the instance:
kraft cloud instance remove http-lua51-ma2i9
Customize your Application
To customize the application, update the files in the repository, listed below:
http_server.lua
: the actual Lua HTTP server
Kraftfile
: the Unikraft Cloud specification
Dockerfile
: the Docker-specified application filesystem
If a request is not a HEAD method, then reply with "Hello world!"
Usage: lua examples/server_hello.lua [<port>]
-- https://github.com/daurnimator/lua-http/blob/master/examples/server_hello.lua
local port = arg [ 1 ] or 8080
local http_server = require " http.server "
local http_headers = require " http.headers "
local function reply ( myserver , stream ) -- luacheck: ignore 212
local req_headers = assert ( stream : get_headers ())
local req_method = req_headers : get " :method "
assert ( io.stdout : write ( string.format ( ' [%s] "%s %s HTTP/%g" "%s" "%s" \n ' ,
os.date ( " %d/%b/%Y:%H:%M:%S %z " ),
req_headers : get ( " :path " ) or "" ,
stream .connection.version,
req_headers : get ( " referer " ) or " - " ,
req_headers : get ( " user-agent " ) or " - "
-- Build response headers
local res_headers = http_headers . new ()
res_headers : append ( " :status " , " 200 " )
res_headers : append ( " content-type " , " text/plain " )
-- Send headers to client; end the stream immediately if this was a HEAD request
assert ( stream : write_headers ( res_headers , req_method == " HEAD " ))
if req_method ~= " HEAD " then
-- Send body, ending the stream
assert ( stream : write_chunk ( " Hello, World! \n " , true ))
local myserver = assert ( http_server . listen {
onerror = function ( myserver , context , op , err , errno ) -- luacheck: ignore 212
local msg = op .. " on " .. tostring ( context ) .. " failed "
msg = msg .. " : " .. tostring ( err )
assert ( io.stderr : write ( msg , " \n " ))
-- Manually call :listen() so that we are bound before calling :localname()
assert ( myserver : listen ())
local bound_port = select ( 3 , myserver : localname ())
assert ( io.stderr : write ( string.format ( " Now listening on port %d \n " , bound_port )))
-- Start the main server loop
cmd : [ " /usr/bin/lua " , " /http_server.lua " ]
COPY ./http_server.lua /http_server.lua
The following options are available for customizing the application:
If only updating the implementation in the http_server.lua
source file, no other change is required.
If new files are added, these have to be copied in the application filesystem, using the COPY
command in the Dockerfile
.
If a new Lua source files is added, update the cmd
line in the Kraftfile
and replace http_server.lua
to run that file when creating the instance.
More extensive changes may require expanding the Dockerfile
with additional Dockerfile
commands .
Learn More
Use the --help
option for detailed information on using Unikraft Cloud:
Or visit the CLI Reference .