Phusion Passengerが2.2から3.0で変わったところ

今更感たっぷりですが、違いを把握するために調べました。

まずは、preview-1で書かれている点について。

続いて、preview-2で書かれている点について。

  • http://blog.phusion.nl/2010/06/18/the-road-to-passenger-3-technology-preview-2-stability-robustness-availability-self-healing/
    • 「信頼性」「堅牢制」「可用性」についても取り組んでいる
    • 自己回復
      • 古いアーキテクチャではHelperServerがダウンすると、ウェブサーバをリスタートするまではPassengerシステムがダウンしたままとなっていた
      • 新しいアーキテクチャでは軽量の番犬プロセスを用意し、HelperServerのダウンを検出したら直ちにHelperServerを再起動させる
    • ウェブサーバのリスタートをゼロ・ダウンタイムで
      • 2.2ではウェブサーバをリスタートすると、クライアントは“Connection reset by server”の様なエラーを受け取る事になる
      • 3.0ではウェブサーバのリスタートをバックグラウンドで行うため、既存リクエストの処理を継続することができる
    • アプリケーションのシャットダウンをゼロ・ダウンタイムで
      • 2.2ではアプリケーションがSIGUSR1を受け取ると、ソケットのバックログにたまっているリクエストをすべて処理した後にシャットダウンさせられる
        • リクエスト量が多いサイトの場合、バックログが空になる事がなくてシャットダウンさせられない可能性がある
        • バックログが空になった場合に、シャットダウン処理とリクエスト送信とが競合する可能性がある
    • 3.0ではアプリケーションがSIGUSR1を受け取った時点で新しいリクエストを受け付けないようにした上で、バックログが空になってから5秒後にシャットダウンする様にした

引き続き、preview-3で書かれている点について。

そして、preview-4で書かれている点について。

  • http://blog.phusion.nl/2010/07/29/the-road-to-passenger-3-technology-preview-4-adding-new-features-and-removing-old-limitations/
    • 非同期スポーニング
      • 過去のバージョンでは、スポーニング中はプールをロックしていたために、リクエストがブロックされる問題があった
      • 3.0ではバックグラウンドでスポーニングするようになり、クライアントからのリクエストをブロックすることが無くなった
    • PassengerMinInstances
    • smart spawningがRack アプリケーションもサポート
    • ローカルホストからHTTPでアプリケーションに直接アクセス可能
      • TCPソケットのポート番号はランダム
      • 127.0.0.1 にバインド
      • 各ソケットはランダムに生成されたユニークなパスワードで守られている(passenger-statusで確認できる)
    • グローバルキューがデフォルトになった
    • PassengerFriendlyErrorPages
    • Nginx
      • デフォルトでSSLモジュールを組み込む
      • passenger_set_cgi_param
      • passenger_buffer_response
      • passenger_ignore_client_abort

最後に、おまけ記事より。

読んでみた限りでは大変すばらしい内容です。試しにab中にrestartした感じでは普通にコネクション切れましたけど、自分の何かが至らなかったのでしょう。

ということで、重い腰を上げて、Unicornのことはひとまず忘れ、Passenger 3 を確認してみたいと思います。

追記:勘違いの訂正(1)

abを中断させてしまったのは、以下の様にして実行したrestartでした。

$ sudo /sbin/service restart

preview-2の記事の例示は以下のrestartです。

$ sudo apachectl restart

apachectlはhttpdのラッパーで、restartはgracefulと同一で、「緩やかな再起動」となっています。ab中にgracefulを実行したところ、待たされはしますが、リクエストを切断することなく再起動することが出来ました。
(OSXの場合はlaunchctlのラッパーでgracefulな再起動はないということも忘れてました。ない、ですよね?)

追記:2.2とgraceful

違いを確認するために、Passengerの2.2.15, 2.2.14, 2.2.0でgracefulを試してみましたが、これもabによるリクエストを切断することなくApacheを再起動させることに成功しました。"Zero-downtime web server restart"のくだりは理解できてません…。

追記:勘違いの訂正(2)

apachectl restart と apachectl gracefulを同一と書きましたが、明らかに間違いです。スクリプトのブロックが同じだけで、httpd -k restart と httpd -k gracefulの違いがあります。apachectl restartでabが完遂した理由は把握していません…。

追記:勘違いの訂正(3)

ab中にhttpd -k restartをしてもabが止まらなかったのは、「空データが返ってきたから」だった様です。httpd -k stopでコネクションが切れた場合(Connection reset by peer)は中断しますが、空データ受信の場合は特に問題にしない(Complete requestsにカウントする)様ですね。