Starlet 使ってみた
CPANでPlack関連の情報はないかと漁っているとstarmanライクなPSGI仕様のサーバ Starlet があると聞いて早速ためしてみました。
http://search.cpan.org/dist/Starlet/
今まで自分の所ではplackで利用できるWAFを自前で書いてそいつをStarman + Server::Starterを使ってで動かしていました。 Starmanでなにも問題なく動いてるので変更する意味はないのですがPSGI仕様のいい所(簡単にインターフェースを取り替えられる)を利用させてもらいちょっとだけ試してみました。 変更前の環境はフロントにlighty(mod_proxy)+バックにStarman,Server::Starterな構成です。でStarmanはdaemontoolsで起動させてます。
変更前
starman利用時のdaemontoolsのrun-script
#!/bin/sh exec 2>&1 cd /path/to/service || exit 1 exec /usr/local/bin/setuidgid www /usr/local/bin/start_server --port 9001 -- /usr/local/bin/plackup -s Starman -E production --workers=10 --max-keepalive-reqs=1 --max-reqs-per-child=10000 -a app.psgi
変更後
starlet利用時のdaemontoolsのrun-script
#!/bin/sh exec 2>&1 cd /path/to/service || exit 1 exec /usr/local/bin/setuidgid www /usr/local/bin/start_server --port 9001 -- /usr/local/bin/plackup -s Starlet -E production --max-workers=10 --max-keepalive-reqs=1 --max-reqs-per-child=10000 -a app.psgi
starmanとstarletの違いは-sオプションとworkersの指定が違うだけです。ほんとたったこれだけ。 いずれの設定もlocalhostのポート9001でアプリサーバが口を開けてリクエストを待っています。
lightyのconfig
フロントのport80で待ちうけているlighttpdのconfigです。こちらはリクエストアドレスが特定の拡張子かディレクトリ以外は9001ポートでリクエストを待っているアプリサーバにReverseProxyします。つまり静的ファイル以外のリクエストは全てproxyされる事になります。
$HTTP["host"] == "example.com" { $HTTP["url"] !~ "^/(images|static|[^.]+\.html|[^.]+\.htm|[^.]+\.css|[^.]+\.xml)" { server.max-keep-alive-requests = 0 setenv.add-request-header = ("X-Forwarded-Host" => "example.com" ) proxy.server = ("" => (("host" => "127.0.0.1", "port" => "9001" )) ) } server.document-root = "/path/to/service/ht_doc/" alias.url += ( "/static/" => "/path/to/service/ht_doc/images/", "/images/" => "/path/to/service/ht_doc/images/", "/" => "/path/to/service/ht_doc/" ) expire.url = ( "/images/" => "access 2 hours") accesslog.filename = "/var/log/httpd-access.log" }
で、簡単にstarletに変更できた訳ですけどオプションの設定で一つはまった点がありました。 CPANのドキュメントではworkerの指定で--num-workers=#とあるのですがこのオプションはききませんでした。色々試した結果 --max-workers=#で設定するとうまくいくようです。
Starmanも爆速だけどstarletも速いことが使ってみてわかりました。うちの場合keepaliveを切った運用をしているのが影響しているのか速度的な違いは(体感的なもの)感じられない。
あとPlackのauthorであるmiyagawaさんから以下のtweetをいただきました starman のほうが UNIX ソケットや複数インタフェース、HTTP/1.1 をサポートしていて高速です。Starlet はよりシンプルでほかの kazuhoware と組み合わせているのに適しています」
なるほどStarletの高機能版がStarmanなのですね。私の環境ではstarmanの機能は生かしきれないみたいですね。
nginxにすっかなぁ・・・・