5

私は、単一のVPSを超えて成長しているWebアプリケーションを維持しています。このアーキテクチャは、それぞれが独自のサブドメインを持つ多数の小さなユーザーで構成されています。ユーザーは対話しません。ロードとは、一部のユーザーとすべての新しいユーザーを、別のサーバー上のWebアプリケーションの別のインストールに移動する必要があることを意味します。

現在、すべてのユーザーサブドメインは同じ仮想ホストに分類され、単一のPHPフロントコントローラーがホスト名に基づいて適切なコンテンツを表示します。* .mydomain.comの単一のワイルドカードDNSレコードは、現在のサーバーを指します。

さまざまなユーザーサブドメインをさまざまなサーバーにルーティングするための最善のオプションは何ですか?

私の考え:

  • すべてのサーバーの新しいトップレベルドメイン。user.s1.mydomain.com、user.s2.mydomain.comなど(不法で情報漏えい)
  • 自分のDNSサーバーを実行して、サーバー間でユーザーをルーティングします(追加の障害ポイント、なじみのないテクノロジー)
  • すべての要求を適切なサーバーにリバースプロキシする中央フロントコントローラー/バランサー(追加の障害点、潜在的に制限された接続)
4

1 に答える 1

4

アプリケーションのスケールアウトのその時点で、中央のフロントロードバランサーを使用します。Nginxは、単一のサーバーによって動的に処理されるすべての負荷を処理する必要があります。6つの動的サーバーと1つの静的コンテンツサーバーのフロントエンドとしてnginxがあり、nginxにボトルネックはありません。

スケールポイントで、すべての静的コンテンツ自体を処理するようにnginxを設定し、動的コンテンツを必要な数のボックスにリバースプロキシします。単純なプロキシパスの設定は次のとおりです。

upstream upstream_regular_backend {
    fair;
    server 10.0.0.1:80;
    server 10.0.0.2:80;
}

server {
    listen 0.0.0.0:80;
    server_name  example.com;
    proxy_set_header Host $host;
    proxy_set_header  X-Real-IP  $remote_addr;
    location / {
        proxy_pass http://upstream_regular_backend;
    }
}

静的コンテンツを提供し、残りをすべて返す場合は、次のようになります。

server {
    listen 0.0.0.0:80;
    server_name  example.com;
    proxy_set_header Host $host;
    proxy_set_header  X-Real-IP  $remote_addr;
    index index.php;
    root /some/dir/:
    location ~ \.php {
        proxy_pass http://upstream_regular_backend;
    }
}

もちろん、PHPを使用していない場合は、それに応じて構成を微調整します。

上流の定義では、「公正」。応答時間に基づいてバックエンドの負荷を分散します。キャッシュの動機については、「ip_hash;」を使用することをお勧めします。代わりに、クライアントからのリクエストを常に同じサーバーに送信するためです。

私たちのセットアップは少し先にあります。ワニスキャッシュをプロキシするnginxロードバランサーがあり、これがダイナミックコンテンツサーバーをプロキシします。

nginxが単一障害点であることが心配な場合は、障害が発生した場合に備えてフロントエンドのIPを引き継ぐ準備ができているセカンダリサーバーをセットアップします。

于 2012-04-24T17:03:33.557 に答える