2

相互にやり取りする Web サーバーとクライアントがあり、どちらも go で記述されています。HAProxy でサーバーの複数のインスタンス間でリクエストの負荷を分散させたいのですが、うまくいきません。クライアントは、稼働中は常に同じサーバーに接続します。

「netstat -anp」の出力を見ると、HAProxy を介してクライアントとサーバーの間に確立された永続的な接続があることがわかります。応答の接続ヘッダーを「閉じる」に設定しようとしましたが、まったく機能しませんでした。

言うまでもなく、私はこれに完全に混乱しています。私の最初の質問は、これはクライアント、サーバー、または HAProxy の問題ですか? クライアントを強制的に切断するにはどうすればよいですか? これに関して何か不足していますか?Curl は正常に動作するので、HAProxy が負荷分散を行うことはわかっていますが、終了時に curl も完全にシャットダウンします。そのため、クライアントとサーバーが長時間実行されているため、永続的な接続が問題を引き起こしているのではないかと疑っています。

参考までに、私はサーバーで go-martini を使用しています。

ありがとう。

4

1 に答える 1

5

HTTP/1.1 はデフォルトで KeepAlive を使用します。接続が閉じられていないため、HAProxy は異なるバックエンド間でリクエストのバランスをとることができません。

いくつかのオプションがあります。

コード内の各リクエストの後に接続を強制的に閉じます。Request.Close = trueクライアントまたはサーバーのいずれかで設定すると、Connection: closeヘッダーが送信され、両側に tcp 接続を閉じるように指示されます。

http-server-closeまたは、各リクエストの後にバックエンドが閉じられるように設定するか、各リクエストのhttp-close後に両側をシャットダウンするように HAPoxy にリクエストを変更させることもできます。

http-server-closeこれは、各リクエストを個別にプロキシしながら、クライアントの永続的な接続を維持するため、通常は最適なオプションです。

于 2015-03-12T19:04:53.103 に答える