どさにっき 2.0 〜2006年8月下旬〜

by やまや
<< = >>

2006年8月22日(火)

Nexenta

_ めも。OpenSolaris なカーネルで Debian なユーザランドのディストリだそうな。

_ いきなり complete GNU-based って文言が出てくるのな。ドメイン名からして gnusolaris.org だし、まず何をさしおいても宣伝しなくっちゃならないことがそれなんだろうな。別にそんなのどーでもいい、っつーか、そこまで宣伝されるとハナについてイヤなんだけど(別にわしはアンチ GNU じゃないぞ)。

_ Nexenta の中身はまぎれもない Solaris だから、ちゃんと ZFS も使えるようだが、これとは別に Porting ZFS file system to FreeBSDだそうな。すばらしい。生の FreeBSD で使うだけでなく、 FreeNASに ZFS をのっけて USB メモリから起動する RAIDZ な NAS とか妄想は膨らむ。


2006年8月26日(土)

無題

_ パッチ

_ 使いかた。

-- main.cf
smtpd_delay_reject = no
smtpd_client_restrictions = hash:/etc/postfix/rate_limit

-- rate_limit
example.com	client_connection_count_limit 10
192.0.2.1	client_connection_rate_limit 30
example.org	client_message_rate_limit 20
example.net	client_recipient_rate_limit 50
192.0.2.100	client_new_tls_session_rate_limit 30
postfix 2.2 から smtpd_client_XXX_limit というパラメータでアクセスレート制御ができるようになってるけど、サーバ全体でひとつの設定値しか持てない。これをクライアントごとに異なる値で制限することをできるようにする。DoS まがいの大量の spam 打ち込みを食らってるような大規模サーバ向け。上の例では、example.com からの最大同時接続数を10までに、192.0.2.1 からの1分あたりの接続数を30までに制限する。ほかも推して知るべし。

_ postfix 2.4-20060824 へのパッチだけど、2.3.x でも使えるんじゃないかな。TLS の部分を消せば 2.2.x でも動くと思う。たぶん。まともな動作確認はほとんどしていないので注意。TLS にいたってはまったくテストしていない。

_ ちなみに、sendmail は 8.13 以降で標準装備。


2006年8月27日(日)

ユニオンジャック

_ イギリスの国旗の意匠から「米」という文字を読み取り、いつのまにかアメリカの国旗に脳内変換されてた。どうなってんだわしの脳味噌。

UNIX history

_ Linux ディストリの系譜。うーん、いまいちおもしろくないな。つーか、Linux 最初期のディストリビューションのひとつである Yggdrasil が載ってない時点でアレだ。

_ 一方、 こっちの UNIX の系譜はしっちゃかめっちゃかに入り組んでいて、見ててたいへん疲れる。でも、これだけあってもまだ全部じゃないんだよな。

_ BSD 系に限定するなら、FreeBSD には /usr/share/misc/bsd-family-tree っつーファイルがありますな。ほかの *BSD に似たようなファイルがあるかどうかは知らん。


2006年8月29日(火)

無題

_ この前のは TLS のテストはしてないと書いたが、脳内シミュレーションの結果、あの程度のかんたんなパッチで実現するのは無理という結論に落ち着いた。不可能ではないが、もっと大がかりな変更が必須。で、実際に環境を作ってテストしてみて、ほんとに動作しないことを確認。TLS セッションが確立した後でエラーを出すことは可能だけど、TLS が重いからリソース保護のため過剰な TLS 要求を拒否したい、というのがそもそもの動機なわけであって、エラーを出すのが TLS セッション確立後じゃ意味がない。

_ ほかにレート制御がほしいのは、単位時間あたりの SMTP AUTH の認証エラー回数の制限かなぁ。同一クライアントからのエラー回数と同一認証ユーザ名でのエラー回数のそれぞれで制限をかけられるとうれしい。ちらっとソースを眺めてみたところ、前者はわりと簡単にパッチを作れそうだけど、後者はちょっとめんどくさそうな感じ。


2006年8月31日(木)

/hoge/fuga/piyo

_ このあたりのつづき。hoge.php というスクリプトに QUERY_STRING ではなく PATH_INFO で引数を与えたいが URL は hoge.php/fuga/piyo ではなく /hoge/fuga/piyo にしたいという件。なんか気が向いたので、それぞれの設定の細かい挙動を調査してみた。実験環境は Apache 2.2.3 + PHP 5.1.5 でいずれも ports でインストール。一部の例を除いて PHP かどうかは関係なく、CGI でも同じ結果になる(はず)。

_ なお、下に挙げた以外に mod_rewrite を使う方法もあるが、嫌いなのでやらない。つーか、こんなにいろんな方法があるのに rewrite はいらんでしょ。

_ その1: 実際に拡張子なしスクリプトにする方法。スクリプトが /home/yamaya/public_html/hoge で、.htaccess に

<Files hoge>
    SetHandler php5-script	# PHP4 なら php-script だし、CGI なら cgi-script
</Files>
と記述。結果(一部の環境変数のみ)。
[REQUEST_URI] => /~yamaya/hoge/fuga/piyo
[SCRIPT_FILENAME] => /home/yamaya/public_html/hoge
[SCRIPT_NAME] => /~yamaya/hoge
[PATH_INFO] => /fuga/piyo
[PATH_TRANSLATED] => /usr/local/www/apache22/data/fuga/piyo
[PHP_SELF] => /~yamaya/hoge/fuga/piyo
スクリプトは /home/yamaya の下にあるが、PATH_TRANSLATED は DocumentRoot の下になっている。なんか解せないけどそういう仕様。

_ その2: type-map を使う方法。hoge.php はそのままで、他に type-map ファイルを作る。

-- hoge
URI: hoge.php
Content-Type: text/html
-- .htaccess
<Files hoge>
    SetHandler type-map
</Files>
結果。
[REDIRECT_STATUS] => 200
[REDIRECT_URL] => /~yamaya/hoge
[REQUEST_URI] => /~yamaya/hoge/fuga/piyo
[SCRIPT_FILENAME] => /home/yamaya/public_html/hoge.php
[SCRIPT_NAME] => /~yamaya/hoge.php
[PATH_INFO] => /fuga/piyo
[PATH_TRANSLATED] => /usr/local/www/apache22/data/fuga/piyo
[PHP_SELF] => /~yamaya/hoge.php/fuga/piyo
hoge → hoge.php にリダイレクトされるため、REDIRECT_xxx という環境変数が設定される。

_ その3: MultiViewsMatchを使う方法。.htaccess に以下を設定。hoge.php はそのまま。

Options +MultiViews
MultiviewsMatch Handlers
結果。
[REQUEST_URI] => /~yamaya/hoge/fuga/piyo
[SCRIPT_FILENAME] => /home/yamaya/public_html/hoge.php
[SCRIPT_NAME] => /~yamaya/hoge.php
[PATH_INFO] => /fuga/piyo
[PATH_TRANSLATED] => /usr/local/www/apache22/data/fuga/piyo
[PHP_SELF] => /~yamaya/hoge.php/fuga/piyo
スクリプトのファイル名が違う以外はその1と同じ。確認してないけど、 application/x-httpd-php で MultiViews する場合もたぶん同じ結果になると思う。ただし、以前書いたとおりコンテンツネゴシエーションに難ありなので使うな。

_ その4: この前は書かなかったけど、方法はほかにもある。Action を使う方法。hoge.php とは別に、中身は何でもいいから hoge というファイルを作る(サイズ0でも可)。んで、.htaccess にこう書く。

Action hoge-handler /~yamaya/hoge.php
<Files hoge>
    SetHandler hoge-handler
</Files>
これにより、hoge へのアクセスで hoge-handler が呼ばれ、hoge-handler として登録された hoge.php が起動される。ちなみに、Apache 2.2 では、Action の3番目の引数として "virtual" を指定すると hoge というファイルは実際には存在していなくてもいい。結果。
[REDIRECT_HANDLER] => hoge-handler
[REDIRECT_STATUS] => 200
[REDIRECT_URL] => /~yamaya/hoge/fuga/piyo
[REQUEST_URI] => /~yamaya/hoge/fuga/piyo
[SCRIPT_FILENAME] => /home/yamaya/public_html/hoge.php
[SCRIPT_NAME] => /~yamaya/hoge.php
[PATH_INFO] => /~yamaya/hoge/fuga/piyo
[PATH_TRANSLATED] => /home/yamaya/public_html/hoge/fuga/piyo
[PHP_SELF] => /~yamaya/hoge.php/~yamaya/hoge/fuga/piyo
PATH_INFO が /fuga/piyo ではなく、/~yamaya/hoge/fuga/piyo になっていること、PATH_TRANSLATED が DocumentRoot ではなくユーザのホームディレクトリからのパスになっていることの注意。設定される値が他と異なるので、スクリプトを書く立場ではこの形式をサポートするのはめんどうかもしれない。その他、hoge → hoge.php にredirect されてるので REDIRECT_xxx が設定される。REDIRECT_HANDLER は以前のバージョンの Apache ではたしか設定されなかったような気がする(未確認)ので、互換性を考える場合はアテにしない方がいいと思う。

_ その5: おまけ。PHP 限定の方法。mod_php ではなく、CGI 版としてビルドした php バイナリを用意して、cgi-bin/php.cgi として置いておく。スクリプトは hoge にリネーム。んで、.htaccess で以下のように設定。

Action php-cgi /~yamaya/cgi-bin/php.cgi
<Files hoge>
    SetHandler php-cgi
</Files>
結果。
[REDIRECT_HANDLER] => php-cgi
[REDIRECT_STATUS] => 200
[REDIRECT_URL] => /~yamaya/hoge/fuga/piyo
[REQUEST_URI] => /~yamaya/hoge/fuga/piyo
[SCRIPT_FILENAME] => /home/yamaya/public_html/hoge
[PATH_INFO] => /fuga/piyo
[PATH_TRANSLATED] => /usr/local/www/apache22/data/fuga/piyo
[ORIG_PATH_TRANSLATED] => /home/yamaya/public_html/hoge/fuga/piyo
[ORIG_PATH_INFO] => /~yamaya/hoge/fuga/piyo
[ORIG_SCRIPT_NAME] => /~yamaya/cgi-bin/php.cgi
[ORIG_SCRIPT_FILENAME] => /home/yamaya/public_html/cgi-bin/php.cgi
[PHP_SELF] => a
hoge へのアクセスで php.cgi にリダイレクトされ、php.cgi が hoge を読み直して PATH_INFO を設定しなおしている。php.cgi が受け取った環境変数は ORIG_xxx として残される(昔のバージョンでは ORIG_xxx は設定してなかったはず。いつからこういう動作をしているのかは未確認)。PHP_SELF の値が激しく謎。

_ ちなみに、最後の方法は CGI 版の PHP を使っているので、スクリプトは Apache とは別プロセスで動き、mod_suexec でユーザ権限で動作させることが可能。それでいて、CGI のようにスクリプトを chmod して実行権限を与えたり、#! でインタープリタの場所を教えてあげる必要もない。こういう起動方法は PHP がまだ PHP/FI という名前だった極めて初期のころからサポートされているんだけど、ほとんど知られていないようなので、/hoge/fuga/piyo とはあまり関係ないんだけどあえて取り上げてみた。


<< = >>
やまや