SlideShare a Scribd company logo
1 of 32
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.lua
function 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.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
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

More Related Content

What's hot

MHA for MySQLとDeNAのオープンソースの話
MHA for MySQLとDeNAのオープンソースの話MHA for MySQLとDeNAのオープンソースの話
MHA for MySQLとDeNAのオープンソースの話Yoshinori Matsunobu
 
Web技術勉強会23回目
Web技術勉強会23回目Web技術勉強会23回目
Web技術勉強会23回目龍一 田中
 
成長を加速する minne の技術基盤戦略
成長を加速する minne の技術基盤戦略成長を加速する minne の技術基盤戦略
成長を加速する minne の技術基盤戦略Hiroshi SHIBATA
 
Chefを利用した運用省力化とDevOpsの取り組みについて
Chefを利用した運用省力化とDevOpsの取り組みについてChefを利用した運用省力化とDevOpsの取り組みについて
Chefを利用した運用省力化とDevOpsの取り組みについてYuuki Namikawa
 
20140828 #ssmjp 社内チューニンガソンで優勝したはなし
20140828 #ssmjp 社内チューニンガソンで優勝したはなし20140828 #ssmjp 社内チューニンガソンで優勝したはなし
20140828 #ssmjp 社内チューニンガソンで優勝したはなしMasahiro NAKAYAMA
 
中小規模サービスのApacheチューニング
中小規模サービスのApacheチューニング中小規模サービスのApacheチューニング
中小規模サービスのApacheチューニング勲 國府田
 
"Bits from the Apache Maintainers / Upcoming apache2 2.4 transition" を読んでみた
"Bits from the Apache Maintainers / Upcoming apache2 2.4 transition" を読んでみた"Bits from the Apache Maintainers / Upcoming apache2 2.4 transition" を読んでみた
"Bits from the Apache Maintainers / Upcoming apache2 2.4 transition" を読んでみたTsuyoshi Yamada
 
Automation tech casual_talks_1_20120717
Automation tech casual_talks_1_20120717Automation tech casual_talks_1_20120717
Automation tech casual_talks_1_20120717Makoto Haruyama
 
さくらのDockerコンテナホスティング-Arukasの解説とインフラを支える技術(July Tech Festa 2016 『IoTxAIxインフラ時代...
さくらのDockerコンテナホスティング-Arukasの解説とインフラを支える技術(July Tech Festa 2016 『IoTxAIxインフラ時代...さくらのDockerコンテナホスティング-Arukasの解説とインフラを支える技術(July Tech Festa 2016 『IoTxAIxインフラ時代...
さくらのDockerコンテナホスティング-Arukasの解説とインフラを支える技術(July Tech Festa 2016 『IoTxAIxインフラ時代...さくらインターネット株式会社
 
fluentd を利用した大規模ウェブサービスのロギング
fluentd を利用した大規模ウェブサービスのロギングfluentd を利用した大規模ウェブサービスのロギング
fluentd を利用した大規模ウェブサービスのロギングYuichi Tateno
 
Dockerでデプロイ
DockerでデプロイDockerでデプロイ
Dockerでデプロイoshiro_seiya
 
Hive undocumented feature
Hive undocumented featureHive undocumented feature
Hive undocumented featuretamtam180
 
ネットワークエンジニアのための Puppet / Chef
ネットワークエンジニアのための Puppet / Chefネットワークエンジニアのための Puppet / Chef
ネットワークエンジニアのための Puppet / Chefnpsg
 
〜Apache Geode 入門 Multi-site(WAN)構成による クラスター連携
〜Apache Geode 入門 Multi-site(WAN)構成によるクラスター連携〜Apache Geode 入門 Multi-site(WAN)構成によるクラスター連携
〜Apache Geode 入門 Multi-site(WAN)構成による クラスター連携Akihiro Kitada
 
Cloudstack user group meeting in osaka
Cloudstack user group meeting in osakaCloudstack user group meeting in osaka
Cloudstack user group meeting in osakaNaotaka Jay HOTTA
 
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -onozaty
 
Zabbixを2分でインストール
Zabbixを2分でインストールZabbixを2分でインストール
Zabbixを2分でインストール真乙 九龍
 
動画共有ツール
動画共有ツール動画共有ツール
動画共有ツールtamtam180
 

What's hot (20)

MHA for MySQLとDeNAのオープンソースの話
MHA for MySQLとDeNAのオープンソースの話MHA for MySQLとDeNAのオープンソースの話
MHA for MySQLとDeNAのオープンソースの話
 
Web技術勉強会23回目
Web技術勉強会23回目Web技術勉強会23回目
Web技術勉強会23回目
 
成長を加速する minne の技術基盤戦略
成長を加速する minne の技術基盤戦略成長を加速する minne の技術基盤戦略
成長を加速する minne の技術基盤戦略
 
Chefを利用した運用省力化とDevOpsの取り組みについて
Chefを利用した運用省力化とDevOpsの取り組みについてChefを利用した運用省力化とDevOpsの取り組みについて
Chefを利用した運用省力化とDevOpsの取り組みについて
 
20140828 #ssmjp 社内チューニンガソンで優勝したはなし
20140828 #ssmjp 社内チューニンガソンで優勝したはなし20140828 #ssmjp 社内チューニンガソンで優勝したはなし
20140828 #ssmjp 社内チューニンガソンで優勝したはなし
 
中小規模サービスのApacheチューニング
中小規模サービスのApacheチューニング中小規模サービスのApacheチューニング
中小規模サービスのApacheチューニング
 
Hive chapter 2
Hive chapter 2Hive chapter 2
Hive chapter 2
 
Using Windows Azure
Using Windows AzureUsing Windows Azure
Using Windows Azure
 
"Bits from the Apache Maintainers / Upcoming apache2 2.4 transition" を読んでみた
"Bits from the Apache Maintainers / Upcoming apache2 2.4 transition" を読んでみた"Bits from the Apache Maintainers / Upcoming apache2 2.4 transition" を読んでみた
"Bits from the Apache Maintainers / Upcoming apache2 2.4 transition" を読んでみた
 
Automation tech casual_talks_1_20120717
Automation tech casual_talks_1_20120717Automation tech casual_talks_1_20120717
Automation tech casual_talks_1_20120717
 
さくらのDockerコンテナホスティング-Arukasの解説とインフラを支える技術(July Tech Festa 2016 『IoTxAIxインフラ時代...
さくらのDockerコンテナホスティング-Arukasの解説とインフラを支える技術(July Tech Festa 2016 『IoTxAIxインフラ時代...さくらのDockerコンテナホスティング-Arukasの解説とインフラを支える技術(July Tech Festa 2016 『IoTxAIxインフラ時代...
さくらのDockerコンテナホスティング-Arukasの解説とインフラを支える技術(July Tech Festa 2016 『IoTxAIxインフラ時代...
 
fluentd を利用した大規模ウェブサービスのロギング
fluentd を利用した大規模ウェブサービスのロギングfluentd を利用した大規模ウェブサービスのロギング
fluentd を利用した大規模ウェブサービスのロギング
 
Dockerでデプロイ
DockerでデプロイDockerでデプロイ
Dockerでデプロイ
 
Hive undocumented feature
Hive undocumented featureHive undocumented feature
Hive undocumented feature
 
ネットワークエンジニアのための Puppet / Chef
ネットワークエンジニアのための Puppet / Chefネットワークエンジニアのための Puppet / Chef
ネットワークエンジニアのための Puppet / Chef
 
〜Apache Geode 入門 Multi-site(WAN)構成による クラスター連携
〜Apache Geode 入門 Multi-site(WAN)構成によるクラスター連携〜Apache Geode 入門 Multi-site(WAN)構成によるクラスター連携
〜Apache Geode 入門 Multi-site(WAN)構成による クラスター連携
 
Cloudstack user group meeting in osaka
Cloudstack user group meeting in osakaCloudstack user group meeting in osaka
Cloudstack user group meeting in osaka
 
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
 
Zabbixを2分でインストール
Zabbixを2分でインストールZabbixを2分でインストール
Zabbixを2分でインストール
 
動画共有ツール
動画共有ツール動画共有ツール
動画共有ツール
 

Similar to Mod lua

Java concurrency in_practice_chap06
Java concurrency in_practice_chap06Java concurrency in_practice_chap06
Java concurrency in_practice_chap06ohtsuchi
 
誰でも出来るosxでのローカルなウェブ開発環境構築
誰でも出来るosxでのローカルなウェブ開発環境構築誰でも出来るosxでのローカルなウェブ開発環境構築
誰でも出来るosxでのローカルなウェブ開発環境構築Hiroshi Yamato
 
Sqale の Puppet と Chef (と テスト)
Sqale の Puppet と Chef (と テスト)Sqale の Puppet と Chef (と テスト)
Sqale の Puppet と Chef (と テスト)hiboma
 
長いの
長いの長いの
長いのemasaka
 
minneで学ぶクラウド脳
minneで学ぶクラウド脳minneで学ぶクラウド脳
minneで学ぶクラウド脳Uchio Kondo
 
恐るべきApache, Web勉強会@福岡
恐るべきApache, Web勉強会@福岡恐るべきApache, Web勉強会@福岡
恐るべきApache, Web勉強会@福岡Aya Komuro
 
4時間まったりWordPressテーマ作成講座
4時間まったりWordPressテーマ作成講座4時間まったりWordPressテーマ作成講座
4時間まったりWordPressテーマ作成講座Shinichi Nishikawa
 
WordPress中級者への道!テンプレートタグはどう動くのか!?
WordPress中級者への道!テンプレートタグはどう動くのか!?WordPress中級者への道!テンプレートタグはどう動くのか!?
WordPress中級者への道!テンプレートタグはどう動くのか!?Shinichi Nishikawa
 
Webサーバ勉強会 発表資料
Webサーバ勉強会 発表資料Webサーバ勉強会 発表資料
Webサーバ勉強会 発表資料oranie Narut
 
モダンmod_perl入門 #yapcasia
モダンmod_perl入門 #yapcasiaモダンmod_perl入門 #yapcasia
モダンmod_perl入門 #yapcasia鉄次 尾形
 
ノンプログラマのためのウェブサーバ入門
ノンプログラマのためのウェブサーバ入門	ノンプログラマのためのウェブサーバ入門
ノンプログラマのためのウェブサーバ入門 Atsu Yamaga
 
lilo.linux.or.jp の話 (2017年8月)
lilo.linux.or.jp の話 (2017年8月)lilo.linux.or.jp の話 (2017年8月)
lilo.linux.or.jp の話 (2017年8月)Kazuhiro Nishiyama
 
CPANの依存モジュールをもう少し正しく検出したい
CPANの依存モジュールをもう少し正しく検出したいCPANの依存モジュールをもう少し正しく検出したい
CPANの依存モジュールをもう少し正しく検出したいcharsbar
 
Apache Auroraの始めかた
Apache Auroraの始めかたApache Auroraの始めかた
Apache Auroraの始めかたMasahito Zembutsu
 
システムパフォーマンス勉強会#4
システムパフォーマンス勉強会#4システムパフォーマンス勉強会#4
システムパフォーマンス勉強会#4shingo suzuki
 
システムパフォーマンス勉強会#4
システムパフォーマンス勉強会#4システムパフォーマンス勉強会#4
システムパフォーマンス勉強会#4shingo suzuki
 

Similar to Mod lua (20)

Java concurrency in_practice_chap06
Java concurrency in_practice_chap06Java concurrency in_practice_chap06
Java concurrency in_practice_chap06
 
誰でも出来るosxでのローカルなウェブ開発環境構築
誰でも出来るosxでのローカルなウェブ開発環境構築誰でも出来るosxでのローカルなウェブ開発環境構築
誰でも出来るosxでのローカルなウェブ開発環境構築
 
Sqale の Puppet と Chef (と テスト)
Sqale の Puppet と Chef (と テスト)Sqale の Puppet と Chef (と テスト)
Sqale の Puppet と Chef (と テスト)
 
長いの
長いの長いの
長いの
 
minneで学ぶクラウド脳
minneで学ぶクラウド脳minneで学ぶクラウド脳
minneで学ぶクラウド脳
 
恐るべきApache, Web勉強会@福岡
恐るべきApache, Web勉強会@福岡恐るべきApache, Web勉強会@福岡
恐るべきApache, Web勉強会@福岡
 
3 tips of Laravel
3 tips of Laravel3 tips of Laravel
3 tips of Laravel
 
4時間まったりWordPressテーマ作成講座
4時間まったりWordPressテーマ作成講座4時間まったりWordPressテーマ作成講座
4時間まったりWordPressテーマ作成講座
 
WordPress中級者への道!テンプレートタグはどう動くのか!?
WordPress中級者への道!テンプレートタグはどう動くのか!?WordPress中級者への道!テンプレートタグはどう動くのか!?
WordPress中級者への道!テンプレートタグはどう動くのか!?
 
Yesod(at FPM2012)
Yesod(at FPM2012)Yesod(at FPM2012)
Yesod(at FPM2012)
 
Webサーバ勉強会 発表資料
Webサーバ勉強会 発表資料Webサーバ勉強会 発表資料
Webサーバ勉強会 発表資料
 
モダンmod_perl入門 #yapcasia
モダンmod_perl入門 #yapcasiaモダンmod_perl入門 #yapcasia
モダンmod_perl入門 #yapcasia
 
ノンプログラマのためのウェブサーバ入門
ノンプログラマのためのウェブサーバ入門	ノンプログラマのためのウェブサーバ入門
ノンプログラマのためのウェブサーバ入門
 
lilo.linux.or.jp の話 (2017年8月)
lilo.linux.or.jp の話 (2017年8月)lilo.linux.or.jp の話 (2017年8月)
lilo.linux.or.jp の話 (2017年8月)
 
CPANの依存モジュールをもう少し正しく検出したい
CPANの依存モジュールをもう少し正しく検出したいCPANの依存モジュールをもう少し正しく検出したい
CPANの依存モジュールをもう少し正しく検出したい
 
qmake入門
qmake入門qmake入門
qmake入門
 
Apache Auroraの始めかた
Apache Auroraの始めかたApache Auroraの始めかた
Apache Auroraの始めかた
 
システムパフォーマンス勉強会#4
システムパフォーマンス勉強会#4システムパフォーマンス勉強会#4
システムパフォーマンス勉強会#4
 
システムパフォーマンス勉強会#4
システムパフォーマンス勉強会#4システムパフォーマンス勉強会#4
システムパフォーマンス勉強会#4
 
Haikara
HaikaraHaikara
Haikara
 

More from do_aki

Tritonn から Elasticsearch への移行話
Tritonn から Elasticsearch への移行話Tritonn から Elasticsearch への移行話
Tritonn から Elasticsearch への移行話do_aki
 
php-src の歩き方
php-src の歩き方php-src の歩き方
php-src の歩き方do_aki
 
PHP と SAPI と ZendEngine3 と
PHP と SAPI と ZendEngine3 とPHP と SAPI と ZendEngine3 と
PHP と SAPI と ZendEngine3 とdo_aki
 
PHPとシグナル、その裏側
PHPとシグナル、その裏側PHPとシグナル、その裏側
PHPとシグナル、その裏側do_aki
 
再考:列挙型
再考:列挙型再考:列挙型
再考:列挙型do_aki
 
signal の話 或いは Zend Signals とは何か
signal の話 或いは Zend Signals とは何かsignal の話 或いは Zend Signals とは何か
signal の話 或いは Zend Signals とは何かdo_aki
 
PHP AST 徹底解説(補遺)
PHP AST 徹底解説(補遺)PHP AST 徹底解説(補遺)
PHP AST 徹底解説(補遺)do_aki
 
PHP AST 徹底解説
PHP AST 徹底解説PHP AST 徹底解説
PHP AST 徹底解説do_aki
 
Writing php extensions in golang
Writing php extensions in golangWriting php extensions in golang
Writing php extensions in golangdo_aki
 
php7's ast
php7's astphp7's ast
php7's astdo_aki
 
N対1 レプリケーション + Optimizer Hint
N対1 レプリケーション + Optimizer HintN対1 レプリケーション + Optimizer Hint
N対1 レプリケーション + Optimizer Hintdo_aki
 
20150212 プレゼンテーションzen
20150212 プレゼンテーションzen20150212 プレゼンテーションzen
20150212 プレゼンテーションzendo_aki
 
MySQL Casual Talks 7 「N:1 レプリケーション ~進捗どうですか?~」
MySQL Casual Talks 7 「N:1 レプリケーション ~進捗どうですか?~」MySQL Casual Talks 7 「N:1 レプリケーション ~進捗どうですか?~」
MySQL Casual Talks 7 「N:1 レプリケーション ~進捗どうですか?~」do_aki
 
20141017 introduce razor
20141017 introduce razor20141017 introduce razor
20141017 introduce razordo_aki
 
20141011 mastering mysqlnd
20141011 mastering mysqlnd20141011 mastering mysqlnd
20141011 mastering mysqlnddo_aki
 
php in ruby
php in rubyphp in ruby
php in rubydo_aki
 
PHP から Groonga を使うにはこんなコードになるよ!
PHP から Groonga を使うにはこんなコードになるよ!PHP から Groonga を使うにはこんなコードになるよ!
PHP から Groonga を使うにはこんなコードになるよ!do_aki
 
N:1 Replication meets MHA
N:1 Replication meets MHAN:1 Replication meets MHA
N:1 Replication meets MHAdo_aki
 
Php radomize
Php radomizePhp radomize
Php radomizedo_aki
 
php and sapi and zendengine2 and...
php and sapi and zendengine2 and...php and sapi and zendengine2 and...
php and sapi and zendengine2 and...do_aki
 

More from do_aki (20)

Tritonn から Elasticsearch への移行話
Tritonn から Elasticsearch への移行話Tritonn から Elasticsearch への移行話
Tritonn から Elasticsearch への移行話
 
php-src の歩き方
php-src の歩き方php-src の歩き方
php-src の歩き方
 
PHP と SAPI と ZendEngine3 と
PHP と SAPI と ZendEngine3 とPHP と SAPI と ZendEngine3 と
PHP と SAPI と ZendEngine3 と
 
PHPとシグナル、その裏側
PHPとシグナル、その裏側PHPとシグナル、その裏側
PHPとシグナル、その裏側
 
再考:列挙型
再考:列挙型再考:列挙型
再考:列挙型
 
signal の話 或いは Zend Signals とは何か
signal の話 或いは Zend Signals とは何かsignal の話 或いは Zend Signals とは何か
signal の話 或いは Zend Signals とは何か
 
PHP AST 徹底解説(補遺)
PHP AST 徹底解説(補遺)PHP AST 徹底解説(補遺)
PHP AST 徹底解説(補遺)
 
PHP AST 徹底解説
PHP AST 徹底解説PHP AST 徹底解説
PHP AST 徹底解説
 
Writing php extensions in golang
Writing php extensions in golangWriting php extensions in golang
Writing php extensions in golang
 
php7's ast
php7's astphp7's ast
php7's ast
 
N対1 レプリケーション + Optimizer Hint
N対1 レプリケーション + Optimizer HintN対1 レプリケーション + Optimizer Hint
N対1 レプリケーション + Optimizer Hint
 
20150212 プレゼンテーションzen
20150212 プレゼンテーションzen20150212 プレゼンテーションzen
20150212 プレゼンテーションzen
 
MySQL Casual Talks 7 「N:1 レプリケーション ~進捗どうですか?~」
MySQL Casual Talks 7 「N:1 レプリケーション ~進捗どうですか?~」MySQL Casual Talks 7 「N:1 レプリケーション ~進捗どうですか?~」
MySQL Casual Talks 7 「N:1 レプリケーション ~進捗どうですか?~」
 
20141017 introduce razor
20141017 introduce razor20141017 introduce razor
20141017 introduce razor
 
20141011 mastering mysqlnd
20141011 mastering mysqlnd20141011 mastering mysqlnd
20141011 mastering mysqlnd
 
php in ruby
php in rubyphp in ruby
php in ruby
 
PHP から Groonga を使うにはこんなコードになるよ!
PHP から Groonga を使うにはこんなコードになるよ!PHP から Groonga を使うにはこんなコードになるよ!
PHP から Groonga を使うにはこんなコードになるよ!
 
N:1 Replication meets MHA
N:1 Replication meets MHAN:1 Replication meets MHA
N:1 Replication meets MHA
 
Php radomize
Php radomizePhp radomize
Php radomize
 
php and sapi and zendengine2 and...
php and sapi and zendengine2 and...php and sapi and zendengine2 and...
php and sapi and zendengine2 and...
 

Mod lua

  • 2. do_aki (どぅーあき) |所属| > 株式会社もしも (ドロップシッピング・アフィリエイトASP) |仕事| > インフラ(サーバ管理)兼 Webアプリケーション開発 |出現| > 渋谷・山手線沿線 |特性| > PHPer http://do-aki.net/
  • 4. 詳しくはここ見ると良いよ http://blog.matsumoto-r.jp/?p=2117
  • 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* ディレクティブで指定
  • 7. 共通していること • request_rec が引数として渡される – lua からは userdata として見える – r または rw なプロパティ – いくつかのメソッド • apache2 モジュールが利用できる – ほとんど定数?
  • 8. hello.lua function 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
  • 10. request_rec • 関数の引数として渡される • modules/lua/lua_request.c@600 ap_lua_load_request_lmodule • apache の request_rec ラッパ + ユーティリ ティ • is_https とかドキュメントにない変数も – 値は正しくないけど • parse_body メソッドは存在しない
  • 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‘ • 列挙する方法がワカラン。。。
  • 13. puts/write method • r:puts(string [,string…]) • r:write(string) • write の2つめ以降の引数は無視される • string 以外は許容しないので、tostring 使 うと便利 • 例: r:puts(tostring(r.user))
  • 14. add_output_filter method • ドキュメントには r:addoutputfilter(name|function) と書いてあるが嘘 • しかも、string しか受け付けないっぽい • ap_add_output_filter を呼び出してる • 別で定義された output filter を利用する?
  • 16. LuaRoot • mod_lua 関連ディレクティブで指定する lua スクリプトのベースディレクトリを指 定 • 相対パスで指定した場合の基準パスとな る
  • 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 以外にすると、変数が(中途半端に)永 続化
  • 20. LuaInherit • LuaHook* ディレクティブの継承をするか • また、外側と内側の設定どちらを優先す るか(?) – none (default) – parent-first – parent-last
  • 21. LuaCodeCache • Lua のインメモリコードキャッシュの設定 – stat : 都度 mtime を確認 – forever : 一度キャッシュしたらそのまま – never : キャッシュしない • マニュアルにあるのに、使えない。 • それどころかコードにも存在しない
  • 22. LuaMapHandler • Lua スクリプト専用の rewrite みたいなも の • uri とLuaスクリプト (とその中の関数) を 紐付けることができる • という説明 • マニュアルにあるのに、使えない。 • それどころかコードにも存在しない
  • 23. LuaHook* • 指定の仕方は全て LuaHook* script function ([early|late]) • Lua スクリプトが読み込まれるのは実行時 – apache 起動時にファイル/関数が無くても怒ら れない – 今のところはね
  • 24. LuaHookTranslateName • mod_rename の代替として – apache と分離してテストできる! • <Directory> 内では使えなかった • r.filename を指定して apache2.OK を返せばよ い • apache2.DECLINE を返すと保留 (他モジュー ルへ) • ステータスコードを返すのもあり
  • 25. LuaHookMapToStorage LuaHookAccessChecker LuaHookFixups LuaQuickHandler • 常に呼ばれた • QuickHandler -> TranslateName -> MapToStorage -> AccessChecker-> Fixup • Qucik は Hook ではないようだが……
  • 26. LuaHookCheckUserID LuaHookTypeChecker LuaHookAuthChecker LuaHookInsertFilter • どうやったら呼ばれるのかわからない
  • 28. << Conclusion >> • まだ experimental • ドキュメントを信じてはいけない • apache のhookについて知っていると良さ そう • lua 面白い
  • 29. end
  • 30. ちょーてきとーなおまけ << fluent-logger-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