34

サイトexample.comのリバースプロキシとしてnginxを実行して、バックエンドサーバーで実行されているRubyアプリケーションの負荷を分散しています。proxy_set_headerホストヘッダーをバックエンドルビーに渡すnginxに次のフィールドがあります。これは、サブドメイン名を識別するために ruby​​ アプリで必要になります。

location / {
    proxy_pass http://rubyapp.com;
    proxy_set_header Host $http_host;
}

ここで alias を作成したいのですbeta.example.comが、バックエンドに渡されるホスト ヘッダーはそのままである必要がありwww.example.comます。そうしないと、Ruby アプリケーションが要求を拒否します。そのため、場所ディレクティブ内で以下のようなものが必要です。

if ($http_host = "beta.example.com") {
    proxy_pass http://rubyapp.com;
    proxy_set_header Host www.example.com;
}

これを行う最善の方法は何ですか?

4

4 に答える 4

37

if ブロックではproxy_passを使用できないため、プロキシ ヘッダーを設定する前に次のようにすることをお勧めします。

set $my_host $http_host;
if ($http_host = "beta.example.com") {
  set $my_host "www.example.com";
}

これで、if ブロックなしでproxy_passproxy_set_headerを使用できるようになりました。

location / {
  proxy_pass http://rubyapp.com;
  proxy_set_header Host $my_host;
}
于 2013-01-16T07:03:31.973 に答える
30

mapsetは+よりも優れていifます。

map $http_host $served_host {
    default $http_host;
    beta.example.com www.example.com;
}

server {
    [...]

    location / {
        proxy_pass http://rubyapp.com;
        proxy_set_header Host $served_host;
    }
}
于 2016-04-04T16:01:57.460 に答える
2

ちょっとしたヒントです。Hostヘッダーの代わりにX-Forwarded-Hostを使用する必要がある場合があります。これは、Host ヘッダーが機能するが、標準の HTTP ポート 80 に対してのみ機能する私のケースでした。アプリが非標準ポートで公開された場合、アプリがリダイレクトを生成したときに、このポートが失われました。だから最後に私のために働いたのは:

proxy_set_header X-Forwarded-Host $http_host;
于 2018-06-28T10:24:28.813 に答える