• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
Mod lua
 

Mod lua

on

  • 2,679 views

 

Statistics

Views

Total Views
2,679
Views on SlideShare
1,645
Embed Views
1,034

Actions

Likes
5
Downloads
16
Comments
0

2 Embeds 1,034

http://d.hatena.ne.jp 1033
http://webcache.googleusercontent.com 1

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Mod lua Mod lua Presentation Transcript

    • mod_lua Webサーバ勉強会 #5 2012/03/29 do_aki
    • do_aki (どぅーあき)|所属| > 株式会社もしも (ドロップシッピング・アフィリエイトASP)|仕事| > インフラ(サーバ管理)兼 Webアプリケーション開発|出現| > 渋谷・山手線沿線|特性| > PHPer http://do-aki.net/
    • << 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.apache.org/docs/2.4/en/mod/mod_lua.html• ドキュメントは狼少年だったorz
    • 2つの側面• cgi っぽいもの (like mod_php , mod_perl) – lua スクリプトを設置 – handle 関数が呼ばれる – “AddHandler lua-script .lua” を指定するだけ• apache の hook 関数として – LuaHook* ディレクティブで指定
    • 共通していること• 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> <body><h1>hello mod_lua</h1></body> </html> ]])end
    • << request_rec >>
    • request_rec• 関数の引数として渡される• modules/lua/lua_request.c@600 ap_lua_load_request_lmodule• apache の request_rec ラッパ + ユーティリ ティ• is_https とかドキュメントにない変数も – 値は正しくないけど• parse_body メソッドは存在しない
    • [properties]• document_root• hostname• method• protocol• content_type• args = query string• is_https etc… undocumented!
    • headers_in / headers_out• HTTP ヘッダ• ドキュメントには table 型とあるけど嘘• 実際には userdata 型• ua = r.headers_in[User-Agent]• r.headers_out[X-lua] = yes‘• 列挙する方法がワカラン。。。
    • puts/write method• r:puts(string [,string…])• r:write(string)• write の2つめ以降の引数は無視される• string 以外は許容しないので、tostring 使 うと便利• 例: r:puts(tostring(r.user))
    • add_output_filter method• ドキュメントには r:addoutputfilter(name|function) と書いてあるが嘘• しかも、string しか受け付けないっぽい• ap_add_output_filter を呼び出してる• 別で定義された output filter を利用する?
    • << directives >>
    • LuaRoot• mod_lua 関連ディレクティブで指定する lua スクリプトのベースディレクトリを指 定• 相対パスで指定した場合の基準パスとな る
    • LuaPackagePath• Lua モジュール (主に .lua) へのパスを追加• 複数指定可能• lua 内の package.path に相当• 例: LuaPackagePath /usr/local/share/lua/5.1/?.lua
    • LuaPackageCPath• Lua Cモジュール (主に .so) へのパスを追加• 複数指定可能• lua 内の package.cpath に相当• 例: LuaPackageCPath /usr/local/lib/lib?-lua.so LuaPackageCPath /usr/local/lib/lua/5.1/?.so
    • LuaScope• Lua interpreter のライフサイクルを指定 undocumented!• once, request, conn, server or thread – mpm event だと server が指定できなかった• once 以外にすると、変数が(中途半端に)永 続化
    • 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 を返せばよ い• apache2.DECLINE を返すと保留 (他モジュー ルへ)• ステータスコードを返すのもあり
    • LuaHookMapToStorage LuaHookAccessChecker LuaHookFixups LuaQuickHandler• 常に呼ばれた• QuickHandler -> TranslateName -> MapToStorage -> AccessChecker-> Fixup• Qucik は Hook ではないようだが……
    • 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 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
    • 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