ようへいの日々精進XP

よかろうもん

(超メモ)HAProxy 1.6 で Lua がサポートされたので触ってみた

HAProxy が久し振りの自称 HAProxy 芸人のかっぱです。

tl;dr

blog.haproxy.com

HAProxy 1.6 がリリースされたのを Twitter を介して知った。この 1.6 から Lua をサポートするようになったとのことで Lua は名前しか知らないけどドキュメントを参考にして試してみることにした。


参考


Lua とは

Lua の特徴

こちら を抜粋させて頂くと...

  • クロスプロットフォーム
  • 高速な動作
  • 組み込みに特化

なるほど。

Hello Lua

後ほど。


HAProxy 1.6 と Lua

検証環境

# cat /etc/debian_version 
8.2

Lua のビルドとインストール

# apt-get install make gcc libreadline-dev
# cd /usr/local/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
# make INSTALL_TOP=/usr/local/lua53 install

HAProxy のビルドとインストール

# apt-get install libpcre3-dev libssl-dev
# cd /usr/local/src/
# wget http://www.haproxy.org/download/1.6/src/haproxy-1.6.0.tar.gz
# tar zxvf haproxy-1.6.0.tar.gz
# cd haproxy-1.6.0
# make TARGET=linux2628 USE_OPENSSL=1 USE_PCRE=1 USE_LUA=1 LUA_LIB=/usr/local/lua53/lib/ LUA_INC=/usr/local/lua53/include/
# make install

make install すると install-doc タスクでコケたので以下のように修正して回避。

# diff -u Makefile.bk Makefile
--- Makefile.bk 2015-10-15 23:29:04.007615940 +0000
+++ Makefile    2015-10-15 23:29:13.637471208 +0000
@@ -798,7 +798,7 @@
 
 install-doc:
        install -d "$(DESTDIR)$(DOCDIR)"
-       for x in configuration architecture haproxy-en haproxy-fr; do \
+       for x in configuration architecture ; do \
                install -m 644 doc/$$x.txt "$(DESTDIR)$(DOCDIR)" ; \
        done

確認。

# haproxy -v
[ALERT] 287/233108 (4351) : SSLv3 support requested but unavailable.
HA-Proxy version 1.6.0 2015/10/13
Copyright 2000-2015 Willy Tarreau <willy@haproxy.org>

Lua スクリプトと HAProxy の設定

# cat hello_world.lua 
core.register_service("hello_world", "tcp", function(applet)
   applet:send("hello world\n")
end)
  • HAProxy の設定
# cat haproxy.cfg
global
   lua-load hello_world.lua
 
listen proxy
   bind 127.0.0.1:10001
   tcp-request content use-service lua.hello_world

Hello Lua on HAProxy

  • HAProxy の起動
# haproxy -f haproxy.cfg &
[1] 4356
root@6ae3970b4075:/tmp# [ALERT] 287/233444 (4356) : SSLv3 support requested but unavailable.
[WARNING] 287/233444 (4356) : config : missing timeouts for proxy 'proxy'.
   | While not properly invalid, you will certainly encounter various problems
   | with such a configuration. To fix this, please ensure that all following
   | timeouts are set to a non-zero value: 'client', 'connect', 'server'.
  • 起動の確認
# ss -pl
Netid State      Recv-Q Send-Q                                                            Local Address:Port                                                                Peer Address:Port   
nl    UNCONN     0      0                                                                          rtnl:kernel                                                                          *       
nl    UNCONN     4352   0                                                                       tcpdiag:ss/4357                                                                         *       
nl    UNCONN     768    0                                                                       tcpdiag:kernel                                                                          *       
nl    UNCONN     0      0                                                                             6:kernel                                                                          *       
nl    UNCONN     0      0                                                                            10:kernel                                                                          *       
nl    UNCONN     0      0                                                                            12:kernel                                                                          *       
nl    UNCONN     0      0                                                                            15:kernel                                                                          *       
nl    UNCONN     0      0                                                                            16:kernel                                                                          *       
tcp   LISTEN     0      128                                                                   127.0.0.1:10001                                                                          *:*        users:(("haproxy",pid=4356,fd=4))
  • アクセスしてみる
# curl localhost:10001                                                                                                                                                     
hello world

おお。


ということで...

本当にザクっと触ってみただけだが、HAProxy の設定をスクリプト言語で書けるようになったというのは色々と夢が広がる。振り分けの定義等も Lua で書けたりするのだろうか。引き続き、調査を続けたい。