Webアプリの基礎とさまざまな実行環境を理解する#3(社内勉強会)

BPS社内勉強会のmorimorihogeさんのスライド「Webアプリの基礎とさまざまな実行環境を理解する」の第3回です。 #1: Webのしくみ #2: Webサーバの役割とWebサービスの代表的な形態I〜III #3: Webサービスの代表的な形態IV(Rails)、ステートレスとステートフル(本記事) IV. Webサーバ+アプリケーションサーバ いよいよRailsにつながる話になります。 これは前回のI.とIII.のハイブリッドと言えます。ハイブリッドすなわち「いいとこ取り」で、静的なファイルやHTTPの処理はWebサーバに任せ、プログラム処理が必要なリクエストだけをアプリケーションサーバに送ることでI.とIII.のメリットを同時に得ることができます。 現在最も一般的なRails環境はこれに該当します。Java serverでもこの形式が使われることはありました(Apache + Tomcatなど)が、Railsの登場で一気に普及した感があります。 現在のBPSでは「Nginx + Puma」か「Apache + Puma」が標準のRails実行環境です。Webサーバは以前はUnicornでしたが今はPumaが標準になりました。 メリット Webサーバの軽さとアプリケーションサーバの柔軟性を同時に得られる アプリケーションの実装を軽減できる: WebサーバでできることはWebサーバに任せる レスポンスが速い: III.のアプリケーションサーバ単体構成と比べ、静的ファイルはアプリケーションサーバに問い合わせずすぐに返せるため、一般に高速になります デメリット 設定が増える: 運用するサーバプログラムが2つになるため、2つの設定を管理する必要がある 監視ポイントが増える: 障害発生のポイントが増えるため Webサーバ+アプリケーションサーバの実際のサービス例(専門サービスの場合) 以下はRailsを前提とした話です。 Heroku: IIIの形式でも公開できますが、Nginxを組み合わせて運用することも可能です 他にもいくつか HerokuはRailsアプリケーションのホスティングサービスの典型です。Heroku独自の設定やルールがある点に注意しましょう。 以前はニフティクラウドC4SAもRailsアプリのホスティングサービスを行っていましたが、現在はサービス終了しています。 使いどころ Railsサーバを立てたいけどインフラエンジニアがいないとき とにかく(エンジニア人件費的に)安く(リリース準備的に)早く立てたいとき Linuxサーバー側のセキュリティを考えずに済ませたいとき ただし、Rails本体や組み合わせるミドルウェアのセキュリティ問題については当然考慮が必要です。 Webサーバ+アプリケーションサーバの実際のサービス例(自前で立てる場合) マネージドなサービスではなく自前でサーバーを構築することで、サーバー要件に対する自由度が高くなります。 「普通のWebアプリケーションを」「普通の構成で」「普通の作り方で」実装する場合にはマネージドなサービスを組み合わせることで事足りることが多いのですが、業務アプリケーションなどで高可用性、高性能、特別なライブラリを使いたいなどの事情がある場合には自前でサーバーを構築するという選択肢が結果として簡単になるケースが多いです。 morimorihoge注) 例えば以下の様な要件がある(または将来的に要求される可能性がある)場合、PaaS型のマネージドサービスよりも自前でLinuxサーバーを管理できる環境の方が作りやすいことがあります。 特定のソフトウェアを用意して使いたい場合 ImageMagickでの画像変換やffmpegでの動画変換などで新し目の機能・データフォーマットに対応したい場合、PaaSで用意されたものではかゆいところに手が届かないため、自前でコンパイルして使いたいということがあります プロプライエタリなソフトウェアやライブラリを利用したい場合、任意のバイナリを置けないPaaSでは利用できないことがあります 長時間のバッチ処理や大きな一時データを必要とする処理がある場合 PaaS型サービスではサービス側でプログラムの実行時間に制限が付けられているケースがあり、超時間かかるバッチ処理などを知らずに作るとタイムアウトして中断されてしまうことがあります。バッチを小分けにしてQueueに入れて実行するなどで対策は可能ですが、実装時に考慮する一手間がかかりますし、何より根本的に大きなトランザクションのバッチは分割できません(そして業務アプリケーションではこのような要件がままあります) PaaS型サービスはアプリケーションにあまり大きなファイル作成を許していないケースが多いです(大きなファイルを格納する場合にはAWS S3等のオブジェクトストレージを使うことが推奨される)。しかし、例えば動画をアップロードしてオーサリングする様なアプリケーションなどではアプリケーションサーバ側に大きな一時ファイルを置きたいというニーズがありえます … Continue reading Webアプリの基礎とさまざまな実行環境を理解する#3(社内勉強会)