Successfully reported this slideshow.
mod_lua Webサーバ勉強会 #5       2012/03/29           do_aki
do_aki (どぅーあき)|所属| > 株式会社もしも       (ドロップシッピング・アフィリエイトASP)|仕事| > インフラ(サーバ管理)兼       Webアプリケーション開発|出現| > 渋谷・山手線沿線|特性| > PHPe...
<< About mod_lua >>
詳しくはここ見ると良いよ      http://blog.matsumoto-r.jp/?p=2117
mod_lua• configure --enable-lua する必要がある• 2.3 から入った• 2.4でも experimental state のまま• 2.4.x 系のリリース中に挙動変わるかもね• http://httpd.apa...
2つの側面• cgi っぽいもの (like mod_php , mod_perl)  – lua スクリプトを設置  – handle 関数が呼ばれる  – “AddHandler lua-script .lua” を指定するだけ• apac...
共通していること• request_rec が引数として渡される – lua からは userdata として見える – r または rw なプロパティ – いくつかのメソッド• apache2 モジュールが利用できる – ほとんど定数?
hello.luafunction handle(r) r.content_type = text/html r:puts([[ <!doctype html> <html> <head><title>hello</title></head> ...
<< request_rec >>
request_rec• 関数の引数として渡される• modules/lua/lua_request.c@600      ap_lua_load_request_lmodule• apache の request_rec ラッパ + ユーティ...
[properties]•   document_root•   hostname•   method•   protocol•   content_type•   args                = query string•   i...
headers_in / headers_out• HTTP ヘッダ• ドキュメントには table 型とあるけど嘘• 実際には userdata 型• ua = r.headers_in[User-Agent]• r.headers_out[...
puts/write method• r:puts(string [,string…])• r:write(string)• write の2つめ以降の引数は無視される• string 以外は許容しないので、tostring 使  うと便利• ...
add_output_filter method• ドキュメントには  r:addoutputfilter(name|function)  と書いてあるが嘘• しかも、string しか受け付けないっぽい• ap_add_output_filt...
<< directives >>
LuaRoot• mod_lua 関連ディレクティブで指定する  lua スクリプトのベースディレクトリを指  定• 相対パスで指定した場合の基準パスとな  る
LuaPackagePath• Lua モジュール (主に .lua) へのパスを追加• 複数指定可能• lua 内の package.path に相当• 例:  LuaPackagePath /usr/local/share/lua/5.1/...
LuaPackageCPath• Lua Cモジュール (主に .so) へのパスを追加• 複数指定可能• lua 内の package.cpath に相当• 例:  LuaPackageCPath /usr/local/lib/lib?-lu...
LuaScope• Lua interpreter のライフサイクルを指定                                    undocumented!• once, request, conn, server or thr...
LuaInherit• LuaHook* ディレクティブの継承をするか• また、外側と内側の設定どちらを優先す  るか(?) – none (default) – parent-first – parent-last
LuaCodeCache• Lua のインメモリコードキャッシュの設定 – stat : 都度 mtime を確認 – forever : 一度キャッシュしたらそのまま – never : キャッシュしない• マニュアルにあるのに、使えない。•...
LuaMapHandler• Lua スクリプト専用の rewrite みたいなも  の• uri とLuaスクリプト (とその中の関数) を  紐付けることができる• という説明• マニュアルにあるのに、使えない。• それどころかコードにも存...
LuaHook*• 指定の仕方は全て     LuaHook* script function ([early|late])• Lua スクリプトが読み込まれるのは実行時  – apache 起動時にファイル/関数が無くても怒ら    れない ...
LuaHookTranslateName• mod_rename の代替として  – apache と分離してテストできる!• <Directory> 内では使えなかった• r.filename を指定して apache2.OK を返せばよ  ...
LuaHookMapToStorage      LuaHookAccessChecker      LuaHookFixups      LuaQuickHandler• 常に呼ばれた• QuickHandler -> TranslateNa...
LuaHookCheckUserID   LuaHookTypeChecker   LuaHookAuthChecker   LuaHookInsertFilter• どうやったら呼ばれるのかわからない
LuaHookInsertFilter• Syntax error• not yet implemented
<< Conclusion >>• まだ experimental• ドキュメントを信じてはいけない• apache のhookについて知っていると良さ  そう• lua 面白い
end
ちょーてきとーなおまけ  << fluent-logger-lua >>
local os = require os                     fluent/logger.lualocal msgpack = require msgpacklocal socket = require socketmod...
callerfunction handle(r) local logger = require fluent.logger logger.connect() logger.post(test.test, {message=data}) r.co...
Upcoming SlideShare
Loading in …5
×

Mod lua

3,631 views

Published on

  • Be the first to comment

Mod lua

  1. 1. mod_lua Webサーバ勉強会 #5 2012/03/29 do_aki
  2. 2. do_aki (どぅーあき)|所属| > 株式会社もしも (ドロップシッピング・アフィリエイトASP)|仕事| > インフラ(サーバ管理)兼 Webアプリケーション開発|出現| > 渋谷・山手線沿線|特性| > PHPer http://do-aki.net/
  3. 3. << About mod_lua >>
  4. 4. 詳しくはここ見ると良いよ http://blog.matsumoto-r.jp/?p=2117
  5. 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. 6. 2つの側面• cgi っぽいもの (like mod_php , mod_perl) – lua スクリプトを設置 – handle 関数が呼ばれる – “AddHandler lua-script .lua” を指定するだけ• apache の hook 関数として – LuaHook* ディレクティブで指定
  7. 7. 共通していること• request_rec が引数として渡される – lua からは userdata として見える – r または rw なプロパティ – いくつかのメソッド• apache2 モジュールが利用できる – ほとんど定数?
  8. 8. hello.luafunction handle(r) r.content_type = text/html r:puts([[ <!doctype html> <html> <head><title>hello</title></head> <body><h1>hello mod_lua</h1></body> </html> ]])end
  9. 9. << request_rec >>
  10. 10. request_rec• 関数の引数として渡される• modules/lua/lua_request.c@600 ap_lua_load_request_lmodule• apache の request_rec ラッパ + ユーティリ ティ• is_https とかドキュメントにない変数も – 値は正しくないけど• parse_body メソッドは存在しない
  11. 11. [properties]• document_root• hostname• method• protocol• content_type• args = query string• is_https etc… undocumented!
  12. 12. headers_in / headers_out• HTTP ヘッダ• ドキュメントには table 型とあるけど嘘• 実際には userdata 型• ua = r.headers_in[User-Agent]• r.headers_out[X-lua] = yes‘• 列挙する方法がワカラン。。。
  13. 13. puts/write method• r:puts(string [,string…])• r:write(string)• write の2つめ以降の引数は無視される• string 以外は許容しないので、tostring 使 うと便利• 例: r:puts(tostring(r.user))
  14. 14. add_output_filter method• ドキュメントには r:addoutputfilter(name|function) と書いてあるが嘘• しかも、string しか受け付けないっぽい• ap_add_output_filter を呼び出してる• 別で定義された output filter を利用する?
  15. 15. << directives >>
  16. 16. LuaRoot• mod_lua 関連ディレクティブで指定する lua スクリプトのベースディレクトリを指 定• 相対パスで指定した場合の基準パスとな る
  17. 17. LuaPackagePath• Lua モジュール (主に .lua) へのパスを追加• 複数指定可能• lua 内の package.path に相当• 例: LuaPackagePath /usr/local/share/lua/5.1/?.lua
  18. 18. LuaPackageCPath• Lua Cモジュール (主に .so) へのパスを追加• 複数指定可能• lua 内の package.cpath に相当• 例: LuaPackageCPath /usr/local/lib/lib?-lua.so LuaPackageCPath /usr/local/lib/lua/5.1/?.so
  19. 19. LuaScope• Lua interpreter のライフサイクルを指定 undocumented!• once, request, conn, server or thread – mpm event だと server が指定できなかった• once 以外にすると、変数が(中途半端に)永 続化
  20. 20. LuaInherit• LuaHook* ディレクティブの継承をするか• また、外側と内側の設定どちらを優先す るか(?) – none (default) – parent-first – parent-last
  21. 21. LuaCodeCache• Lua のインメモリコードキャッシュの設定 – stat : 都度 mtime を確認 – forever : 一度キャッシュしたらそのまま – never : キャッシュしない• マニュアルにあるのに、使えない。• それどころかコードにも存在しない
  22. 22. LuaMapHandler• Lua スクリプト専用の rewrite みたいなも の• uri とLuaスクリプト (とその中の関数) を 紐付けることができる• という説明• マニュアルにあるのに、使えない。• それどころかコードにも存在しない
  23. 23. LuaHook*• 指定の仕方は全て LuaHook* script function ([early|late])• Lua スクリプトが読み込まれるのは実行時 – apache 起動時にファイル/関数が無くても怒ら れない – 今のところはね
  24. 24. LuaHookTranslateName• mod_rename の代替として – apache と分離してテストできる!• <Directory> 内では使えなかった• r.filename を指定して apache2.OK を返せばよ い• apache2.DECLINE を返すと保留 (他モジュー ルへ)• ステータスコードを返すのもあり
  25. 25. LuaHookMapToStorage LuaHookAccessChecker LuaHookFixups LuaQuickHandler• 常に呼ばれた• QuickHandler -> TranslateName -> MapToStorage -> AccessChecker-> Fixup• Qucik は Hook ではないようだが……
  26. 26. LuaHookCheckUserID LuaHookTypeChecker LuaHookAuthChecker LuaHookInsertFilter• どうやったら呼ばれるのかわからない
  27. 27. LuaHookInsertFilter• Syntax error• not yet implemented
  28. 28. << Conclusion >>• まだ experimental• ドキュメントを信じてはいけない• apache のhookについて知っていると良さ そう• lua 面白い
  29. 29. end
  30. 30. ちょーてきとーなおまけ << fluent-logger-lua >>
  31. 31. local os = require os fluent/logger.lualocal msgpack = require msgpacklocal socket = require socketmodule(fluent.logger)local fluent = nilfunction connect(host, port) fluent = socket.connect(host or 127.0.0.1, port or 24224)endfunction post(tag, data) local p = msgpack.Packer() local msg = p:pack({tag, os.time(), data}) fluent:send(msg)endfunction close() fluent:close()end
  32. 32. callerfunction handle(r) local logger = require fluent.logger logger.connect() logger.post(test.test, {message=data}) r.content_type = text/plain; r:puts(ok)end

×