Yesterday, Willy has released HAProxy 1.6-dev1: ANNOUNCE HAProxy 1.6-dev1.
This version contains many new features and core improvements. Amongst the new features, one is LUA, contributed by Thierry (HAProxy Technologies developer).
NOTE: We invite everyone to download and test HAProxy 1.6-dev1 and to report bugs to the mailing list.
Please note that there may be a code freeze of HAProxy 1.6 in May. Purpose is to release a stable version in September.
LUA is a powerful, fast, lightweight, embeddable scripting language.
The main advantage of LUA for HAProxy is to give the ability to anyone to write their own features without having to know writing C code and patching HAProxy…
About this article
Please note that LUA integration in HAProxy is brand new. So the information provided here are true today but may be obsolete later, because of internal changes and updates.
Compiling HAProxy and LUA
Installaing LUA 5.3
For now, HAProxy requires LUA 5.3 to work, here is the procedure to install it:
cd /usr/src curl -R -O http://www.lua.org/ftp/lua-5.3.0.tar.gz tar zxf lua-5.3.0.tar.gz cd lua-5.3.0 make linux sudo make INSTALL_TOP=/opt/lua53 install
LUA 5.3 library and include files are now installed in /opt/lua53.
Compiling HAProxy for lua
Since HAProxy is in a dev state, we may encounter some bugs. Let’s enable some debugging features:
make DEBUG=-ggdb CFLAGS=-O0 TARGET=linux2628 USE_LUA=yes LUA_LIB=/opt/lua53/lib/ LUA_INC=/opt/lua53/include/ LDFLAGS=-ldl
Using LUA in HAProxy
turning HAProxy as a mirror web server
By mirror web server, I mean a web server which returns the request in the body of the response, without any modification.
It may be useful to use in HAProxy when you want to setup some HTTP header manipulation in HAProxy and you want to see the result. (It is more convenient than tcpdump).
* First, the HAProxy configuration:
global lua-load ./mylua.lua defaults mode http timeout connect 1s timeout client 1s timeout server 1s frontend fe bind 127.0.0.1:8001 name fe acl debugme req.hdr_cnt(X-debug-me) ge 1 # add your http manipulation rules here http-request lua mirror if debugme default_backend be backend be server s 127.0.0.1:8002
* And the LUA which does the mirroring of the request:
-- a simple mirror web server -- it generates a response whose body contains the requests headers function mirror(txn) local buffer = "" local response = "" local mydate = txn.sc:http_date(txn.f:date()) buffer = buffer .. "You sent the following headersrn" buffer = buffer .. "===============================================rn" buffer = buffer .. txn.req:dup() buffer = buffer .. "===============================================rn" response = response .. "HTTP/1.0 200 OKrn" response = response .. "Server: haproxy-lua/mirrorrn" response = response .. "Content-Type: text/htmlrn" response = response .. "Date: " .. mydate .. "rn" response = response .. "Content-Length: " .. buffer:len() .. "rn" response = response .. "Connection: closern" response = response .. "rn" response = response .. buffer txn.res:send(response) txn:close() end
mydate is the result of an HAProxy converter
txn.sc:http_date applied to an HAProxy fetch
* The call to
txn.req:dup returns the content of HAProxy’s buffer request.
Testing: simply run a curl against HAProxy, don’t forget to send a X-debug-me HTTP header with the parameter
-H "X-debug-me: yes". HAProxy should return your request in the response body:
HTTP/1.0 200 OK Server: haproxy-lua/mirror Content-Type: text/html Date: Fri, 12 Mar 2015 13:06:44 GMT Content-Length: 208 Connection: keep-alive You sent the following headers =============================================== GET / HTTP/1.1 User-Agent: curl/7.41.0 Host: 127.0.0.1:8001 Accept: */* ===============================================