前からやろうと思って放置していた ruby1.9 の環境にやっと移行した。最初は nginx + fastcgi + ruby1.9 で構築しようと思っていたんだけど、1.9 と fcgi の組み合わせは奥が深そうなので、単純に apache2 + ruby1.9 にした。
あと、そのうち対応されるであろう Rack に向けて tDiary の公式レポジトリではなく、experimental な
を使っている。deploy 的な機能はサーバーの symlink で頑張っていたりするんだけど、ちゃんと cap deploy とか出来るようにしたい。
とりあえず、谷川俊太郎を含むのツッコミ spam が最近目に余るのでそっちを強化してからの対応かなー。
半日くらいうだうだやってたけど、解決の糸口も見えない状態なので状況を書き殴って、誰か優しい人が現れるのを待ってみる。
環境はDebian squeeze に用意されている以下のパッケージで使った。
ruby とか apache2 本体の方は省略。aptitude でインストールした後に /etc/apache2/mods-available/fcgid.conf の内容を以下のように変更。
<IfModule mod_fcgid.c> AddHandler fcgid-script .fcgi SocketPath /var/lib/apache2/fcgid/sock FcgidConnectTimeout 20 IPCCommTimeout 40 IPCConnectTimeout 20 </IfModule>
保存した後に debian おなじみのコマンドで mod_fcgid を有効にしてから apache2 を再起動。
$ sudo a2enmod fcgid $ sudo /etc/init.d/apache2 restart
問題無く起動したので、/var/www/diary に tDiary に含まれている index.fcgi をコピーして shebang を ruby1.9.1 にして .htaccess に以下の内容を追加。
AddHandler fcgid-script .fcgi
この状態で /diary/index.fcgi にアクセスすると 500 エラーが発生。/var/log/apache2/error.log を見てみるとこんな感じ。
[Sun Apr 25 19:00:59 2010] [error] [client x.x.x.x] Premature end of script headers: index.fcgi
このエラーの上には期待している tDiary の html がだーっと表示されているので、何らかの動きはしていて ruby が動いているように見えるんだけど、これが何で stderr に出力されてブラウザに出てこないのかがさっぱりわからない。
mod_fcgid ではダメかと思って mod_fastcgi に切り替えて試してみたんだけど、エラー内容が
[Sun Apr 25 18:09:24 2010] [error] [client x.x.x.x] FastCGI: incomplete headers (0 bytes) received from server "/var/www/diary/index.fcgi"
と変化するだけで、stderr に html が表示されるのは同じまま。
debian の問題なのかなあ。奥が深すぎるので、これ以上深追いはしないことにする。誰か思い当たる節があったらツッコミしてもらえるととても喜びます。
第二tDiary.NetがたしかApache2+fcgi+ruby1.9だったはず。1.9で性能出そうと思ったら、fcgiは必須かなー、やっぱし。
と思って試してみたけど挫折したの巻
Debianのパッケージがどうなってるのかは全く知りませんが、第二tDiary.Netのうち、ふぇみにん日記はApache2+fcgi+ruby1.9で動いています。ただし、ruby-fcgiは、なかむら(う)さんにもらったパッチをあてて動かしています。パッチはひとまず<br>http://kazuhiko.tdiary.net/tmp/ruby-fcgi-0.8.7.patch<br>に置いておきました。
ちなみにapacheのモジュールはmod_fcgidです。<br>第二tDiary.Netのfcgi同士の比較だと、やっぱり1.9の方が体感できるくらいには遅いのですが、ここの日記はfcgi使っていなくてもそんなに遅くは感じないなぁ。
アクセス数が違うからですかねえ。<br>なんか Permission とか debian な作法の問題かもしれません。解決したら続きを書くことにします。
リンク元を表示していないからかな。ひょっとしてリンク元を記録もしていなかったりしますか? だったら随分と速いはず。
リンク元は非表示ですけど、記録はしてます。あと、nginx のリバースプロキシも使ってみました。
当てずっぽうで。<br><br>rails で fastcgi.crash.log から /tmp のセッションファイルを消して apache を再起動したら直った、というのが散見されますね。
同じくFastCGIで動かなかったので調べました。<br>GitHubのhsbt/tdiaryのmasterブランチだと動かないようです。<br>tdiary/dispatcher.rbの$stdout = stdoutと$stderr = stderrをコメントアウトしたら動くようになりました。
うは、こっちでも確認しました。ありがとうございます。