Home > Apache
Apache Archive
Apache&Cのお勉強:mod_statusをちょっと変えてみる(クエリでExtendedStatus ONに)
- 2009-08-27 (Thu)
- Apache
Apacheのお勉強継続中。
Cとかわからなすぎて、Apacheのソース読むどころか、
モジュール作ってみるのさえいつになることやら。
なんて愚痴ってばかりもいられないので、
今日は既存のモジュールを弄ってみる。
ターゲットはmod_status。
?autoで形式変えれるんだから、
?extendでExtendedStatus ONの変わりができないかという発想。
参考書がパンダ本なので、Apacheのバージョンは1.3です。
# prototype作成
cd /home/t/module
apxs -g -n status2
cd status2
# mod_statusで上書き
cp -pi mod_status2.c mod_status2.c.org
cp -pi /home/t/apache_1.3.41/src/modules/standard/mod_status.c mod_status2.c
# statusをstatus2に置換
$perl -i.bk -p -w -e 's/status/status2/g' mod_status2.c
# やりすぎた。定義済みのがあるらしい
$ perl -i -p -w -e 's/extended_status2/extended_status/g' mod_status2.c
$ perl -i -p -w -e 's/score_record\.status2/score_record\.status/g' mod_status2.c
# そのまま動かしてみる
make
make install
# 自動で設定される
LoadModule status2_module libexec/mod_status2.so
# 手動設定するやつ
vi /home/t/apache/conf/module.conf
<Location /status>
SetHandler server-status
</Location>
<Location /status2>
SetHandler server-status2
</Location>
# 再起動
apachectl restart
# 動作確認⇒OK
firefox localhost:8080/status &
firefox localhost:8080/status2 &
すでに行き当たりばったり感がガンガン漂ってますが、
気にせずカスタマイズしていきましょう。
# 動いた状態を保存しとく
cp -pi mod_status2.c mod_status2.c.ok
クエリに応じた処理を追加。
vi mod_status2.c
160行目付近
/* ID values for command table */
#define STAT_OPT_END -1
#define STAT_OPT_REFRESH 0
#define STAT_OPT_NOTABLE 1
#define STAT_OPT_AUTO 2
#define STAT_OPT_EXTEND 3
170行目付近
ENDまでループしてるっぽいので4個目に挿入。
static const struct stat_opt status2_options[] = /* see #defines above */
{
{STAT_OPT_REFRESH, "refresh", "Refresh"},
{STAT_OPT_NOTABLE, "notable", NULL},
{STAT_OPT_AUTO, "auto", NULL},
{STAT_OPT_EXTEND, "extend", NULL},
{STAT_OPT_END, NULL, NULL}
};
250行目付近
case STAT_OPT_AUTO:
r->content_type = "text/plain; charset=ISO-8859-1";
short_report = 1;
break;
case STAT_OPT_EXTEND:
break;
}
# とりあえず、ここまででテスト⇒OK
make
make install
apachectl restart
firefox localhost:8080/status2 &
# さて、いよいよExtendedStatusをONに
# ap_extended_statusが怪しい
# /home/t/apache_1.3.41/src/include/http_conf_globals.h
# で定義されてるやつ↓
# extern API_VAR_EXPORT int ap_extended_status;
vi mod_status2.c
250行目付近
case STAT_OPT_EXTEND:
ap_extended_status = 1;
break;
}
としてみる。
# 動いた・・・けど、ずっとExtendedStatus Onになっちゃう。
# 保存しといてメソッドから出る前に戻せばいいのか?
180行目付近
static int status2_handler(request_rec *r)
{
int extend_by_query = 0;
int temp_ap_extended_status = ap_extended_status;
:
:
250行目付近
case STAT_OPT_EXTEND:
ap_extended_status = 1;
extend_by_query = 1;
break;
}
:
:
720行目付近
if (extend_by_query) {
ap_extended_status = temp_ap_extended_status;
}
ap_kill_timeout(r);
return 0;
}
おぉ!一応要件通りの結果に!!
/status2で概要を目で見つつ、
/status2?auto&extendで詳細情報を機械的に取得、
とか、需要ないか;
・・・っていうか何か絶対ダメだな、このコード。
素直に設定ファイルで変更した方が良さそうだ。
(Cがわからなすぎて、何が危ないかもわからない・・・)
というわけでソース全体を公開するのは止めときます。
まぁそこそこ勉強になったのでめでたしめでたし。
mod_hello: 初めてのApacheモジュール
- 2009-08-15 (Sat)
- Apache
さて、今回からモジュールプログラミングをしていきます。
まずは何もしないモジュールを作って、開発の流れを掴みたいと思います。
雛型作成
Apache付属のapxsコマンドを使います。
cd /home/t/module /home/t/apache/bin/apxs -g -n hello
※ mod_soを有効にしていないとエラーになるので注意。
/home/t/apache/bin/apxs -g -n hello apxs:Error: Sorry, no DSO support for Apache available apxs:Error: under your platform. Make sure the Apache apxs:Error: module mod_so is compiled into your server apxs:Error: binary `/home/t/apache/bin/httpd'.
ちょっと弄る
雛型そのままでも動きますが、少しだけ変えてみます。
vi mod_hello.c ap_rputs("Hello, Apache Module!<br />\n", r); ap_rputs("The sample page from mod_hello.c\n", r);
これだけです。
コンパイル・インストール
make;make installすれば、
モジュールのコピーや設定ファイルへの追記まで勝手にやってくれます。
vi /home/t/.bash_profile PATH=$PATH:$HOME/bin:$HOME/apache/bin source /home/t/.bash_profile cd /home/t/module/hello make make install grep mod_hello /home/t/apache/conf/httpd.conf LoadModule hello_module libexec/mod_hello.so ls /home/t/apache/libexec/mod_hello.so /home/t/apache/libexec/mod_hello.so
※ apxsへのパスを通していないとエラーになります。
make apxs -c mod_hello.c make: apxs: コマンドが見つかりませんでした make: *** [mod_hello.so] エラー 127
動作確認
設定ファイルに以下を追記することで、
動作確認を行うことができます。
vi httpd.conf Include conf/module.conf vi module.conf <Location /hello> SetHandler hello </Location> firefox localhost:8080/hello &
※ Includeしないで、直接httpd.confに書いてもいいんですが、
今後いろいろと試してぐちゃぐちゃになりそうだったので、僕は分けておきました。
※ mod_soを無効のままインストールしちゃった場合は、
apacheディレクトリごと消して入れ直しましょう。
じゃないと(僕みたいに)以下のエラーに悩まされることになります。
tail -f error_log Syntax error on line 205 of /home/t/apache/conf/httpd.conf: Invalid command 'LoadModule', perhaps mis-spelled or defined by a module not included in the server configuration
さて、これでとりあえず、
「Hello, Apache Module!
The sample page from mod_hello.c」
という画面は表示できるようになりました。
(雛型をほぼそのまま動かしただけですが・・・)
次回からいよいよ中身(C言語)に入っていきたいと思います。
Apache1.3をインストール(ソースから)
- 2009-08-15 (Sat)
- Apache
まずはインストール。
これがなきゃ始まらない。
作業は全て/home/t/でやります。
OSはCentOS 5.2です。
ダウンロード・展開
適当なサイトからwgetしてtarします。
終わりです。
wget http://www.meisei-u.ac.jp/mirror/apache/httpd/apache_1.3.41.tar.gz tar zx(v)f apache_1.3.41.tar.gz
インストール
/home/t/apacheにインストールします。
また、後々のためにmod_soを有効にしておきます。
他はデフォルトのままです。
cd apache_1.3.41 ./configure --prefix=/home/t/apache --enable-module=so make make install
※ はじめUbuntuでやっててここではまりました。
/bin/shがdashだからのようです
※ 正直ちょっと前まで、configure?make?っていう状況だったので、
ITmedia エンタープライズ : Linux Tips「./configure;make;make installにはどんな意味がある?」
を読んでお勉強しときました。
動作確認
apache起動して、ブラウザでアクセスしてみます。
cd /home/t/apache bin/apachectl start firefox localhost:8080 &
おなじみの、
「あなたの予想に反して、このページが見えているでしょうか?」
画面が表示され、めでたしめでたし。
これで準備は完了です。
次回以降本格的にモジュールの話に入っていきたいと思います。
それでは。
おまけ:SSL対応
いずれ必要になるかもしれないので、
mod_sslバージョンもインストールしておく。
参考ページはこちら↓
mod_sslのインストール - BitArts
WEBシステム開発: WEBサーバ構築サービス|Apache+mod_ssl
準備&opensslインストール
mkdir ssl cp apache_1.3.41.tar.gz ssl cd ssl tar zxf apache_1.3.41.tar.gz ※ tarの展開先とか名前指定とかよくわからん・・・ wget http://www.openssl.org/source/openssl-0.9.8k.tar.gz tar zxf openssl-0.9.8k.tar.gz cd openssl-0.9.8k ./config make su make install exit
mod_sslパッチ当て
cd .. wget http://www.modssl.org/source/mod_ssl-2.8.31-1.3.41.tar.gz tar zxf mod_ssl-2.8.31-1.3.41.tar.gz cd mod_ssl-2.8.31-1.3.41 ./configure \ --prefix=/home/t/ssl/apache \ --enable-module=so \ --with-apache=../apache_1.3.41 \ --with-ssl=/usr/local/ssl
apacheインストール&動作確認
cd ../apache_1.3.41 make make certificate パスフレーズはn、それ以外は全部Enter make install /home/t/ssl/apache/bin/apachectl startssl firefox https://localhost:8443/ &
無事、接続完了。
もちろん、オレオレ+CN違うので警告でますけどね。
おまけが長くなりましたが、以上です。
C言語初心者がApacheのソースを読めるようになるまで
- 2009-08-15 (Sat)
- Apache
あ、どうもお久しぶりです。
tnantokaです。
最近はメモをwiki(google sites)に書くようになっちゃって、
すっかりブログの更新をしない状況が続いてました。すいません。
ただどうもwikiは僕には合わないらしく(時系列の方がしっくりくる)
ブログにメモる運用に戻そうと思います。
というわけで今後ともよろしくお願いします。
さて、最近の私の興味は(インフラエンジニアらしく)Apacheにあります。
Apacheを使いこなせるのはもちろん、最終的にはソースを読めるようになりたいのです。
C言語もろくに知らない僕ですが頑張ってみようと思います。
まずは、Apacheの仕組み理解+C言語のお勉強のため、
モジュールプログラミングをしてみる予定です。
教材は、需要はあるはず(Amazonマーケットプレイスだと1万円オーバー)なのに、
なぜか再販されないこちら。
(ずっと読みたかったんですが、たまたま借りることができました)
MODULE.JP - Apacheモジュールプログラミングガイド
しばらくはapacheの話題が続くと思いますが、
更新頻度を戻していきますのでお付き合い宜しくお願いします。
※ コメントなどはお気軽にどうぞ
Home > Apache
- Search
-
Loading
- Feeds
- Links
- スポンサードリンク