12

バックエンド サーバーへのリバース プロキシとして Nginx (バージョン 1.9.9) を使用しています。POSTリクエストの内容に基づいて認証・認可を行う必要があります。そして、auth_request ハンドラーで POST リクエストの本文を読み取るのに問題があります。これが私が得たものです。

Nginx の構成 (関連部分):

server {
    location / {
        auth_request /auth-proxy;
        proxy_pass http://backend/;
    }

    location = /auth-proxy {
        internal;
        proxy_pass http://auth-server/;
        proxy_pass_request_body on;
        proxy_no_cache "1";
    }
}

そして、認証サーバー コード (Python 2.7) では、次のようにリクエスト本文を読み取ろうとします。

class AuthHandler(BaseHTTPServer.BaseHTTPRequestHandler):
    def get_request_body(self):
        content_len = int(self.headers.getheader('content-length', 0))
        content = self.rfile.read(content_len)
        return content

content_len を出力したところ、正しい値でした。ただし、self.rfile.read() は単純にハングします。そして最終的にタイムアウトになり、"[Errno 32] Broken pipe" を返します。

これは、テストデータをサーバーに投稿する方法です。

$ curl --data '12345678' localhost:1234

上記のコマンドも同様にハングし、最終的にタイムアウトになり、「Closing connection 0」が出力されます。

私がやっていることに明らかな間違いはありますか?

どうもありがとう!

4

1 に答える 1

11

nginx-auth-request-module のコードはnginx.com で注釈が付けられています。モジュールは、常に POST 本文を空のバッファーに置き換えます。

チュートリアルの 1 つで、彼らはその理由を次のように説明しています。

認証サブリクエストのリクエストボディは破棄されるため、proxy_pass_request_body ディレクティブをオフに設定し、Content-Length ヘッダーを null 文字列に設定する必要があります。

これは、auth サブリクエストが POST ではなく HTTP GET メソッドで送信されるためです。GET には本体がないため、本体は破棄されます。既存のモジュールでの唯一の回避策は、要求本文から必要な情報を取得し、それを認証サービスに渡される HTTP ヘッダーに入れることです。

于 2016-12-16T23:18:02.650 に答える