Server
Overview
サーバサイドの設計思想をまとめるセクション。
フルスタック
フルスタック開発者のためのBallerina: バックエンドAPI開発ガイド
もっとも単純な形式のwebアプリは、3つの層で構成されている。
- クライアント再度(フロントエンド)
- サーバサイド(バックエンド)
- 永続化層(データベース)
3層クライアントと2層クライアントの違い
Webサーバ層とアプリケーション層
クライアントとデータベース層の間に、「Webサーバ層」と「アプリケーション層」が追加される。
Webサーバは、クライアントからのアクセス(HTTPリクエスト)を直接受け付けて、その後の処理を後段のアプリケーション層(アプリケーションサーバ)に渡し、また結果をクライアントに返却する役割を持つ。
いわば、Webサーバとクライアント側のWebブラウザとの橋渡し役。
よく利用されているWebサーバとしては、Apache(アパッチ)が有名。
このアプリケーション層は、ビジネスロジックを実装したアプリケーションが動作するレイヤ。
Webサーバから連携されたリクエストを処理し、必要ならばデータベース層(DBサーバ)へアクセスを行ってデータを抽出し、それを加工した結果をWebサーバに返却します。「Tomcat(トムキャット)」「WebLogic(ウェブロジック)」「WebSphere(ウェブスフィア)」といった製品が有名なところ。
このようにユーザからの直接的なアクセスを受け付ける役割をWebサーバ層に限定することで、アプリケーション層とデータベース層のセキュリティを高めている。
かつ、アプリケーション層にビジネスロジックを集中させることで、アプリケーション管理のコストを下げることを意図した構成になっている。
3層クライアントに分ける理由
セキュリティなどかなり詳しい
なぜAPサーバーをWebサーバーとして利用しないのか
サーバーの起動プロセスについて
本番サーバーの起動ではプロセスマネージャーの使用が推奨されている。
- バックグラウンド実行が可能
通常、ターミナルから
node server.js
などで起動すると、そのプロセスはターミナルに依存する。
そのため、ターミナルを閉じるとプロセスが停止する。
PM2を使えば、アプリをバックグラウンドで動作させられるため、ターミナルを閉じてもプロセスは継続される。 - クラッシュ時の自動再起動
アプリケーションが何らかの理由でクラッシュした場合、手動で再起動が必要になる。
PM2はクラッシュを検知すると自動的にアプリを再起動するため、サービス停止の時間を最小限に抑えることができる。 - クラスターモードでのスケーリング
通常のnodeコマンドは1つのスレッドで動作する。
PM2のクラスターモードでは、CPUコア数に応じてプロセスを並列に生成でき、マルチスレッドのように処理できるようになる。
これにより、同時リクエスト処理数を向上させ、アプリのスケーラビリティを向上できる。 - ログ管理がしやすい PM2は標準出力/エラー出力のログをファイルに出力し、エラーの発生状況を可視化しやすくなる。 また、コマンドを使ってログの確認やプロセスの監視も簡単に行える。
- デプロイとプロセス管理の一元化 PM2にはエコシステムファイル(ecosystem.config.js)を作成しておくと、環境変数、リスタートポリシー、クラスターモード設定などを一元管理できる。 デプロイや環境設定の変更も容易になります。
Adonis.jsはシングルスレッドモデルのNode.jsを効率的に本番運用するために、PM2のようなプロセスマネージャーの利用を推奨しています。 特に、自動再起動・クラスターモード・ログ管理・バックグラウンド実行など、本番運用に必要な機能をまとめて提供してくれるため、冗長化や信頼性向上が簡単になります。 結果として、システムのダウンタイムを最小限に抑えることができます。
サーバーの起動プロセスについて(AWS Lambdaのようなサーバーレス環境)
AWS Lambdaのようなサーバーレス環境では、通常のサーバー起動プロセスやバックグラウンドでのプロセス管理は行われない。
- リクエストごとの関数実行
Lambdaは「イベント駆動型」であり、HTTPリクエストやS3イベントなどのトリガーが発生するたびに、関数が必要な分だけインスタンス化され実行される。
プロセスマネージャーの代わりに、AWS自体がインフラを管理し自動スケーリングを行う。 - AdonisJSをLambdaで利用する際のポイント Lambdaでは「常時稼働型サーバー」ではなく、リクエスト時にAPIエントリーポイントを即座に呼び出す形。 Express AdapterのようにHTTPリクエストを処理する専用のエントリーポイントを設け、AdonisJSのリクエスト処理部分をそのまま再利用する方法が一般的。
- Lambdaなどのサーバーレス環境では、プロセスマネージャーが不要で、イベント駆動型で関数が呼び出される。
- バックグラウンド実行や常時稼働の必要がないため、スケーリングやプロセス管理はAWS側が自動で行う。