SlideShare a Scribd company logo
1 of 20
Download to read offline
Apache 2.4系とmod_luaについて

  第2回 松本勉強会 5月25日
   京都大学 情報学研究科
  松本 亮介 @matsumotory
今日の発表
1. Apache 2.4
  – 変更点概要
  – Apache2.4と2.2とNginxの比較ベンチマーク
2. mod_luaとは
3. mod_luaサンプル
4. まとめ

       適宜、質問・指摘・アドバイス下さい!
1. Apache 2.4
Apache 2.4 リリース
• 2012年4月20日にリリース
  – 数年ぶりの安定板
  – 実際にはML上で結構適当に多数決で決まっている

• Nginxに対抗した実装に変更
  –   パフォーマンス改善
  –   メモリ使用量低減
  –   I/O多重化採用
  –   プロキシやキャッシュ周りの改善

詳しくは・・・
http://people.apache.org/~jim/presos/ACNA11/Ap
ache_httpd_cloud.pdf
Apache 2.4 変更点
• 2.2から様々な新機能が追加・変更
 – MPMがLoadableに
 – defaultのMPMが変更
   • preforkからevent_mpmへ
 – 様々なモジュールや機能が追加・改善
   • mod_sed、mod_lua、bufferedlogs、rotatelogs
 – <If><Elseif><Else>の記述が可能
 – error_logのformat指定
 – mod_cgiがmod_cgidへ

 ⇒ 性能改善してるのかベンチマークで確認
Apache 2.4 vs Nginx vs Apache 2.2
       (静的コンテンツ)
Apache 2.4 vs Apache 2.2(動的コンテンツ)
        (2.4event vs 2.2 prefork)
Apache 2.4 vs Apache 2.2 (動的コンテンツ)
       (2.4prefork vs 2.2 prefork)
Apache 2.2 vs Apache 2.2
(2.2prefork php5.1 vs 2.2 prefork php5.3)
Apache 2.4 ベンチマーク
• 結構もめました
 – 僕のベンチマークが世界に広まる
 – Apacheの人 vs Nginxの人が喧嘩
 – Nginx側のベンチマーク(同時接続数重視)が出る
   •   Nginxの方が性能いいと主張
   •   Apacheの人が環境設定等にケチをつける
   •   Nginxの人は引き下がる(Apacheの人多過ぎ)
   •   http://blog.zhuzhaoyuan.com/2012/02/apache-24-faster-than-
       nginx/


⇒ ベンチマークはその環境だとその結果となる目安で
あって優劣を決めるものではない by Apacheコアの人
2. mod_luaとは
mod_luaとは
• Apache2.4の新機能(厳密には2.3から)
 – 軽量組み込みスクリプトLuaをApacheで動かす
   • Luaは非常に軽量で高速(スクリプト言語最速)
   • Webコンテンツとして扱う
   • Apacheモジュールの実装を支援する


 – Apacheモジュールの実装を支援に注目
   • LuaスクリプトをApacheにフックさせるためのインターフェイス
   • Luaスクリプト内にApacheの内部処理を実装可能
   • mod_perl、mod_ruby等より軽量で早い


  ⇒ Cでの実装不要で保守性高く開発の敷居も下がる
3. mod_luaサンプル
mod_lua サンプル
1. 単純なrewriteのような処理
 –   uri2file()
 –   ある条件でアクセスファイルを変更
2. 任意の時間帯のみ別のサーバへ負荷分散
 –   golden_balancer()
 –   19時から24時は別のサーバへリダイレクト
3. mod_lalimitをLuaで書き換えてみた
 –   load_checker()
 –   任意のロードアベレージを超えてていたら503を返す
 –   Cで実装する場合と比べてどれくらいコード行数が減るか
require "apache2"
                                             rewriteのような処理
function uri2file(r)
  if string.match(r.uri, ".*¥.php") then
     r.filename = "/usr/local/apache2.4/htdocs/".. r.hostname .."/".. r.uri
  end
  return apache2.DECLINED
end
                                               夜の19時から24時は
function golden_balancer(r)                    サーバ分散する処理
  ctime = os.date("%H")
  if ctime > 19 then
     if math.random() < 0.5 then
        r.headers_out["Location"] = "http://server2.example.com/".. r.uri
        return apache2.HTTP_MOVED_TEMPORARILY
     end
  else
     return apache2.DECLINED
  end
end
require "apache2"
load_limit = 2
                                                          LoadAvgを取得
function get_load()
  file = io.open('/proc/loadavg', 'r')
  state = file:read('*a')
  file:close()
  cload = string.match(state, '(%d+¥.%d+)%s+.*')
  return cload
end
function load_checker(r)
  if string.match(r.filename, "^.*¥.php$") then
                                                               LoadAvgを比較
     cload = tonumber(get_load())
     if cload > load_limit then
        r:warn(r.filename .. “is CGI. current load(”.. cload ..“) is highter than load_limit(".. load_limi
        r:puts("Sorry. loadavg high!")
        return 503
     else
        r:debug(r.filename .. "is CGI. current load(".. cload ..") is lower than load_limit(".. load_lim
     end
  end
  return apache2.OK
end                                     900行が30行くらいに
mod_lua 設定
Loadmodule lua_module modules/mod_lua.so
LuaHookTranslateName conf/extra/lua/mapper.lua uri2file
LuaHookTranslateName conf/extra/lua/mapper.lua golden_balancer
LuaHookAccessChecker conf/extra/lua/access_checker.lua load_check

 • LuaのfunctionをApache内部でhook
    – Luaスクリプトを変更すれば即反映
    – 誰でも簡単にApacheモジュールが作れる
    – 問題点
        •   Luaがインフラエンジニアには普及していない
        •   モジュール支援としては実装できてない所が多い
        •   Luaの仕様上スクリプトの都度state作成とコンパイル必要
        •   それでも他のスクリプトよりは十分早くて軽量
4. まとめ
Apache 2.4 と mod_luaのまとめ
• Apache2.4
  – Nginxを意識し過ぎ?
    • 動的コンテンツの処理が遅くなるのは良くない
    • event_mpmがうまく動かなくなる事例もある
    • しばらく様子見
  – 新機能は充実
    • mod_luaでApacheモジュールの夢が広がる
    • BufferedLogsやrotatelogなどのLog周りも充実
    • 監視、Log、分析が今後の流行り
• mod_lua
  – 個人的には中途半端な印象
  – mod_mrubyを開発中
ご清聴ありがとうございました

More Related Content

What's hot

Docker+CoreOS+GCEで自動スケール分散レイトレ
Docker+CoreOS+GCEで自動スケール分散レイトレDocker+CoreOS+GCEで自動スケール分散レイトレ
Docker+CoreOS+GCEで自動スケール分散レイトレperyaudo
 
Chefを利用した運用省力化とDevOpsの取り組みについて
Chefを利用した運用省力化とDevOpsの取り組みについてChefを利用した運用省力化とDevOpsの取り組みについて
Chefを利用した運用省力化とDevOpsの取り組みについてYuuki Namikawa
 
今日から使い始めるChef
今日から使い始めるChef今日から使い始めるChef
今日から使い始めるChefMasahiro NAKAYAMA
 
Automation tech casual_talks_1_20120717
Automation tech casual_talks_1_20120717Automation tech casual_talks_1_20120717
Automation tech casual_talks_1_20120717Makoto Haruyama
 
Webサーバのチューニング
WebサーバのチューニングWebサーバのチューニング
WebサーバのチューニングYu Komiya
 
Linux Server 冗長化~リアルタイム同期でラクラク運用~
Linux Server 冗長化~リアルタイム同期でラクラク運用~Linux Server 冗長化~リアルタイム同期でラクラク運用~
Linux Server 冗長化~リアルタイム同期でラクラク運用~miraitas
 
OpenJDK コミュニティに参加してみよう #jjug
OpenJDK コミュニティに参加してみよう #jjugOpenJDK コミュニティに参加してみよう #jjug
OpenJDK コミュニティに参加してみよう #jjugYuji Kubota
 
20140828 #ssmjp 社内チューニンガソンで優勝したはなし
20140828 #ssmjp 社内チューニンガソンで優勝したはなし20140828 #ssmjp 社内チューニンガソンで優勝したはなし
20140828 #ssmjp 社内チューニンガソンで優勝したはなしMasahiro NAKAYAMA
 
LINEのMySQL運用について 修正版
LINEのMySQL運用について 修正版LINEのMySQL運用について 修正版
LINEのMySQL運用について 修正版LINE Corporation
 
MaxScaleを触ってみた
MaxScaleを触ってみたMaxScaleを触ってみた
MaxScaleを触ってみたFujishiro Takuya
 
microPCFを使ってみよう
microPCFを使ってみようmicroPCFを使ってみよう
microPCFを使ってみようHiroaki_UKAJI
 
大規模化するピグライフを支えるインフラ ~MongoDBとChefについて~ (前編)
大規模化するピグライフを支えるインフラ ~MongoDBとChefについて~ (前編)大規模化するピグライフを支えるインフラ ~MongoDBとChefについて~ (前編)
大規模化するピグライフを支えるインフラ ~MongoDBとChefについて~ (前編)Akihiro Kuwano
 
さくらの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インフラ時代...さくらインターネット株式会社
 
Dockerは2016年の秋現在どのような状況なのか~忙しい人の5分で分かるDocker~
Dockerは2016年の秋現在どのような状況なのか~忙しい人の5分で分かるDocker~Dockerは2016年の秋現在どのような状況なのか~忙しい人の5分で分かるDocker~
Dockerは2016年の秋現在どのような状況なのか~忙しい人の5分で分かるDocker~Masahito Zembutsu
 
Apacheチューニング
ApacheチューニングApacheチューニング
Apacheチューニングii012014
 
Appsody でnodejsのアプリを立ち上げよう!
Appsody でnodejsのアプリを立ち上げよう!Appsody でnodejsのアプリを立ち上げよう!
Appsody でnodejsのアプリを立ち上げよう!Daisuke Hiraoka
 

What's hot (20)

Docker+CoreOS+GCEで自動スケール分散レイトレ
Docker+CoreOS+GCEで自動スケール分散レイトレDocker+CoreOS+GCEで自動スケール分散レイトレ
Docker+CoreOS+GCEで自動スケール分散レイトレ
 
Chefを利用した運用省力化とDevOpsの取り組みについて
Chefを利用した運用省力化とDevOpsの取り組みについてChefを利用した運用省力化とDevOpsの取り組みについて
Chefを利用した運用省力化とDevOpsの取り組みについて
 
今日から使い始めるChef
今日から使い始めるChef今日から使い始めるChef
今日から使い始めるChef
 
Automation tech casual_talks_1_20120717
Automation tech casual_talks_1_20120717Automation tech casual_talks_1_20120717
Automation tech casual_talks_1_20120717
 
Webサーバのチューニング
WebサーバのチューニングWebサーバのチューニング
Webサーバのチューニング
 
Linux Server 冗長化~リアルタイム同期でラクラク運用~
Linux Server 冗長化~リアルタイム同期でラクラク運用~Linux Server 冗長化~リアルタイム同期でラクラク運用~
Linux Server 冗長化~リアルタイム同期でラクラク運用~
 
OpenJDK コミュニティに参加してみよう #jjug
OpenJDK コミュニティに参加してみよう #jjugOpenJDK コミュニティに参加してみよう #jjug
OpenJDK コミュニティに参加してみよう #jjug
 
Dockerと継続的インテグレーション
Dockerと継続的インテグレーションDockerと継続的インテグレーション
Dockerと継続的インテグレーション
 
nginx入門
nginx入門nginx入門
nginx入門
 
20140828 #ssmjp 社内チューニンガソンで優勝したはなし
20140828 #ssmjp 社内チューニンガソンで優勝したはなし20140828 #ssmjp 社内チューニンガソンで優勝したはなし
20140828 #ssmjp 社内チューニンガソンで優勝したはなし
 
Using Windows Azure
Using Windows AzureUsing Windows Azure
Using Windows Azure
 
LINEのMySQL運用について 修正版
LINEのMySQL運用について 修正版LINEのMySQL運用について 修正版
LINEのMySQL運用について 修正版
 
MaxScaleを触ってみた
MaxScaleを触ってみたMaxScaleを触ってみた
MaxScaleを触ってみた
 
microPCFを使ってみよう
microPCFを使ってみようmicroPCFを使ってみよう
microPCFを使ってみよう
 
大規模化するピグライフを支えるインフラ ~MongoDBとChefについて~ (前編)
大規模化するピグライフを支えるインフラ ~MongoDBとChefについて~ (前編)大規模化するピグライフを支えるインフラ ~MongoDBとChefについて~ (前編)
大規模化するピグライフを支えるインフラ ~MongoDBとChefについて~ (前編)
 
さくらの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インフラ時代...
 
Spring Boot on Kubernetes : Yahoo!ズバトク事例 #jjug_ccc
Spring Boot on Kubernetes : Yahoo!ズバトク事例 #jjug_cccSpring Boot on Kubernetes : Yahoo!ズバトク事例 #jjug_ccc
Spring Boot on Kubernetes : Yahoo!ズバトク事例 #jjug_ccc
 
Dockerは2016年の秋現在どのような状況なのか~忙しい人の5分で分かるDocker~
Dockerは2016年の秋現在どのような状況なのか~忙しい人の5分で分かるDocker~Dockerは2016年の秋現在どのような状況なのか~忙しい人の5分で分かるDocker~
Dockerは2016年の秋現在どのような状況なのか~忙しい人の5分で分かるDocker~
 
Apacheチューニング
ApacheチューニングApacheチューニング
Apacheチューニング
 
Appsody でnodejsのアプリを立ち上げよう!
Appsody でnodejsのアプリを立ち上げよう!Appsody でnodejsのアプリを立ち上げよう!
Appsody でnodejsのアプリを立ち上げよう!
 

Similar to 第2回 松本勉強会 2012 05 25 - apache2.4とmod_lua

SDLoader SeasarCon 2009 Whire
SDLoader SeasarCon 2009 WhireSDLoader SeasarCon 2009 Whire
SDLoader SeasarCon 2009 WhireAkio Katayama
 
Web Operations and Perl kansai.pm#14
Web Operations and Perl kansai.pm#14Web Operations and Perl kansai.pm#14
Web Operations and Perl kansai.pm#14Masahiro Nagano
 
Building production server on docker
Building production server on dockerBuilding production server on docker
Building production server on dockerHiroshi Miura
 
Building production server on docker
Building production server on dockerBuilding production server on docker
Building production server on dockerHiroshi Miura
 
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
 
AWSとAnsibleで実践!プロビジョニング入門‐Lamp+Laravel-
AWSとAnsibleで実践!プロビジョニング入門‐Lamp+Laravel-AWSとAnsibleで実践!プロビジョニング入門‐Lamp+Laravel-
AWSとAnsibleで実践!プロビジョニング入門‐Lamp+Laravel-靖 小田島
 
Using ngx_lua / lua-nginx-module in pixiv
Using ngx_lua / lua-nginx-module in pixivUsing ngx_lua / lua-nginx-module in pixiv
Using ngx_lua / lua-nginx-module in pixivShunsuke Michii
 
Open stack reference architecture v1 2
Open stack reference architecture v1 2Open stack reference architecture v1 2
Open stack reference architecture v1 2Dell TechCenter Japan
 
2019年度 CaaS ワークショップ @ NTTコム
2019年度 CaaS ワークショップ @ NTTコム2019年度 CaaS ワークショップ @ NTTコム
2019年度 CaaS ワークショップ @ NTTコムTomoyaTakegoshi
 
SQL Server エンジニアのためのコンテナ入門
SQL Server エンジニアのためのコンテナ入門SQL Server エンジニアのためのコンテナ入門
SQL Server エンジニアのためのコンテナ入門Insight Technology, Inc.
 
SQL Server エンジニア のための コンテナ入門
SQL Server エンジニア のための コンテナ入門SQL Server エンジニア のための コンテナ入門
SQL Server エンジニア のための コンテナ入門Tomoyuki Oota
 
第20回CloudStackユーザ会_ApacheCloudStack4.4新機能紹介
第20回CloudStackユーザ会_ApacheCloudStack4.4新機能紹介第20回CloudStackユーザ会_ApacheCloudStack4.4新機能紹介
第20回CloudStackユーザ会_ApacheCloudStack4.4新機能紹介Midori Oge
 
Jjug springセッション
Jjug springセッションJjug springセッション
Jjug springセッションYuichi Hasegawa
 
Rails解説セミナー: リリースノート解説編
Rails解説セミナー: リリースノート解説編Rails解説セミナー: リリースノート解説編
Rails解説セミナー: リリースノート解説編Yohei Yasukawa
 
DockerでAlmaLinux(web, php, pukiwiki)環境構築
DockerでAlmaLinux(web, php, pukiwiki)環境構築DockerでAlmaLinux(web, php, pukiwiki)環境構築
DockerでAlmaLinux(web, php, pukiwiki)環境構築Yoshihiro Mizoguchi
 
Dockerのキホンその2 Docker Compose Swarm Machine 利用編
Dockerのキホンその2 Docker Compose Swarm Machine 利用編Dockerのキホンその2 Docker Compose Swarm Machine 利用編
Dockerのキホンその2 Docker Compose Swarm Machine 利用編Naoki Nagazumi
 

Similar to 第2回 松本勉強会 2012 05 25 - apache2.4とmod_lua (20)

SDLoader SeasarCon 2009 Whire
SDLoader SeasarCon 2009 WhireSDLoader SeasarCon 2009 Whire
SDLoader SeasarCon 2009 Whire
 
qmake入門
qmake入門qmake入門
qmake入門
 
Web Operations and Perl kansai.pm#14
Web Operations and Perl kansai.pm#14Web Operations and Perl kansai.pm#14
Web Operations and Perl kansai.pm#14
 
Building production server on docker
Building production server on dockerBuilding production server on docker
Building production server on docker
 
Building production server on docker
Building production server on dockerBuilding production server on docker
Building production server on docker
 
lilo.linux.or.jp の話 (2017年8月)
lilo.linux.or.jp の話 (2017年8月)lilo.linux.or.jp の話 (2017年8月)
lilo.linux.or.jp の話 (2017年8月)
 
AWSとAnsibleで実践!プロビジョニング入門‐Lamp+Laravel-
AWSとAnsibleで実践!プロビジョニング入門‐Lamp+Laravel-AWSとAnsibleで実践!プロビジョニング入門‐Lamp+Laravel-
AWSとAnsibleで実践!プロビジョニング入門‐Lamp+Laravel-
 
Using ngx_lua / lua-nginx-module in pixiv
Using ngx_lua / lua-nginx-module in pixivUsing ngx_lua / lua-nginx-module in pixiv
Using ngx_lua / lua-nginx-module in pixiv
 
Open stack reference architecture v1 2
Open stack reference architecture v1 2Open stack reference architecture v1 2
Open stack reference architecture v1 2
 
2019年度 CaaS ワークショップ @ NTTコム
2019年度 CaaS ワークショップ @ NTTコム2019年度 CaaS ワークショップ @ NTTコム
2019年度 CaaS ワークショップ @ NTTコム
 
SQL Server エンジニアのためのコンテナ入門
SQL Server エンジニアのためのコンテナ入門SQL Server エンジニアのためのコンテナ入門
SQL Server エンジニアのためのコンテナ入門
 
SQL Server エンジニア のための コンテナ入門
SQL Server エンジニア のための コンテナ入門SQL Server エンジニア のための コンテナ入門
SQL Server エンジニア のための コンテナ入門
 
第20回CloudStackユーザ会_ApacheCloudStack4.4新機能紹介
第20回CloudStackユーザ会_ApacheCloudStack4.4新機能紹介第20回CloudStackユーザ会_ApacheCloudStack4.4新機能紹介
第20回CloudStackユーザ会_ApacheCloudStack4.4新機能紹介
 
Apache Module
Apache ModuleApache Module
Apache Module
 
Version管理 1
Version管理 1Version管理 1
Version管理 1
 
Jjug springセッション
Jjug springセッションJjug springセッション
Jjug springセッション
 
Rails解説セミナー: リリースノート解説編
Rails解説セミナー: リリースノート解説編Rails解説セミナー: リリースノート解説編
Rails解説セミナー: リリースノート解説編
 
DockerでAlmaLinux(web, php, pukiwiki)環境構築
DockerでAlmaLinux(web, php, pukiwiki)環境構築DockerでAlmaLinux(web, php, pukiwiki)環境構築
DockerでAlmaLinux(web, php, pukiwiki)環境構築
 
Dockerのキホンその2 Docker Compose Swarm Machine 利用編
Dockerのキホンその2 Docker Compose Swarm Machine 利用編Dockerのキホンその2 Docker Compose Swarm Machine 利用編
Dockerのキホンその2 Docker Compose Swarm Machine 利用編
 
ECS-CLI in Action
ECS-CLI in ActionECS-CLI in Action
ECS-CLI in Action
 

More from Ryosuke MATSUMOTO

Saint2012 mod process security
Saint2012 mod process securitySaint2012 mod process security
Saint2012 mod process securityRyosuke MATSUMOTO
 
軽量Ruby『mruby』について
軽量Ruby『mruby』について軽量Ruby『mruby』について
軽量Ruby『mruby』についてRyosuke MATSUMOTO
 
第1回 松本勉強会 2012 05 11 - 公開版
第1回 松本勉強会 2012 05 11 - 公開版第1回 松本勉強会 2012 05 11 - 公開版
第1回 松本勉強会 2012 05 11 - 公開版Ryosuke MATSUMOTO
 
汎用性の高い大規模共有型Webバーチャルホスティング基盤のセキュリティと運用技術の改善
汎用性の高い大規模共有型Webバーチャルホスティング基盤のセキュリティと運用技術の改善汎用性の高い大規模共有型Webバーチャルホスティング基盤のセキュリティと運用技術の改善
汎用性の高い大規模共有型Webバーチャルホスティング基盤のセキュリティと運用技術の改善Ryosuke MATSUMOTO
 
スレッド単位で権限分離を行うWebサーバのアクセス制御アーキテクチャ
スレッド単位で権限分離を行うWebサーバのアクセス制御アーキテクチャスレッド単位で権限分離を行うWebサーバのアクセス制御アーキテクチャ
スレッド単位で権限分離を行うWebサーバのアクセス制御アーキテクチャRyosuke MATSUMOTO
 

More from Ryosuke MATSUMOTO (6)

Saint2012 mod process security
Saint2012 mod process securitySaint2012 mod process security
Saint2012 mod process security
 
軽量Ruby『mruby』について
軽量Ruby『mruby』について軽量Ruby『mruby』について
軽量Ruby『mruby』について
 
20120525 mt websocket
20120525 mt websocket20120525 mt websocket
20120525 mt websocket
 
第1回 松本勉強会 2012 05 11 - 公開版
第1回 松本勉強会 2012 05 11 - 公開版第1回 松本勉強会 2012 05 11 - 公開版
第1回 松本勉強会 2012 05 11 - 公開版
 
汎用性の高い大規模共有型Webバーチャルホスティング基盤のセキュリティと運用技術の改善
汎用性の高い大規模共有型Webバーチャルホスティング基盤のセキュリティと運用技術の改善汎用性の高い大規模共有型Webバーチャルホスティング基盤のセキュリティと運用技術の改善
汎用性の高い大規模共有型Webバーチャルホスティング基盤のセキュリティと運用技術の改善
 
スレッド単位で権限分離を行うWebサーバのアクセス制御アーキテクチャ
スレッド単位で権限分離を行うWebサーバのアクセス制御アーキテクチャスレッド単位で権限分離を行うWebサーバのアクセス制御アーキテクチャ
スレッド単位で権限分離を行うWebサーバのアクセス制御アーキテクチャ
 

第2回 松本勉強会 2012 05 25 - apache2.4とmod_lua

  • 1. Apache 2.4系とmod_luaについて 第2回 松本勉強会 5月25日 京都大学 情報学研究科 松本 亮介 @matsumotory
  • 2. 今日の発表 1. Apache 2.4 – 変更点概要 – Apache2.4と2.2とNginxの比較ベンチマーク 2. mod_luaとは 3. mod_luaサンプル 4. まとめ 適宜、質問・指摘・アドバイス下さい!
  • 4. Apache 2.4 リリース • 2012年4月20日にリリース – 数年ぶりの安定板 – 実際にはML上で結構適当に多数決で決まっている • Nginxに対抗した実装に変更 – パフォーマンス改善 – メモリ使用量低減 – I/O多重化採用 – プロキシやキャッシュ周りの改善 詳しくは・・・ http://people.apache.org/~jim/presos/ACNA11/Ap ache_httpd_cloud.pdf
  • 5. Apache 2.4 変更点 • 2.2から様々な新機能が追加・変更 – MPMがLoadableに – defaultのMPMが変更 • preforkからevent_mpmへ – 様々なモジュールや機能が追加・改善 • mod_sed、mod_lua、bufferedlogs、rotatelogs – <If><Elseif><Else>の記述が可能 – error_logのformat指定 – mod_cgiがmod_cgidへ ⇒ 性能改善してるのかベンチマークで確認
  • 6. Apache 2.4 vs Nginx vs Apache 2.2 (静的コンテンツ)
  • 7. Apache 2.4 vs Apache 2.2(動的コンテンツ) (2.4event vs 2.2 prefork)
  • 8. Apache 2.4 vs Apache 2.2 (動的コンテンツ) (2.4prefork vs 2.2 prefork)
  • 9. Apache 2.2 vs Apache 2.2 (2.2prefork php5.1 vs 2.2 prefork php5.3)
  • 10. Apache 2.4 ベンチマーク • 結構もめました – 僕のベンチマークが世界に広まる – Apacheの人 vs Nginxの人が喧嘩 – Nginx側のベンチマーク(同時接続数重視)が出る • Nginxの方が性能いいと主張 • Apacheの人が環境設定等にケチをつける • Nginxの人は引き下がる(Apacheの人多過ぎ) • http://blog.zhuzhaoyuan.com/2012/02/apache-24-faster-than- nginx/ ⇒ ベンチマークはその環境だとその結果となる目安で あって優劣を決めるものではない by Apacheコアの人
  • 12. mod_luaとは • Apache2.4の新機能(厳密には2.3から) – 軽量組み込みスクリプトLuaをApacheで動かす • Luaは非常に軽量で高速(スクリプト言語最速) • Webコンテンツとして扱う • Apacheモジュールの実装を支援する – Apacheモジュールの実装を支援に注目 • LuaスクリプトをApacheにフックさせるためのインターフェイス • Luaスクリプト内にApacheの内部処理を実装可能 • mod_perl、mod_ruby等より軽量で早い ⇒ Cでの実装不要で保守性高く開発の敷居も下がる
  • 14. mod_lua サンプル 1. 単純なrewriteのような処理 – uri2file() – ある条件でアクセスファイルを変更 2. 任意の時間帯のみ別のサーバへ負荷分散 – golden_balancer() – 19時から24時は別のサーバへリダイレクト 3. mod_lalimitをLuaで書き換えてみた – load_checker() – 任意のロードアベレージを超えてていたら503を返す – Cで実装する場合と比べてどれくらいコード行数が減るか
  • 15. require "apache2" rewriteのような処理 function uri2file(r) if string.match(r.uri, ".*¥.php") then r.filename = "/usr/local/apache2.4/htdocs/".. r.hostname .."/".. r.uri end return apache2.DECLINED end 夜の19時から24時は function golden_balancer(r) サーバ分散する処理 ctime = os.date("%H") if ctime > 19 then if math.random() < 0.5 then r.headers_out["Location"] = "http://server2.example.com/".. r.uri return apache2.HTTP_MOVED_TEMPORARILY end else return apache2.DECLINED end end
  • 16. require "apache2" load_limit = 2 LoadAvgを取得 function get_load() file = io.open('/proc/loadavg', 'r') state = file:read('*a') file:close() cload = string.match(state, '(%d+¥.%d+)%s+.*') return cload end function load_checker(r) if string.match(r.filename, "^.*¥.php$") then LoadAvgを比較 cload = tonumber(get_load()) if cload > load_limit then r:warn(r.filename .. “is CGI. current load(”.. cload ..“) is highter than load_limit(".. load_limi r:puts("Sorry. loadavg high!") return 503 else r:debug(r.filename .. "is CGI. current load(".. cload ..") is lower than load_limit(".. load_lim end end return apache2.OK end 900行が30行くらいに
  • 17. mod_lua 設定 Loadmodule lua_module modules/mod_lua.so LuaHookTranslateName conf/extra/lua/mapper.lua uri2file LuaHookTranslateName conf/extra/lua/mapper.lua golden_balancer LuaHookAccessChecker conf/extra/lua/access_checker.lua load_check • LuaのfunctionをApache内部でhook – Luaスクリプトを変更すれば即反映 – 誰でも簡単にApacheモジュールが作れる – 問題点 • Luaがインフラエンジニアには普及していない • モジュール支援としては実装できてない所が多い • Luaの仕様上スクリプトの都度state作成とコンパイル必要 • それでも他のスクリプトよりは十分早くて軽量
  • 19. Apache 2.4 と mod_luaのまとめ • Apache2.4 – Nginxを意識し過ぎ? • 動的コンテンツの処理が遅くなるのは良くない • event_mpmがうまく動かなくなる事例もある • しばらく様子見 – 新機能は充実 • mod_luaでApacheモジュールの夢が広がる • BufferedLogsやrotatelogなどのLog周りも充実 • 監視、Log、分析が今後の流行り • mod_lua – 個人的には中途半端な印象 – mod_mrubyを開発中