0

私はNginxの初心者です。私の要件は次のとおりです。

サービスの前に Nginx をフロント エンド サービスとしてセットアップします。これはリバース プロキシ サーバーのようなものですが、着信する顧客ヘッダーに基づいて着信 http リクエストを処理する必要があります。次のようにリバース プロキシを設定できることはわかっています。

server {
    listen      18080;
    server_name localhost;

    location /myService {
            proxy_pass http://host:port/myservice/;
    }

}

また、$http_my_header を使用して受信リクエストから受信「my-header」を取得することも知っています。必要なのは、リクエストから「my-header」を取得し、「http://authserver:authport/authorize」などの別のリモート Web サービスを呼び出すことです。リクエストヘッダーに「my-header」を使用すると、authserver は「my-header」を承認し、次のような JSON ベースの応答を返します。

{
   valid: "true"/"false";
}

次に、応答の「有効な」値に基づいて、nginx の背後にある myservice に要求を proxy_pass するか、403 http 応答で直接拒否するかを決定する必要があります。

4

1 に答える 1

0

nginxに関してサブリクエストを発行する必要があります。

Evalモジュールの1つを使用してそれを実行してから、正規表現で応答を解析することもできますが、お勧めしません。

推奨される方法は、http://wiki.nginx.org/HttpLuaModuleを使用することです。http://openresty.orgnginxバンドルをご覧ください。

init_by_lua 'require "cjson"';

location /auth {
    proxy_pass http://authserver:12345/authorize;
}
location /myService {
    access_by_lua '
        res = ngx.location.capture("/auth")
        if res.status == ngx.HTTP_OK then
            local response = cjson.decode( res.body )
            if response.valid and response.valid == "true" then
                return
            end
        end
        ngx.exit(ngx.HTTP_FORBIDDEN)
    ';
    proxy_pass http://host:port/myservice/;
}

ngx.location.captureによって発行されたサブリクエストは、デフォルトで現在のリクエストのすべてのリクエストヘッダーを継承することに注意してください。

于 2013-03-11T15:46:46.077 に答える