Más contenido relacionado La actualidad más candente (20) Mod lua2. do_aki (どぅーあき)
|所属| > 株式会社もしも
(ドロップシッピング・アフィリエイトASP)
|仕事| > インフラ(サーバ管理)兼
Webアプリケーション開発
|出現| > 渋谷・山手線沿線
|特性| > PHPer
http://do-aki.net/
5. mod_lua
• configure --enable-lua する必要がある
• 2.3 から入った
• 2.4でも experimental state のまま
• 2.4.x 系のリリース中に挙動変わるかもね
• http://httpd.apache.org/docs/2.4/en/mod/mod_lua.html
• ドキュメントは狼少年だったorz
6. 2つの側面
• cgi っぽいもの (like mod_php , mod_perl)
– lua スクリプトを設置
– handle 関数が呼ばれる
– “AddHandler lua-script .lua” を指定するだけ
• apache の hook 関数として
– LuaHook* ディレクティブで指定
11. [properties]
• document_root
• hostname
• method
• protocol
• content_type
• args = query string
• is_https
etc…
undocumented!
12. headers_in / headers_out
• HTTP ヘッダ
• ドキュメントには table 型とあるけど嘘
• 実際には userdata 型
• ua = r.headers_in['User-Agent']
• r.headers_out['X-lua'] = 'yes‘
• 列挙する方法がワカラン。。。
17. LuaPackagePath
• Lua モジュール (主に .lua) へのパスを追加
• 複数指定可能
• lua 内の package.path に相当
• 例:
LuaPackagePath /usr/local/share/lua/5.1/?.lua
18. LuaPackageCPath
• Lua Cモジュール (主に .so) へのパスを追加
• 複数指定可能
• lua 内の package.cpath に相当
• 例:
LuaPackageCPath /usr/local/lib/lib?-lua.so
LuaPackageCPath /usr/local/lib/lua/5.1/?.so
19. LuaScope
• Lua interpreter のライフサイクルを指定
undocumented!
• once, request, conn, server or thread
– mpm event だと server が指定できなかった
• once 以外にすると、変数が(中途半端に)永
続化
23. LuaHook*
• 指定の仕方は全て
LuaHook* script function ([early|late])
• Lua スクリプトが読み込まれるのは実行時
– apache 起動時にファイル/関数が無くても怒ら
れない
– 今のところはね
25. LuaHookMapToStorage
LuaHookAccessChecker
LuaHookFixups
LuaQuickHandler
• 常に呼ばれた
• QuickHandler -> TranslateName ->
MapToStorage -> AccessChecker-> Fixup
• Qucik は Hook ではないようだが……
26. LuaHookCheckUserID
LuaHookTypeChecker
LuaHookAuthChecker
LuaHookInsertFilter
• どうやったら呼ばれるのかわからない
28. << Conclusion >>
• まだ experimental
• ドキュメントを信じてはいけない
• apache のhookについて知っていると良さ
そう
• lua 面白い
31. local os = require 'os'
fluent/logger.lua
local msgpack = require 'msgpack'
local socket = require 'socket'
module('fluent.logger')
local fluent = nil
function connect(host, port)
fluent = socket.connect(host or '127.0.0.1', port or 24224)
end
function post(tag, data)
local p = msgpack.Packer()
local msg = p:pack({tag, os.time(), data})
fluent:send(msg)
end
function close()
fluent:close()
end
32. caller
function handle(r)
local logger = require 'fluent.logger'
logger.connect()
logger.post('test.test', {message='data'})
r.content_type = 'text/plain';
r:puts('ok')
end