忍者ブログ

Home > Apache

Apache Archive

[PR]

  • 2024-04-27 (Sat)
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

  • Comments (Close):
  • TrackBack (Close):

Apache&Cのお勉強:mod_statusをちょっと変えてみる(クエリでExtendedStatus ONに)

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がわからなすぎて、何が危ないかもわからない・・・)

というわけでソース全体を公開するのは止めときます。

まぁそこそこ勉強になったのでめでたしめでたし。

PR

mod_hello: 初めての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をインストール(ソースから)

まずはインストール。
これがなきゃ始まらない。

作業は全て/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のソースを読めるようになるまで

あ、どうもお久しぶりです。
tnantokaです。

最近はメモをwiki(google sites)に書くようになっちゃって、
すっかりブログの更新をしない状況が続いてました。すいません。

ただどうもwikiは僕には合わないらしく(時系列の方がしっくりくる)
ブログにメモる運用に戻そうと思います。

というわけで今後ともよろしくお願いします。

さて、最近の私の興味は(インフラエンジニアらしく)Apacheにあります。
Apacheを使いこなせるのはもちろん、最終的にはソースを読めるようになりたいのです。
C言語もろくに知らない僕ですが頑張ってみようと思います。

まずは、Apacheの仕組み理解+C言語のお勉強のため、
モジュールプログラミングをしてみる予定です。

教材は、需要はあるはず(Amazonマーケットプレイスだと1万円オーバー)なのに、
なぜか再販されないこちら。
(ずっと読みたかったんですが、たまたま借りることができました)
MODULE.JP - Apacheモジュールプログラミングガイド

しばらくはapacheの話題が続くと思いますが、
更新頻度を戻していきますのでお付き合い宜しくお願いします。
※ コメントなどはお気軽にどうぞ

Home > Apache

Search
Loading
Feeds
Links
スポンサードリンク

Page Top