3

proxy_pass を変数にする必要があるという問題がありますが、変数にすると、バックエンド サーバーで正しく解決されません。

nginx -v
nginx version: nginx/1.6.2

これは作業中のものです:

  server {
    listen 443 ssl;
    ssl on;
    server_name api.hostname.com;

    include ssl_params;

    location = /v1 {
      return 302 /v1/;
    }

    location /v1/ {
      proxy_pass        http://internal-api.hostname.com.us-east-1.elb.amazonaws.com/;
      proxy_set_header  Host            $host;
      proxy_set_header        X-Real-IP       $remote_addr;
      proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
    }

  }

これは壊れたものです

  server {
    listen 443 ssl;
    ssl on;
    server_name api.hostname.com;

    include ssl_params;

    location = /v1 {
      return 302 /v1/;
    }

    location /v1/ {
      resolver 10.0.0.2;
      set $backend "http://internal-api.hostname.com.us-east-1.elb.amazonaws.com/";
      proxy_pass        $backend;
      proxy_set_header  Host            $host;
      proxy_set_header        X-Real-IP       $remote_addr;
      proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
    }

  }

動作中のhttps://api.hostname.com/v1/profileのバックエンド結果は次のとおりです。

<-- GET /profile
--> GET /profile 200 16ms 349b

しかし、壊れたものに

<-- GET /
--> GET / 401 1ms 12b

私は試してみました:

set $backend "internal-api.hostname.com.us-east-1.elb.amazonaws.com";
proxy_pass http://$backend/

set $backend "internal-api.hostname.com.us-east-1.elb.amazonaws.com/";
proxy_pass http://$backend/

proxy_pass で変数を使用しているときはいつでも、すべてがバックエンドの / (ルート) に転送されますが、意図したものではありません。

4

2 に答える 2

0

アップストリーム モジュールを使用して変数を設定します。

http {

    ...

    upstream backend {
        server internal-api.hostname.com.us-east-1.elb.amazonaws.com;
    }

    ...

    server {

        ...

        location /v1/ {
            proxy_pass http://backend;

            ...

        }
    }
}

アップストリーム モジュールは標準モジュールであり、Nginx のインストールに含まれないようにするには、特に無効にする必要がありました。

于 2015-08-15T08:34:07.237 に答える