2012-10-17

CのApache-module::subprocess_env構造体

r->subprocess_env構造体には何が入っているか調べてみました。
概要
Apacheにはリクエスト毎の情報をもつ request_rec 構造体があります。 subprocess_env構造体は、環境変数の配列です。

include/httpd.h にて、下記のように定義されています。

この subprocess_env構造体は、apr_table_t 型なので、r->headers_in 等と同じように取り出し可能です。
と、いわれましても。。。って思いませんか?

subprocess_env構造体の全容というか、いったい何が入っているのか気になる!

お決まりのようにググってみましたけども、ちっとも出てきません。
そこで全部の中身をだしちゃうコードを書く事にしました。

あとは、きっと環境が変われば中身も変わる物だから、こんなんですよーってのが無いんだと固く信じてます (*´∀`*)
(英語力が他かければドキュメントが見つかるのだろうか?むかしなら「Doxygen」のマニュアルが沢山出てきたんだけどなぁ。。。)

では、早速コードを。 さて、何がでてくるかな?
QUERY_STRINGを取って見ているので、適当に ?hoge=bar なんてつけてみる。

■出力結果↓ Σ(゜∀゜ノ)ノマジか!
【NULL】 じゃん。。。なんで?
その辺のサンプルコードってよく書いてあるよね?何が違うんだろう。。。と、思っています?

なんと、これにはちゃんとした訳があります。現時点では当然の振る舞いです。
subprocess_env構造体 の値を取得する前に、とある処理を入れてあげないと、KEY=VALの形でデータがsubprocess_env構造体に入ってこないのです。
その処理が。。。【ap_add_cgi_vars関数】です。

では、早速コードに追記して実行してみます。 さて、何がでてくるかな?
QUERY_STRINGを取って見ているので、適当に ?hoge=bar なんてつけてみる。
ついでに、REMOTE_ADDRも取ってみましょう (*´∀`*)
■出力結果↓ やった ヾ(@⌒▽⌒@)ノとれました。
この ap_add_cgi_vars関数は下記のように定義されています。
void ap_add_cgi_vars (request_rec *  r  ) 
Add CGI environment variables required by HTTP/1.1 to the request's environment table
Parameters:
r the current request 

さて、QUERY_STRINGを取得したい場合は、これだけでOKですが、、、、REMOTE_ADDRを取得したい人はどうしましょう?【NULL】 じゃん。。。なんで?
取れない??

なんて事はありません (*´∀`*)ちゃんと取得できるようになっています。
その処理が。。。【ap_add_common_vars関数】です。

さてさて、コードに追記して実行してみます。 さて、取れるでしょうか?
QUERY_STRINGを取って見ているので、適当に ?hoge=bar なんてつけてみる。
ついでに、REMOTE_ADDRも取ってみましょう (*´∀`*)
■出力結果↓ やった ヾ(@⌒▽⌒@)ノ完璧。
この ap_add_common_vars関数は下記のように定義されています。
void ap_add_common_vars (request_rec *  r  ) 
Add common CGI environment variables to the requests environment table
Parameters:
r the current request 

これで必要な情報を取る事ができますね〜 (*´∀`*)
おしまい。

AmazonEC2を使ってみる

0.アカウントを作る

アマゾン ウェブ サービス にアクセスして作成。
この時、クレジットカードが無いと使う事ができないので手元に用意しておくしかない。

1.インスタンスを立ち上げる



2.まずはじめにやる事

■rootのパスワード設定 ■タイムゾーンの設定 [以後変更されないように設定] 変更されないようにこうすれば良いっていろんなサイトにあるのだけど、今のところ効かない・・・・・

■ホスト名の変更
■swap領域の確保
メモリの2倍で。Diskの小さいのはメモリと同じくらいかなぁ。これはラージの場合。
smallは何かしらデフォルトで確保されているので、とくに設定は変えないでおいてみた。
・領域の確保  ・swap領域として初期化(まだ認識はされない) ・swapとして有効に  ・再起動しても確保されるように