狠狠撸

狠狠撸Share a Scribd company logo
Webサーバ勉強会 #3
    発表资料
自己绍介



               id:oranie?
                @oranie

?渋谷の緑色のグループ会社で、グループ内でも余り知られていないシステムでなん
か色々やる簡単なお仕事しています。

?緑色のみんながよく知っているサービスの裏側とかは全く知らないですw
ざっくり内容




①モジュールって何やっているの?

 ②どうやって動いているの?
発表内容




        初心者が
Apacheモジュールとはなんぞや?
   をとりあえず調べてみた。
そもそも




      Apacheのモジュール
(mod_rewriteやmod_authやら色々)
       は一杯あるけど、
 そもそもどんな動作をしているの?
そもそも②




まずApacheはリクエストを受け取ると、
どのような動きで処理をしているのか?
Apacheの処理フェイズについて

Apache はリクエストを複数の フェイズ (phase) で処理。
典型的な静的ファイルの場合
(1) 要求された URI を実際のファイルの場所に変換する
(2) ファイルを読み出してクライアントに送信する
(3) リクエストをログに記録する
というざっくり分けて三つのフェイズがある。
※細かく分けるともっとあります。今日は割愛。
例えばmod_auth_basicによるbasic認証が掛かっている場合は、1のフェイズ
 にリクエストを処理、次に認証掛かっているディレクトリなら認証処理をして
 問題なければ2のフェイズに???と言った具合。
Apacheの主な動作

  図で表すと
基本処理を踏まえ、
       モジュールを動作させるには?
①Cで動作させたい処理を記述したモジュールを作る。
②Apacheの適切なフェイズにモジュールで定義した
hook関数を設定する。
③モジュールによってはhttpd.config等に必要な設定し
  て、Apache再起動。

簡単に言うと、これでモジュールは動作する。
さっきの図で追加補足すると
奥别产サーバ勉强会03
実際にモジュールを作ってみる
モジュールを作る一番簡単な方法。
①apxsコマンドで雛形を作成。
# apxs -n test -g
オプションの意味:-n モジュール名の設定 -g 雛形の作成


実行すると、Makefile mod_test.c modules.mk こんなファイルが自動で作成。
②雛形を元に処理を記述。
③/usr/sbin/apxs -c -i mod_test.c
オプションの意味:-cでコンパイル、-iでインストール
でインストール。
④雛形のコメントに書かれているように
LoadModule test_module modules/mod_test.so
<Location>
SetHandler test
</Location>
を記述してapacheを再起動。
mod_testの中身(長いのでコメントは省略)
40 #include "httpd.h"                                          58 static void test_register_hooks(apr_pool_t *p)
41 #include "http_config.h"                                    59 {
42 #include "http_protocol.h"                                  60      ap_hook_handler(test_handler, NULL, NULL, APR_HOOK_MIDDLE);
43 #include "ap_config.h"                                      61 }
44                                                             62
45 /* The sample content handler */                            63 /* Dispatch list for API hooks */
46 static int test_handler(request_rec *r)                     64 module AP_MODULE_DECLARE_DATA test_module = {
47 {                                                           65      STANDARD20_MODULE_STUFF,
48     if (strcmp(r->handler, "test")) {                       66      NULL,            /* create per-dir   config structures */
49         return DECLINED;                                    67      NULL,            /* merge per-dir    config structures */
50     }                                                       68      NULL,            /* create per-server config structures */
51     r->content_type = "text/html";                          69      NULL,            /* merge per-server config structures */
52                                                             70      NULL,            /* table of config file commands         */
53     if (!r->header_only)                                    71      test_register_hooks /* register hooks                */
54         ap_rputs("The sample page from mod_test.cn", r);   72 };
55     return OK;
56 }
mod_testを実行してみると???
モジュールを読み込んで、http://hogehoge/testにアクセスすると、
「The sample page from mod_test.c」って表示されましたね?
54    ap_rputs("The sample page from mod_test.cn", r);
の内容が表示されました。


処理フローとしては
①クライアントからのリクエストを受信、解析
②Apache内部で処理が順番に行われ、今回登録したハンドラが「test」へのリ
 クエストを引っ掛ける
③引っ掛かったリクエストに対して、設定した内容をクライアントに返す。
mod_kaomojiを作ってみる
もう少し改造して、例えば「うちの会社のtxt/htmlページには
全てヘッダに「(???)」を表示させたい。でもヘッダファイル書いて読み込ませる
 のは忘れるかも知れないし面倒臭い(?Д?)y─┛~~」と言った場合に、
あるディレクトリにアクセスするとヘッダに「(???)」を
必ず追加するモジュール。

実際にアクセスして実演します。
まとめ
①モジュールはApacheの各処理フェイズで任意の制御?処理を
 行いたい時に利用する。
②モジュール内部は実処理部分、Apacheに登録するフック関
 数、モジュールの定義をしている構造体。
③仕組みが分かればかなり自由になんでも出来る。→なので、
 まずApacheの処理を覚えると、各モジュールの動作理解も
 進むんじゃないでしょうか?
④Cで作成する必要があるので、敷居は高いがその分高速らしい
 (普通に考えればそうだろうけど、実際に同じような処理書いてベンチ取っていないから誰か???!)

⑤簡単な表示とかならすぐ作れるっぽいですね!僕は心優しい人のコピペで
 文字列ちょろっと変えたぐらいですが???。

⑥動作を調べたい時にCが読めないと、泣きながら調べる羽目
 になります。
参考にした本?サイト(というかほとんどコピペです。)
         オライリー:Apacheハンドブック 20章~21章


       DSAS開発者の部屋:apache module 開発事始め
       http://dsas.blog.klab.org/archives/50574774.html


        Asial Blog:手軽に出来るApacheモジュール開発
                  http://blog.asial.co.jp/715


   他、多数の「apache モジュール 開発」で検索ヒットしたサイトの皆様


      非常に為になる解説本当にありがとうございます。m(_ _)m


       もう少し勉強して、これからは少しは自分で解説を???。
 あと、モジュール絡みの本は軒並み絶版になっているので、再版される事を期待。

More Related Content

奥别产サーバ勉强会03