2011-12-05 10 views
2

私は、nginxによって負荷分散されているいくつかのPHP Webサーバーを持っています。ロードバランス(nginx)環境で、外部APIへの呼び出しから要求しているWebサーバーに応答を戻す方法を教えてください。

Webサーバーは、(私が制御できない)外部APIに要求してから応答を受け取る必要があります。

1)応答が正しい(要求している)Webサーバーに返されることを保証するには、どのような方法がありますか?

2)それぞれの長所と短所は何ですか?

ありがとうございます!

更新(2011-12-05 12時38午後):

達成されるようにしようとしているものにのようないくつかのより多くの背景情報。

nginxを使用してバランスのとれた多数のphp Webサーバーを持つクライアント向けアプリケーションを実行します。クライアントは、これらのWebサーバーのいずれかに誘導することができます。

   nginx 
       | 
-------------------------------- 
     |  |  | 
     web1  web2  web3 

外部(サードパーティ製のAPI)からデータを取得し、クライアントに返す必要がある場合があります。そのデータへのリクエストは、Webサーバーのいずれか(クライアントがもともとnginxによって指示されたものに応じて)に由来する可能性があります。 APIからのデータがクライアントに表示されるように要求元のWebサーバーに返されるようにする必要があります。

+0

応答は常に要求しているWebサーバーに直接返されますが、そうではありませんか?確かに要求しているWebサーバーはリモートAPIへの直接TCPストリームを開きます。つまり、同じTCPストリームを使用して応答が返され、常に適切な場所に戻ってきます。サーバのAPIに何らかのプロキシを設定していない限り、負荷分散を無意味にします。それでもプロキシーが非常に奇妙な方法で設計されていない限り、これはまだ問題ではないと思っていたでしょう。 – DaveRandom

+0

@DaveRandom「要求しているWebサーバーが、リモートAPIへの直接TCPストリームを開くことは間違いありません」 - あなたが正しいとは思わない。 192.168.1.2からnginx public ip xx.yy.zz.ppを介してリクエストを行い、APIレスポンスがパブリックIPに戻って192.168.1.3にリダイレクトされます。 ip_hashディレクティブはそれを防ぎます。 –

+0

@narcisraduしかし、NATedだけではありませんか?これは、(TCP/IPモデルの)レイヤ3で処理する必要があるようなもので、レイヤ4に何かを追加すると、複雑さと処理オーバーヘッドが増えます。 ... – DaveRandom

答えて

1

あなたは使用することができます:http://wiki.nginx.org/HttpUpstreamModule#ip_hash

欠点:サーバの時々1を非常に忙しくていますが、ベンチマークにソリューションを必要とし、問題があるかもしれない場所を見つけるかもしれません。

+0

私たちはすでにクライアントが毎回同じWebサーバーに誘導されるようにip_hashを使用しています。 しかし、サーバーが外部APIからデータを取得する必要がある場合は、これは役に立ちません。 APIプロバイダーのIPは毎回同じWebサーバーに送られるかもしれませんが、Webサーバーのいずれかが最初にその要求を行っている可能性があります。例えばAPIプロバイダのIPが同じであることに基づいて、すべてのAPIリターンがweb1に送信される可能性がありますが、リクエストはweb1、web2またはweb3から来ている可能性があります。 – TheKeys

+0

今理解しています!どのWebサーバーがAPI呼び出しを開始したのかわからないので、実際にどちらがわからなくても、APIの戻り値を適切なものにリダイレクトできますか? 1つの汚れた解決策:異なる上流を​​使用しますが、私は実際にそれを実装する方法について考える必要があります。 –

+0

同じバックエンドサーバーにリダイレクトされるAPI回答が必要な理由を説明してください。私はあなたが実際に他のサーバで答えを受け取って、応答を内部で取り出すかもしれないと仮定します。しかし、これはアーキテクチャーの問題であり、アプリケーションで何が起こっているかを実際に知ることなく解決策を提示するのは難しいです。 –

関連する問題