1月 162013
 

 Rails3 に限らずセッション情報の格納先に memcached を使うことは多いと思うが、Passenger + Rails3 でセッションストアに memcached を使うとセッションが切れたり他のユーザのセッションにすりかわったりする。実はPassenger のドキュメントにがっつり書かれている。

Because worker processes are created by forking from an ApplicationSpawner server, it will share all file descriptors that are opened by the ApplicationSpawner server. (This is part of the semantics of the Unix fork() system call. You might want to Google it if you’re not familiar with it.) A file descriptor is a handle which can be an opened file, an opened socket connection, a pipe, etc. If different worker processes write to such a file descriptor at the same time, then their write calls will be interleaved, which may potentially cause problems.

 何が問題かというと、memcached との接続を保持しているデスクリプタも fork() のタイミングで共有されてしまうこと。そのため、例えばほぼ同時に Passenger worker A と B から memcached にリクエストを送った場合、A 側のリクエストが若干早ければ memcached 側から送られた A 向けのレスポンスが A と B 双方で受け取ってしまい、本来は B には B 向けのレスポンスが行くはずが A のレスポンスとなってセッションの取り違いが発生してしまう。これの問題点は、エンドユーザからすると全く覚えのない別のユーザになってしまうことにある。

Continue reading »

12月 262011
 

 blog を WordPress に移行して数日、一部問題はあるものの概ね動作しているようで安心している。WodPress は PHP で動作するが、PHP 環境は Apache + mod_php という組み合わせが多いと思う。このパターンは動作事例が多いし安定もしているが、PHP のアプリケーションサーバとして Apache を使うためにどうしても Apache 1プロセス当たりのメモリ使用量が増えてしまう。その結果、画像を返すだけのリクエストだとしても、占有メモリが肥大化した Apache で処理することになる。最近の Linux の fork は実際にはコピーオンライトなので書き込みのないメモリ領域は共有化しているとはいえ、効率が悪いのは否めない。

 そこで、Apache Tomcat のように PHP のみを別プロセスとして動作させる FastCGI が有効になる。これまでは spawn-fcgi で回すのがよくあるパターンだったが、PHP 5.4.0RC2 から PHP-FPM (A simple and robust FastCGI Process Manager for PHP) がマージされているのでこれを使ってみた。ディストリビューションは例によって Gentoo Linux になる。今回はウェブサーバとして nginx を使っているが、Apache で動作させる場合は mod_fastcgi を使えばよい。

Continue reading »

12月 232011
 

 ここ5年ほど MovableType を使っていたが、最近は WordPress のほうがメジャーになってきた。当初は静的化される MovableType に魅力を感じていたが、毎度の再構築が面倒くさいこともあって WordPress に移行することにした。

 MovableType と WordPress は、運用するシステム的に以下の違いがある。

  • MovableType
  • Perl
  • CGI または mod_perl, FastCGI
  • 記事は基本的に静的 HTML で閲覧負荷は低いが、PHP スクリプトなどとしても出力できる。記事の追加・修正のたびに再構築される。
  • WordPress
    • PHP
    • mod_php または FastCGI
    • 記事はアクセスごとに動的生成。ただし、プラグインでキャッシュ可能。

    Continue reading »