Monoceros雑感

Monoceros@kazeburo さんが開発してる Plack 用ウェブサーバ。prefork型だけど、待機中の接続をイベントドリブンのマネージャで管理することで、同時接続10,000本とか行ける(ソケットの受け渡しは SCM_RIGHTS とか使う)。

で、雑感

  • 大好き!!!
  • Starletより遅い問題は、以下のようにすれば解決できると思う
    • listen するソケットに TCP_DEFER_ACCEPT つけて、accept(2) は worker でのみ実行する
    • worker は HTTP レスポンス送信後に read(2) してみて、後続のリクエストが来てない場合にのみ、マネージャプロセスにソケットを返還する
      • (追記) 「返還」ではなく、マネージャプロセスが管理しているソケットのいずれかにデータがきている場合のみ、そのソケットとworkerのソケットを「交換」する、とすればより良い
  • HTTP/1.1 のパイプラインサポートも上記の方法でサポートできるはず
    • 1.1 対応するなら、Starlet 側のリクエスト処理ループを共有できるようになってると、うれしいなうれしいな >_
      • あるいは Monceros と Starlet が共有できるリクエスト処理ループという形で別モジュールに切りだすとか

待機のみをイベントドリブンでやってリクエストのパースとレスポンスの送信を prefork でやるというアプローチは、アプリケーションの処理のみを prefork でやってそれ以外は全てイベントドリブンでやる nginx + Starman / Starlet みたいなアプローチと比べると、slowloris 攻撃等への耐性という点で難があることは確かです。ですが、それへの対処が可能な場合、あるいは、リバースプロキシの裏側で大規模な持続的接続が必要な場合(都度接続やってると TIME_WAIT があふれるとか)はとてもいい手法だと思います。