8

ダウンロード可能なファイルがたくさんあるサイトを管理しています。現在は米国のサーバーでホストされていますが、最近ドイツで新しいサーバーを取得しました. ダウンロードをドイツのサーバーにミラーリングし、最初のサーバー (Web サイトをホストしている) で PHP スクリプトを使用して、ユーザーの場所に基づいて使用するファイル ミラーを検出したいと考えています。たとえば、ユーザーがカナダにいる場合は、米国の現在のサーバーからファイルをダウンロードする必要があります。フランスにいる場合は、大西洋を越えてダウンロードするのではなく、ドイツからファイルを取得する必要があります。では、どの国に近いかをどのように判断できますか?

私は MaxMind GeoIP について知っていて、それをインストールしましたが、それは国を与えるだけであり、私の知る限り、特定の国が最も近い 2 つのミラー国を自動的に判断する方法はありません。私ができることは、大陸ごとに行くことだと思います: アジア、ヨーロッパ、アフリカ、オーストラリアのユーザーにドイツからコンテンツを取得させ、南北アメリカからの訪問者に米国からファイルを取得させる. 、私は提案を受け入れています。


そうですね、大陸ごとにチェックするという当初の考えに沿って行こうと思います。この種のことをしようとしている他の人にとって、それは始めるのに良い場所になるでしょう. ヨーロッパに複数のミラーがある場合に問題が発生しますが、大陸のアイデアは今のところ機能する必要があります。

4

5 に答える 5

2

これまでに提案されたソリューションには、多くの開発者のオーバーヘッドがあるようです。これが自分のアプリケーションで対処しなければならない問題である場合、この問題を一からやり直さないことを選択することで、数時間の作業を節約できるかもしれません。

最も近いミラーの特定 (郵便番号を使用)

  1. 使用可能なミラー サーバーの配列に郵便番号のリストを保持します。
  2. ユーザー エージェントの郵便番号を特定する (例: ユーザー入力または PHP ライブラリ)
  3. 2 つの郵便番号間の距離を計算する (例: PHP ライブラリ)
  4. 返された距離に基づいてミラーの選択を続行します

距離が近いほど応答時間が速くなるわけではないことに注意してください。ただし、シナリオのコンテキストでは、両方のミラーが稼働していると仮定すると、ある国のミラーは別の国のミラーよりも明らかに高速になります。より「堅牢な」ソリューションであると私が考えるものについて読み続けてください。

リソースとリンク

「マーベリック」アプローチ

私の意見では、Mavericks は革新者、問題解決者、そして私たちが今日使用しているこれらの優れたライブラリとフレームワークの発明者としても知られています。「ハックな」アイデアと誤って関連付けられることもありますが、補足を受け入れます:)

  1. $_GET または $_POST 要求を受け入れるミラー サーバーのいずれかで、独自の API サービスを作成します。

  2. この API サービスは、与えられた IP アドレスと ping() を取得し、応答時間を計算してから平均を取得し、要求元のインターフェイスに返します (たとえば、クライアントが接続しているフロントエンド ポータルおよび/またはサーバーが接続しようとしている場合)。最も近いミラーを決定します)。最も低い平均で応答するサーバーは、必ずしも最も近いとは限りませんが、応答が最も速いサーバーである必要があります。あなたにとってどちらがより重要ですか? シェル コマンドをローカルで実行することに依存しない (たとえば、プラットフォームに依存しない) 動作する ping() 関数については、Ping サイトと PHP で結果を返すを参照してください。

  3. 最後のステップでは、要求元クライアントの IP アドレスを取得し、それをバックグラウンドのいずれかのミラー サーバーで実行されている API サービスに渡します。そして、私たちは皆、IP を導き出す方法を知っていますが、あなたが思っているほどではありません。負荷が分散されている場合、またはプロキシの背後にある場合は、最初にこれらのヘッダー (HTTP_FORWARDED、HTTP_FORWARDED_FOR、HTTP_X_FORWARDED、HTTP_X_FORWARDED_FOR、HTTP_CLIENT_IP) のいずれかが通過したかどうかを確認することをお勧めします。もしそうなら、それはおそらくユーザー エージェントの実際のIP アドレスです。

この時点 (手順 3) で、各ミラーがユーザー エージェントに ping を実行したときに応答した応答時間の平均を比較します。次に、ユーザー エージェントがダウンロードするミラーの選択に進みます。作成したサービス フローは次のようになります。

  1. ユーザーエージェントがポータルにアクセス
  2. ポータルは、バックグラウンドの AJAX/jQuery リクエスト (または従来の POST とリダイレクト) を使用して、両方のミラーで個別に実行されている API サービスにユーザー エージェントの IP アドレスを転送します。
  3. ミラーで実行されている API サービスは、受信した IP アドレスに対して ping を実行し、取得するように構成されている応答の総数の平均を返します。
  4. ポータルは、返された平均を読み取り、それらを比較します。

お役に立てば幸いです。コーディングをお楽しみください。

于 2012-05-03T16:21:53.800 に答える
1

ミラーが 2 つしかない場合は、ブラウザで AJAX リクエストを開始して、各サーバーから 50K ファイルをダウンロードします。これは、ユーザーにとって大きな遅延を表すほど小さいものではありませんが、タイマー測定の違いを大きくするには十分な大きさです。

次に、「最適な時間」が得られたら、JS Cookie を設定し、ダウンロードが必要なときはいつでも優先ミラーにリダイレクトします。測定はバックグラウンドでダウンロード ページから開始できるため、ユーザーは遅延に気付かないでしょう (必要なファイルを選択している間)。

各 AJAX op で「サーバー負荷」を返信して、応答時間だけでなく現在の負荷でも最適なサーバーを選択することもできます。したがって、英国のユーザーは、最も近いサーバーがドイツにある場合でも、後者の負荷が最初のサーバーよりも大幅に高い場合、米国のサーバーを使用します.

于 2012-05-03T10:55:49.207 に答える
0

uが言ったようにgeoipのようなライブラリを使用し、緯度と経度を使用してミラーとユーザーの間の距離を比較するのは簡単ではありませんか?

それほど複雑ではなく、実装がはるかに簡単で、N ミラーで機能し、参照を作成するために Zip や別の種類のデータを要求する必要はないと思います

于 2012-05-03T17:10:30.943 に答える
0

traceroute を実行します (ホスト名を解決せず、短いタイムアウトで traceroute クライアントを構成します)。

ホップ数と traceroute クライアントの場所 (PHP スクリプトと同じだと思います) に基づいて、米国とドイツのどちらかを選択します。

地理的な距離は、ネットワークの距離とネットワークの速度、または帯域幅のコストとは関係ありません。

traceroute の代わりに (ハック的で小さなコード ソリューションであるため)、$_SERVER["REMOTE_ADDR"] を使用し、geo IP データベースで検索して国コードを取得することをお勧めします。国コードがアメリカ大陸の国のいずれでもない場合は、混雑したインターネット バックボーンを通過するのを避けるために、ドイツにフォールバックします (さらに、国コードがヨーロッパのものになるように調整することもできます)。

geo ip データベースをセットアップしたら、範囲内の IP アドレスをドット形式から整数形式に変換して、クエリを高速化し、簡単にすることをお勧めします。

上記の geo ip データベースでの私の経験から、それが欠落することはめったにないため、問題にはなりません。

于 2012-05-03T10:43:01.613 に答える
0

これを行うことができるライブラリを覚えていません。でも、システムを構築するのではなく、私にアイ​​デアがあれば、それがあなたを助けることができるかもしれません.

この距離計算機を使用して、2 つの IP 間の距離を計算します。または、2 つの IP アドレス (1 つのサーバー) と (1 つのゲスト)​​ の緯度と経度を調べ、距離を計算します。これを行うための擬似コードは次のとおりです

distance = ( 3956 *2 * ASIN( SQRT( POWER( SIN( ( 34.1012181 - ABS( latitude ) ) * PI( ) /180 /2 ) , 2 ) + COS( 34.1012181 * PI( ) /180 ) * COS( ABS( latitude ) * PI( ) /180 ) * POWER( SIN( ( ABS( - 118.325739 ) - ABS( longitude ) ) * PI( ) /180 /2 ) , 2 ) ) ))
于 2012-05-01T02:06:09.610 に答える