Possible可能な限りナマケモノでありたいタグ:Rack2009年11月12日nginxとUnicornでRackアプリを動かすどうやらUnicornというのが良いらしいという噂を聞きつけたので、どんなもんじゃろと試してみることにした。大規模Railsサイトのための新しいHTTPサーバ、UnicornUnicornてのは何者なのかと言うと、Rack及びRailsに対応したRubyのWebアプリ用のHTTPサーバ。詳しくは上の記事を読んで下さい。githubでも使ってるそうだ。あと、名前が格好良い(あんまり関係ない)。unicornしてconfig.ruがあるディレクトリでunicornコマンドを叩けば、thinとかと同じようにサーバが起動する。rackup互換のオプションも付いてるので特に悩むこともないと思う。あとは普通にApacheとかでプロキシの設定してやるなりなんなりすればすぐ使える。それだけだと大して面白くないので、折角だから上の記事に書いてあるように、nginxでソケットでっていう設定をしてみる。先にUnicornの方の設定。ちなみにサンプルに使ったのは例によって彼女が404のやつ。今現在はApache2+Passengerで動いている。1)end中身はほとんどUnicornの設定例からコピペ。ちなみに、nginxを推奨してるだけあってnginxの設定に似せたDSLになってるけど、実態は見ての通りRuby。その気になれば動的に設定をごにょごにょみたいなこともできる。ログはThinみたいによしなにやってはくれないけど、その辺は設定でLoggerを渡すなりRackのミドルウェアを使ってなんとかするなりすればOK。これを適当なファイル名で保存したら、次のようにunicornコマンドを叩く。/var/www/rackapp/config.ru-Dオプションでデーモン起動、-cオプションは設定ファイルの指定、最後の引数はrackupファイルのフルパス。ちなみにこれを/var/www/rackappじゃないところで実行してみたんだけど、最初は「working_directoryとか指定してるから、そこにあるconfig.ruを勝手に読んでくれたりしないかな」とか思ってたんだけどやっぱりダメで、その後相対パスで指定してみたらrequireでコケて「そんなファイルねーよ、寝言は寝て言え」と怒り出したので、絶対パスにしたら行けた。この時点でhttp://localhost:4423/がちゃんと見られることと、unicorn.sockが出来てることを確認。nginxのプロキシ設定こんな感じ。}}これを大本のnginx.confのhttpのブロックのどこかでincludeしてやる。一応言っとくとこれ以外にも普通のnginxの細かい設定はしてるけど、上の例では省略してます。ちなみに、ソケットでやるように設定してるからこうなってるけど、TCPで良ければproxy_passのところをhttp://localhost:4423とかにしてやっても普通に動く。あとはnginxを起動してやれば、ちゃんと見られる。インターフェースが統一されてるって素敵よねいやぁ、やっぱRackでインターフェースが統一されてるって、良いですよね。アプリ側あんまり弄らなくてもさくっと移行できるわけですし(っていう話をこないだ書いた)。あと、ついでに同じサーバで動いてたHTTP::Engineのアプリも、apache+modperlからnginx+fcgiに移行してみたけど、こっちもちょこっと設定変えたくらいでアプリ側は全然弄ってない。して新しい環境が出てきたりしたときにはやっぱりRackやなんやらが真価を発揮する。次はPlackでH::Eのときと同じことをやってみようと検討中。結局Unicornは良いの?イイの?さぁ...ベンチ取ってないのでなんとも。取っても「彼女が404」じゃあんまり参考にならないんだよなー。アプリをロードし終わってからforkするとかnginx側に気付かせない用に再起動できるとかその辺だけでも十分魅力的ではある。あと、再起動は早かった。Loungeで記事を書かせていただきました。Rackとは何かRackってそもそも何なの、何でそんなの出来たの、みたいな話を簡単に。んー?誰だー、普段はこんなこととかあんなこととかばっかやってる癖に何真面目な記事書いてんだとか言った奴はー。先生怒らないから出て来なさいー。RackってRailsだとかSinatraだとかに比べるとマニアックな部類(知名度がというよりは使い道が、ね)だと思うんだけど、予想外に反応が良くて嬉しい。技評の方は「Perl界隈でPSGIも盛り上がってるし、今そういう話題はタイミングが良かったのかも」と言ってたけど、本当にそうだなー。PSGIに触れたのはまたお前はRubyのことばっかで少しはPerlの勉強しろよ言われないため僕がPerl大好きだからですよ。