RubyWebアプリケーション用の(ラック)Webサーバーの比較
序章
他の言語の製品と同様に、Rubyを使用して開発されたアプリケーションは、利用可能な多くのWebサーバーの1つを介してWorld-Wide-Webに公開できます。 それぞれに独自の品質があり、完璧なソリューションを設計するためのさまざまな可能性を提供しますが、これらのサーバーが共有する共通点が1つあります。それは、ラックと呼ばれるアプリケーションと通信する方法(インターフェイス)です。
このDigitalOceanの記事では、RubyベースのWebアプリケーションを強化するさまざまな一般的なWebサーバーを比較します。 ただし、詳しく説明する前に、ラックの仕様とミドルウェアのコレクションに慣れてきたら、上記のプロセスがどのように機能するかについての仕組みを紹介します。
ミドルウェアというやや紛らわしい用語が何を意味するのか知りたい場合は、Wikipediaで少し読んでみてください。
ラック
今日、WebサーバーをWebアプリケーションや他のテクノロジーと[開発者に]組み合わせる機会を与えることは、プログラミング言語やフレームワークの非常に強力で、必要であり、実際に需要のある側面です。 この非常に基本的な例は、開発、テスト、および/または本番用のさまざまな環境の必要性です。
これを実現することを目的として、2007年にChristian NeukirchenがRackをリリースしました。これは、彼が当時「モジュラーRubyWebサーバーインターフェイス」と呼んでいたものです。 今日では、Espresso、Mack、Ruby on Rails、Sinatraなどの多数のWebサーバーおよびWebアプリケーション開発フレームワークに適合しています。
[プログラミング]言語とドメインにわたる命名規則とさまざまな説明にもかかわらず、[アプリケーション]のインターフェースの仕様は、相同ではないにしても非常に似ています(ただし、Pythonの WSGI とは異なり、Rackや他の人にインスピレーションを与えています。Rackはここにあります仕様だけでなく、おそらく少し紛らわしいことに、ミドルウェアアプリケーションもあります)。
ラックミドルウェア( gem )は、ラック仕様を実装し、着信HTTPリクエストを異なるパイプラインステージに分割して機能し、応答が返されるまでそれらを分割して処理しますWebアプリケーション(コントローラー)から送信されます。 これには、ハンドラーとアダプターの2つの異なるコンポーネントがあり、それぞれWebサーバーおよびアプリケーション(フレームワーク)との通信に使用されます。
比較について
この比較では、今日人気があり利用可能なWebアプリケーションサーバーの選択肢のいくつかについて説明します。 ある面で他の面で際立っている理由と、特定の面で他の面とどのように異なるかについて説明します。 ここでの目的は、サーバーをアプリケーションのニーズに合わせて必要なソリューションを作成できるようにするために、全体的な理解を深めることができるようにすることです。
Webサーバー(アルファベット順)
Phusion Passenger:高速ウェブサーバーとアプリサーバー
今日の乗客は、RubyonRailsアプリケーションの推奨サーバーになりました。 これは、セットアップと開始手順を大幅に簡素化しながら、必要なニーズとアプリケーション展開の領域をカバーすることを目的とした、成熟した機能豊富な製品です。 ApacheおよびNGINX(前面)Webサーバー内に直接統合することにより、従来の仲介サーバーセットアップアーキテクチャを排除します。 Ruby(Rails)コミュニティでは、まさにこの理由からmod_rails/mod_rackとも呼ばれます。
ノート
Passengerは、同じサーバーでホストされている複数のアプリケーションを操作する機能を提供します。
遅いクライアントを処理することができます。 Passengerでのリクエストとレスポンスは完全にバッファリングされ、システムのリソースを詰まらせるような攻撃の影響を受けなくなります。
乗客は非常に人気があり、多くの[本番]シナリオで広く使用されています。 したがって、専門家に連絡して見つけたり、オンラインコミュニティで問題に対処したりすることができます。 また、製品を開発する専門会社があり、興味のある人に効率的な商用サポートを提供しています。
そのオープンソースバージョンにはマルチプロセスシングルスレッド操作モードがありますが、エンタープライズバージョンはシングルスレッドまたはマルチスレッドのいずれかで動作するように構成できます。
エンタープライズユーザー向けに、Passengerは、同時実行とマルチスレッド、一括展開、リソース制御と制限など、さらにいくつかの「高度な」機能を提供します。
Passengerの詳細については、https://www.phusionpassenger.com/にある公式ウェブサイトにアクセスしてください。 Passenger Enterpriseについては、同じページのエンタープライズセクションにアクセスしてください。
Puma:Ruby用の最新の同時Webサーバー
Pumaは、Rack専用のRubyWebアプリケーションサーバーです。 その作成と誕生は、リリース時に大きく革命を起こし、今後何世代にもわたってRubyアプリケーションが提供される方法に影響を与えたレガシーMongrelWebサーバーに大きく影響を受けています。 Pumaの開発者であるEvanPhoenix は、物事を前進させることを決定し、Mongrelの運用構造をRackでのみ動作するように変換し(したがって、パフォーマンスの低下を引き起こす複雑さを排除し)、真の並列処理をサポートするようにアプリケーションを設計しました。 、同時実行を許可します(以下でさらに説明します)。
ノート
このアプリケーションのフットプリントは、サイズと実行リソースの消費量の両方で非常に小さくなっています。
Pumaにはいくつかの動作モードがあります。ジョブを実行するために使用できる最小スレッドと最大スレッドの量を設定できます。また、フォークされたプロセスを使用して要求を同時に処理できるクラスターモードでも動作します。
これは、Mongrelのパーサーに基づいており、コードベースが大幅に書き直されています。
Rubiniusの「頼りになるサーバー」として設計されているにもかかわらず、JRubyでもうまく機能します。
シンプルでありながら重要な構成オプションが付属しており、Webサーバーを実稼働と開発の両方のニーズにさまざまな方法で適合させることができます。
Pumaは、すぐに使用できる複数のアプリケーションのホスティングを直接サポートしていませんが、 Jungle :(Puma as a service)ツールを備えており、複数のアプリケーションの本番環境のニーズに対応します。
Pumaの詳細については、 https://github.com/puma/puma にある公式コードリポジトリにアクセスして、構成と開始の手順を確認することもできます。
薄い:小さくて速くて面白いHTTPサーバー
Thin は非常に人気のあるアプリケーションサーバーであり、最も「安全で、安定していて、高速で、拡張可能なRubyWebサーバー」であると自負しています。 まだ活発に開発されており、3つの決定的なRubyライブラリに基づいており、したがってその製品です。
- 雑種のパーサー
- イベントマシンネットワークI/Oライブラリ
- ラックミドルウェア
ノート
シンHTTPサーバーは、今日の大部分をカバーするラック仕様を実装する任意のフレームワークで動作するように設計されています。 これは、Rack構成ファイルを直接ロードすることによって行われます。
イベント/マシンベースのアプリケーションサーバーであるThinは、前面のリバースプロキシソリューションを使用せずに、他の選択肢とは異なり、長時間実行される要求を処理できます。
Thinの詳細については、http://code.macournoyer.com/thin/にある公式Webサイトにアクセスしてください。
Unicorn:高速クライアントおよびUnix用のラックHTTPサーバー
Unicornは非常に成熟した[Ruby]Webアプリケーションサーバーであるため、Pythonでも使用できるようになっています。 完全な機能を備えていますが、設計上、すべてを実行しようとすることを拒否します。Unicornのプリンシパルは、[Webアプリケーションサーバーによって]実行する必要のあることを実行し、残りの責任をより適切に実行する人に委任します。
ノート
Unicornのマスタープロセスは、要件に従って、リクエストを処理するためにワーカーを生成します。 このプロセスは、メモリとプロセスに関連するよろめきの問題を防ぐために、ワーカーも監視します。 これがシステム管理者にとって意味することは、(たとえば)タスクの完了に時間がかかりすぎたり、メモリの問題が発生したりすると、プロセスが強制終了されるということです。
前述のように、Unicornがタスクを委任する領域の1つは、負荷分散にオペレーティングシステムを使用することです。 これにより、スポーンされた忙しいワーカーに対してリクエストが積み重ならないようにすることができます。
NGINXと同じように、Unicornを使用すると、稼働中の接続やクライアントをドロップすることなく、アプリケーションを実行およびデプロイできます(更新/アップグレードを考えてください)。
その他の高度な機能のいくつか:
- すべてのワーカーは、指定された分離されたアドレススペース内で実行され、一度に1つの要求を処理します。
- フォークされたプロセスを処理するためのbefore_forkおよびafter_forkフック。
- コピーオンライト対応のメモリ管理で使用してメモリを節約する機能。
- 複数のインターフェースをリッスンする機能。
Unicornとその優れた機能の詳細については、http://unicorn.bogomips.org/にある公式Webサイトにアクセスしてください。