Linuxでシンボリックリンクを含んだパスを正しいパス(realpath)に変換する

■ realpath_for_fs() [Download]
・シンボリックリンクを含んだ絶対パスを安全にrealpathに変換

しばしば、シンボリックリンクを含んだ絶対パスをシンボリックリンクを含まない絶対パス(realpath)としてみたい場合がある。

特に、apacheモジュールを実装する上で、apacheはシンボリックリンクをrealpathに解析した上で、Directiveを見てくれないため、realpathでDirectiveを書いていても、シンボリックリンク経由でアクセスがあった場合は、Direvtiveのパスは無視される。

パスのBaseネームがシンボリックリンクであれば、symlinksコマンド等で調べることができるが、絶対パスの途中にシンボリックリンクが含まれている場合はそう簡単には行かない。

続きを読む

apacheへのrequestで消費するリソース量をloggingするモジュール

■ mod_resource_checker  [Download](apcheリソースloggingモジュール)

サーバー内で複数のWEBサービスを提供したい場合に、chroot環境でのIPベースと、Virtualhostを用いたnameベースがある。

IPの枯渇や、ハードウェアにあまりお金をかけない、プロセス数の問題などで、最近ではnameベースを用いてサービスを提供することが多い。

ただし、nameベースでは様々な問題が起きる。

例えば、

  • VirtualHost毎にログを残す場合、VirtualHostの数が増えてくると、fdの数が足りなくなる
  • セキュリティ的にsuEXEC環境をとらないといけなくなる
  • DSO版phpにも対応できるようにmod_ruidを使わないといけない
  • mod_ruidを使うとCAPABILITYの問題で、request毎にプロセスを破棄しないといけなくてパフォーマンスが落ちる

など・・・

続きを読む

mod_limitipconnの制限内容の落とし穴

かなり有名なmod_limitipconnですが、色々制限方法の記事をみていると、きっちりとその性能を説明できていないものが多い気がする。

あるディレクトリ以下又はファイルに対する同一IPからの同時接続数を制限するというのが、このモジュールの役目なんだが、大事なところが説明されていない。

例えば、よくある以下のような制限を行ったとする。

<Location /hoge>
    MaxConnPerIP 3
</Location>

多くの情報ではこの設定だと、

[warning]

http://example.jp/hoge/index.cgi等、hoge/以下へのアクセスに対して、同一IPからの同時接続数を3に制限する。

[/warning]

とかかれていることが多い。

しかし、ここには大きな落とし穴がある。

続きを読む

apacheモジュールでconfigをcreateする時の注意する事

apacheモジュールで必須のconfig構造体を作成する作業。

これは、通常1.3系ではモジュール読み込み構造体(MODULE_VAR_EXPORT等)の3番目にディレクトリ毎のconfig、5番目にserver毎のconfigを作成する関数指定する。

2系の場合は、モジュール読み込み構造体(AP_MODULE_DECLARE_DATA等)の2番目にディレクトリ毎のconfig、4番目にserver毎のconfigを作成する関数指定する。

ここで注意しなければならないのが、configを作成した後、command_rec構造体から具体的なconfの値を設定していく時の扱い方。

続きを読む

apache2系のmodule開発

1.3系については、通称パンダ本に結構書いてあるので、情報量が少なめの2系モジュールに関する開発について。

基本は、1.3系と違い、2系はhook関数というものを作ってそれをモジュールから登録し、apacheコアにhookさせて、登録した関数を実行させるという流れ。

モジュールというのは、結局のところ「apacheコアが呼び出すhook関数を登録するためにある」といってもいいくらいかな。

流れとしては、以下のようにhook関数を登録して、

static void register_hooks(apr_pool_t *p)
{
    ap_hook_access_checker(lalimit_access_checker, NULL, NULL, APR_HOOK_MIDDLE);
}

続きを読む