2016-08-11 8 views
0

私はHaProxyでSSLを終了し、リクエストをワニスに戻して、キャッシュされたページまたはNginxからのリクエストを返します。しかし、ワニスはHaProxyからのリクエストをHTTP/1ではなくHTTP/2として扱い、サービスに失敗したようです。私はこの理由は、nginxのがないことであると述べて、このhereに関連する何かを見つけたプロキシプロトコル1を強制的に使用する

" while reading PROXY protocol, client: 127.0.0.1, server: 127.0.0.1:8181 
2016/08/11 06:53:31 [error] 5682#0: *1 broken header: "GET/HTTP/1.1 
Host: www.example.com 
User-Agent: curl/7.50.2-DEV 
Accept: */* 
X-Forwarded-For: IP_Removed 
Accept-Encoding: gzip 
X-Varnish: 32777 

:私はページをヒットしようとしたとき、私はnginxの中で見ることができます

は以下を記録しますv2 PROXY v1のみで動作します。ですから、私はHaProxyでsend-proxy-v2 switchではなくsend-proxyを使用してプロトコル1を使用するよう強制しました。しかし、それがニスになると、私はVarnishが何らかの方法でこれをプロトコル2に変換しているので、Nginxと正しく通信できなくなってしまったと思います。

私は式からワニスを除去し、HaProxyをNginxに直接接続し、HTTP/2で完全に動作します。問題は、ワニススタックで何かが起こっている可能性が高いと思われるが、ワニスが使用しているプロキシプロトコルv2である。

短いストーリーを短縮するために、ワニスをPROXY2プロトコルではなくPROXY1に強制するにはどうすればよいですか?私は起動デーモンのオプションにPROXY1を追加しようとしましたが、Varnishはそれを受け入れません。どんな助けもありがとうございます。ありがとう!

UPDATE - HaProxyバックエンドでsend-proxy-v2スイッチを使用してHaProxy> Nginxをテストしたところ、スタックにVarnishが導入されたときと同じ問題が発生しました。 HaProxyのsend-proxyに戻って問題を修正します。ですから、問題はプロトコル1ではなくプロトコル2を使用していると確信しています。

+0

を設定することで、nginxのにPROXYプロトコルバージョン1を送信することができますが、あなたがHTTP/2話をしていますか?これはPROXY v2プロトコルとは関係ありません。ワニスはHTTP/2を話さず、ワニス5.xが導入される予定です。 –

+0

多分私は自分自身を混乱させているかもしれませんが、HaProxyはHTTP/2を扱うときにHTTPではないTCPとして動作するので、バックエンドでsend-proxyを使う必要があります。 Nginxはproxy_protocolスイッチでこれを受け取るように設定されています。私はワニスがHTTP/2ではないことを理解していますかSSLをしていますが、プロトコルをNginx noに戻す必要がありますか? – d1ch0t0my

答えて

1

私はVarnishがHTTP/2ではないこと、またはSSLをしていることを理解していますが、Nginxにはそのままプロトコルを渡す必要がありますか?

しかし、最初のを明確にしましょう。 HTTP/2とプロキシプロトコルV2は、お互いに全く関係がありません。 HTTP/2をここから削除してください。

、実際には、これはあなたの質問をされていますHAProxyはワニスにプロキシプロトコルV1を送信している、とnginxのプロキシプロトコルV1を期待するワニスの後ろに構成されている場合は

、なぜnginxのは、壊れたヘッダを訴えるのか?ワニスはプロキシプロトコルV1をバックエンドに転送しませんか?代わりに何らかの理由でProxy Protocol V2を送信しますか?

そして、その質問に対する答えは、ワニスがいずれも送信していないということです。 V1でもV2でもない。

プロキシプロトコルを必要とするのは、HTTP認識コンポーネントが、mode tcpまたはAmazon ELBを使用するHAProxyなどのHTTP対応ではないコンポーネントからクライアントIPアドレス(およびポート)を受信できるようにすることだけです。 TCPモードのリスナーでは、通常はSSLオフロードを行い、HTTPリクエストルーティングは行わないため、クライアントアドレスを渡す代替のメカニズムが必要です。

最初のHTTP対応コンポーネントは、スタック内の残りのコンポーネントのために、そのアドレスを取得してHTTPヘッダー(通常はX-Forwarded-For)に設定できます。したがって、ワニスがProxyプロトコルを転送する理由はありません。これはあなたの例ではそうしていません。そして、VarnishがProxyプロトコルを転送することさえ可能であるという明白な理由はありません。 ¹

そして、これはエラーに私たちをもたらします。あなたはNginxが報告している問題を誤診しています。壊れたヘッダーエラーは、NginxがProxyプロトコルV1以外のものを受信して​​いることを意味します。そしてリスナーがプロキシ・プロトコル・ヘッダを期待するように構成されている場合、そのヘッダーは必須ある - ループ内のワニスを、全くプロキシプロトコルヘッダ² nginxのへの要求に全く存在はありません。

コンポーネントがプロキシプロトコルV1を期待するように構成されていて、それが存在しない場合、それはです。常ににエラーがあります。しかし、「存在しない」とは、まさにそれを意味します。 V1ヘッダーは存在しません。それはV2が意味するものではありません。そうではありません。

だから、私は、問題はあなたが誤って自分を納得させてきたというプロトコル1.

よりプロトコル2を使用してワニスであることを確信しています。あなたがHAProxyで試したように、NginxへのProxy V2はエラーで、プロキシプロトコルヘッダーはまったくありません。これは上で説明したようにエラーです。どちらも異なるタイプですが、どちらも誤った設定です。あなたがここでやったことは、エラーと重複していますが、まったく別の理由からです。

すべての要求をワニスで送信する場合は、受信プロキシプロトコルメッセージから取得した情報を使用して、転送要求にX-Forwarded-Forを設定するようにワニスを設定します。 Nginx設定からプロキシプロトコルを削除します。

またはHTTPモードで動作し、それがoption forwardforを使用してヘッダーを挿入できるようにHAProxyを設定します。プロキシプロトコルのように見える何も -


¹明らかに、エラーから、ワニスは普通のHTTPヘッダを送信しています。元のサーバーにProxyプロトコルを送信するオプションもサポートしているとは思えませんが、その機能を見過ごしてしまった人は何か言います。

²は、私はそれが意味するものを与えられた、プロキシプロトコル「ヘッダ」が適切にヘッダと呼ばれていないことを主張するだろう。それは残念なことに標準の "ヘッダー"と呼ばれていましたが、ヘッダーではなくプリアンブルです。もっとも、確かにHTTPヘッダーではありません。

0

あなたが5.0にニスをアップグレードする場合、それは「.proxy_header = 1"

関連する問題