首页 > 配置文件 > ts-lua插件helloworld

ts-lua插件helloworld

2013年9月30日     浏览数:4,647 发表评论 阅读评论

ts-lua插件

ts-lua插件是阿里阙寒同学写的一个remap的插件,可以支持大多数的remap功能,如header操作、transform处理等等,使用lua插件后,业务的处理开发测试将变得极为简便

项目的github地址为:https://github.com/portl4t/ts-lua/

这个插件会用到ssl和lua,测试lua版本5.1完美,不推荐使用luajit,测试发现luajit配合内存管理有问题。

如何编译安装?

假设你已经安装了一个完整的ATS,可以参考源代码里的Makefile,也可以用tsxs很方便的编译安装ts-lua插件本身,如:

git clone https://github.com/portl4t/ts-lua.git
cd ts-lua/src/
tsxs -o tslua.so -lssl -llua ts*.c
sudo tsxs -o tslua.so -i

结果如下:

zym@zymtest1 ~ $     git clone https://github.com/portl4t/ts-lua.git
fatal: 目标路径 'ts-lua' 已经存在,并且不是一个空目录。
zym@zymtest1 ~ $     cd ts-lua/src/
zym@zymtest1 ~/ts-lua/src $     tsxs -o tslua.so -lssl -llua ts*.c
    compiling ts_lua_atomic.c -> ts_lua_atomic.lo
    compiling ts_lua.c -> ts_lua.lo
    compiling ts_lua_cached_response.c -> ts_lua_cached_response.lo
    compiling ts_lua_client_request.c -> ts_lua_client_request.lo
    compiling ts_lua_client_response.c -> ts_lua_client_response.lo
    compiling ts_lua_context.c -> ts_lua_context.lo
    compiling ts_lua_hook.c -> ts_lua_hook.lo
    compiling ts_lua_http.c -> ts_lua_http.lo
    compiling ts_lua_misc.c -> ts_lua_misc.lo
ts_lua_misc.c: 在函数‘ts_lua_debug’中:
ts_lua_misc.c:42:5: 警告:格式字符串不是一个字面字符串而且没有待格式化的实参 [-Wformat-security]
ts_lua_misc.c: 在函数‘ts_lua_error’中:
ts_lua_misc.c:52:5: 警告:格式字符串不是一个字面字符串而且没有待格式化的实参 [-Wformat-security]
    compiling ts_lua_server_request.c -> ts_lua_server_request.lo
    compiling ts_lua_server_response.c -> ts_lua_server_response.lo
    compiling ts_lua_transform.c -> ts_lua_transform.lo
    compiling ts_lua_util.c -> ts_lua_util.lo
    linking -> tslua.so
zym@zymtest1 ~/ts-lua/src $     sudo tsxs -o tslua.so -i
    installing tslua.so -> /usr/lib64/trafficserver/plugins/tslua.so
zym@zymtest1 ~/ts-lua/src $

基础配置

ts-lua插件是remap插件,我们上面的编译方式有会引入链接库,在使用前需要配置基础的依赖库,使用libloader插件装载lua库,我们配置/etc/trafficserver/plugin.config如下:

/usr/lib64/trafficserver/plugins/libloader.so /usr/lib64/liblua.so

并重启ATS后,即具备remap使用lua插件的环境。我们假设ATS已经带了ssl的支持啦(默认情况下)

helloworld from Lua

下面是一个简单的lua插件,目标就是拦截所有返回码大于400的返回,我们假设保存为/tmp/helloworld.lua:

function send_response()
  -- *****************************************************************
  -- 如果你需要的话,可以调出ts.ctx中保存的数据来啦
  -- ts.client_response.header['Testzym'] = ts.ctx['status']

  -- 我们加(或改)几个返回头:
  ts.client_response.header['Cache-Control'] = 'max-age=10'
  ts.client_response.header['Server'] = 'ATS/5.1.0'
  return 0
end

function read_response()
  http_status = ts.server_response.header.get_status()
  ts.debug(string.format('server_response status = %d', http_status))
  if http_status >= 400 then
    -- server返回了错误的结果

    -- ***************************************************************
    -- 如果需要给后续流程保留的信息,可以纪录到ts.ctx中:
    --ts.ctx['status'] = http_status

    -- 我们在这里准备发给用户头的时候,再干点坏事
    ts.hook(TS_LUA_HOOK_SEND_RESPONSE_HDR, send_response)
  end
  return 0
end

function do_remap()
  -- 我们的起点,这里我们给READ_RESPONSE_HDR这个点hook一个函数
  -- 这个点是指ATS读源服务器端返回头的时候执行的
  ts.hook(TS_LUA_HOOK_READ_RESPONSE_HDR, read_response)
  return 0
end

修改remap.config,包含这个插件:

regex_map http://(.*)/ http://$1/ @plugin=/usr/lib64/trafficserver/plugins/tslua.so @pparam=/tmp/helloworld.lua

执行traffic_line -x后,规则即可生效:

zym@zymtest1 ~/ts-lua/src $ echo -ne "GET http://zymlinux.net/notfound HTTP/1.0\r\n\r\n" | netcat -i 1 localhost 8080
HTTP/1.0 404 Not Found
Date: Mon, 30 Sep 2013 09:48:21 GMT
Server: ATS/5.1.0
Content-Length: 211
Content-Type: text/html; charset=iso-8859-1
Age: 2
Via: http/1.1 zymlinux.net (ApacheTrafficServer/4.0.1 [cMsSf ])
Cache-Control: max-age=10

< !DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>404 Not Found</title>
</head><body>
<h1>Not Found</h1>
<p>The requested URL /~zym/notfound was not found on this server.</p>
</body></html>
zym@zymtest1 ~/ts-lua/src $

总结

这个例子不具有任何价值,但是已经非常有意思啦,我们可以在Lua脚本中完成一些需要用C来做的工作。更多的例子,参考:https://github.com/portl4t/ts-lua/ example/ 和 business/ 目录下的例子。

分类: 配置文件 标签:
  1. info
    2014年5月30日14:09 | #1

    [May 30 15:36:04.791] {0x2b72da5c08c0} STATUS: opened /usr/local/ats/var/log/trafficserver/diags.log
    [May 30 15:36:04.791] {0x2b72da5c08c0} NOTE: updated diags config
    [May 30 15:36:04.795] Server {0x2b72da5c08c0} NOTE: cache clustering disabled
    [May 30 15:36:04.809] Server {0x2b72da5c08c0} NOTE: ip_allow.config updated, reloading
    [May 30 15:36:04.821] Server {0x2b72da5c08c0} NOTE: cache clustering disabled
    [May 30 15:36:04.822] Server {0x2b72da5c08c0} NOTE: logging initialized[15], logging_mode = 3
    [May 30 15:36:04.824] Server {0x2b72da5c08c0} NOTE: loading plugin ‘/usr/local/ats/libexec/trafficserver/libloader.so’
    [May 30 15:36:04.846] Server {0x2b72da5c08c0} NOTE: traffic server running
    [May 30 15:36:06.590] Server {0x2b72db945940} NOTE: cache enabled
    [May 30 15:37:25.887] Server {0x2b72e00ff940} WARNING: Could not add rule at line #242; Aborting!
    [May 30 15:37:25.887] Server {0x2b72e00ff940} WARNING: [ReverseProxy] Can’t load plugin “/usr/local/ats/libexec/trafficserver/tslua.so” – liblua.so: cannot open shared object file: No such file or directory at line 242
    [May 30 15:37:25.887] Server {0x2b72e00ff940} WARNING: something failed during BuildTable() — check your remap plugins!
    [May 30 15:37:25.887] Server {0x2b72e00ff940} WARNING: failed to reload remap.config, not replacing!

    remap.config的配置是这样的

    regex_map www .baidu. com 116.28.77.39 @plugin=tslua.so @pparam=/tmp/1.lua

    禁止输入网站只能把h t t p忽略了

    不知道是不是本本不兼容
    ts的版本是4.0.2

  2. 永豪
    2014年6月12日15:33 | #2

    Can’t load plugin “/usr/local/ats/libexec/trafficserver/tslua.so” – liblua.so: cannot open shared object file: No such file or directory at line 242

    说明啥??

  1. 本文目前尚无任何 trackbacks 和 pingbacks.