5つの一般的なアプリケーションサーバーの設定方法
イントロダクション
アプリケーションのサーバー構成を決定する際に考慮すべき多くの要素があります。例えば、パフォーマンス、スケーラビリティ、可用性、信頼性、コスト、管理のしやすさなどです。
以下は、一般的なサーバー設定のリストです。それぞれの設定には簡単な説明があり、利点と欠点も記載しています。これにより、ウェブサーバーに関する全体像を把握することができます。注意点として、以下の方法は組み合わせて使用することもできますし、環境によっては完全に適切でない場合もあります。
1. 単一サーバーで全てを実行
すべてのソフトウェアを1台のサーバーにインストールします。典型的なアプリケーションでは、これにはウェブサーバー、アプリケーションサーバー、データベースサーバーが含まれます。この設定の一般的なバリエーションは、LAMPパッケージで、Linux、Apache、MySQL、PHPが1台のサーバーにインストールされるものです。
使用例:アプリケーションを迅速にインストールする必要がある場合、これは最も基本的な設定ですが、スケーラビリティが低く、アプリケーションの各コンポーネントを分離するのが難しいです。
利点:
シンプルである。
欠点:
アプリケーションとデータベースがサーバーのリソース(CPU、メモリ、I/Oなど)を共有しているため、パフォーマンスが低下し、問題の特定が難しくなる可能性があります。
スケーラビリティが低い。
2. データベースサーバーを分離
データベース管理システム(DBMS)は、アプリケーションと切り離されており、アプリケーションとデータベース間のリソース競合を排除し、データベースをプライベートネットワーク内に配置することでセキュリティを強化できます。
使用例:アプリケーションを迅速にインストールしたいが、アプリケーションとデータベースがリソースを共有しないようにする場合。
利点:
アプリケーションとデータベースはサーバーリソース(CPU、メモリ、I/Oなど)を共有しません。
サーバーを拡張する際にリソースを追加できます。
データベースをプライベートネットワークに配置することでセキュリティを強化できます。
欠点:
単一サーバーを使用するよりも設定が複雑です。
サーバー間の遅延(例えば、サーバーが地理的に離れている場合)や、データ転送に必要な帯域幅が不足すると、パフォーマンスに問題が発生する可能性があります。
3. ロードバランサー(リバースプロキシ)
ロードバランサーをサーバー環境に追加することで、リクエスト処理を複数のサーバーに分散させ、パフォーマンスと信頼性を向上させることができます。ロードバランサーが1台のサーバーに障害が発生した場合、他のサーバーがトラフィックを処理します。ロードバランサーは、複数のアプリケーションを1つのドメインとポートで提供するために、レイヤー7(アプリケーション層)リバースプロキシを使用することもできます。
例:HAProxy、Nginx、Varnish。
使用例:サーバーを追加してスケールアウトする必要がある環境に役立ちます。
利点:
複数のサーバーを追加することでスケーラビリティが向上します。
ユーザーからの接続を制限することで、DDOS攻撃に対抗できます。
欠点:
ロードバランサーが十分なリソースを持っていない場合、パフォーマンスのボトルネックになる可能性があります。
SSL終了をどこで実行するかや、セッション処理の方法について考慮する必要があります。
ロードバランサーは単一障害点であり、ロードバランサーが故障すると、システム全体が停止する可能性があります。
4. HTTPアクチュエーター(キャッシュリバースプロキシ)
HTTPアクチュエーターやキャッシュHTTPリバースプロキシを使用することで、サーバーからユーザーへのコンテンツの読み込み時間を短縮できます。HTTPアクチュエーターは、アプリケーションから返されたコンテンツをメモリに保存し、同じ内容へのリクエストが来た場合、メモリから直接取得して返すことができます。
例:Varnish、Squid、Nginx。
使用例:動的なウェブアプリケーションでコンテンツが重い場合や、頻繁にアクセスされるリソースが多い場合に有効です。
利点:
ウェブサーバー上のCPU負荷を軽減することにより、ウェブサイトのパフォーマンスを向上させます。
ロードバランサーとして使用することができます。
いくつかのキャッシュソフトウェアは、DDOS攻撃から保護することができます。
欠点:
最適なパフォーマンスを得るためにチューニングが必要です。
キャッシュの再利用率が低い場合、パフォーマンスが低下する可能性があります。
5. マスター・スレーブデータベースレプリケーション
読み取りが書き込みよりも多い場合、例えばCMSのようなシステムでは、マスター・スレーブデータベースレプリケーションを使用することでパフォーマンスを改善できます。マスター・スレーブレプリケーションは、1つのマスターと1つ以上のスレーブノードを必要とします。この設定では、データの更新はマスターノードに送信され、読み取りはすべてのスレーブノードに分散されます。
使用例:アプリケーションのデータベースからの読み取りパフォーマンスを強化するのに適しています。
以下は、1つのスレーブノードを持つマスター・スレーブレプリケーションの設定例です:
利点:
データの読み取りパフォーマンスを向上させ、スレーブノードに読み取り処理を分散させます。
マスターのみで書き込み処理を行うことで、パフォーマンスをさらに向上させることができます。
欠点:
アプリケーションはどのデータベースノードが書き込み用で、どのノードが読み取り用であるかを識別するメカニズムが必要です。
スレーブノードへのデータ更新は非同期で行われるため、アプリケーションが読み取るデータが最新でない可能性があります。
マスターが故障すると、データ更新が中断される可能性があります。
マスターが故障した場合のバックアップがありません。
例:すべてを組み合わせたケース
キャッシュサーバーの上にロードバランサーを配置し、同じ環境内でデータベースのレプリケーションを使用できます。この組み合わせの目的は、複雑さを最小限に抑えながら最適な結果を得ることです。以下は、サーバー環境の例です:
ロードバランサーは、静的リソース(画像、CSS、JavaScriptなど)のリクエストをキャッシュサーバーに送信し、残りのリクエストはアプリケーションサーバーに送信するように設定されていると仮定します。
ユーザーが動的コンテンツをリクエストした場合に何が起こるかを説明します:
ユーザーはhttps://example.com/に動的リソースのリクエストを送信します(ロードバランサー)。
ロードバランサーはリクエストをapp-backendに送信します。
App-backendはデータベースからデータを読み取り、コンテンツをロードバランサーに返します。
ロードバランサーはコンテンツをユーザーに返します。
ユーザーが静的コンテンツをリクエストした場合:
ロードバランサーはキャッシュバックエンドを確認し、リクエストされたコンテンツがキャッシュヒットかキャッシュミスかをチェックします。
キャッシュヒットの場合:リクエストされたコンテンツをロードバランサーに返し、ステップ7に進みます。キャッシュミスの場合:キャッシュサーバーはリクエストをapp-backendに転送します。
ロードバランサーはリクエストをapp-backendに転送します。
App-backendはデータベースからデータを読み取り、リクエストされたコンテンツをロードバランサーに返します。
ロードバランサーはコンテンツをキャッシュバックエンドに転送します。
キャッシュバックエンドはコンテンツをキャッシュし、ロードバランサーに返します。
ロードバランサーはリクエストされたコンテンツをユーザーに返します。
この環境には2つの障害点(ロードバランサーとマスターデータベース)がありますが、上記で説明した信頼性とパフォーマンスのすべての利点を提供します。
結論
基本的なサーバー設定方法に慣れた今、あなたのアプリケーションにどの方法を使用するかについて良いアイデアが得られたはずです。サーバーのパフォーマンスを改善したい場合、最初に簡単な方法を試し、その後より複雑な方法に移行するのが良いでしょう。
Mitchell Anicas – Digital Oceanより