nginx:複数のサーバーディレクティブを持つアップストリーム?


14

私はnginxをプロキシとして使用する2つのアプリケーションをパッケージ化し、それぞれに設定ファイルを配信しようとしています/etc/nginx/conf.d/

これを1つのファイル(combined.conf)で行うとうまくいきます:

    upstream backend1 {
      http://localhost:8989;
    }

    upstream backend2 {
      http://localhost:8990;
    }

    server {
      location /backend1/ {
        proxy_pass  http://backend1;
      }
      location /backend2/ {
        proxy_pass  http://backend2;
      }

ただし、2つのファイルに分割すると、リダイレクトの1つが体系的に失敗します。

  • backend1.conf

    upstream backend1 {
      http://localhost:8989;
    }
    
    server {
      location /backend1/ {
        proxy_pass  http://backend1;
      }
    
  • backend2.conf

    upstream backend2 {
      http://localhost:8990;
    }
    
    server {
      location /backend2/ {
        proxy_pass  http://backend2;
      }
    

だから私の質問は次のとおりです。httpノードは2つの異なる子を持つことができますserverか?

Nginxのドキュメントには、それについて何も記載されていません。

しかし、他の人々はこの種のアーキテクチャで成功しているようです:(

Nginxバージョンは1.1.19-1ubuntu0.1です。

アドバイスをありがとう!


私は2つのファイルを使用する場合、それはデフォルトのサイトで近づき、より正確にはその404との答え
oDDsKooL

回答:


8

ざわめきとテストの後、私はそれを機能させ、アプリケーションごとに1つの構成ファイルを出荷できるようにする方法を考え出しました。

これは、アプリケーションごとに1つの共通ファイルと1組のアップストリーム/ロケーションファイルでディスパッチされます。

  • /etc/nginx/conf.d/common-proxies.conf

    include /upstreams/*.conf;
    
    server {
    include /locations/*.conf
    }
    
  • /etc/nginx/locations/backend1.conf

    location /backend1/ {
      upstream http://backend1;
    }
    
  • /etc/nginx/locations/backend2.conf

    location /backend2/ {
      upstream http://backend2;
    }
    
  • /etc/nginx/upstreams/backend1.conf

    upstream backend1 {
      http://localhost:8989;
    }
    
  • /etc/nginx/upstreams/backend2.conf

    upstream backend2 {
      http://localhost:8990;
    }
    

1
これはタイプミスですか?アップストリームには、「localhost:8990 ;」ではなく「server localhost:8990」が必要です。こちらをご覧ください:nginx.org/en/docs/http/ngx_http_upstream_module.html
mbdev 14

リンクしたドキュメントから、ブロック内のすべてのコマンドはセミカラムで終了しているようです。例upstream backend { server 127.0.0.1:8080 max_fails=3 fail_timeout=30s; }。また、これは;:)で動作します
oDDsKooL 14

キーワードの「サーバー」が住所の前にないことを意味しました。セミコロン部分は無視してください。
mbdev 14

1

httpブロックには、多くのサーバーの子を含めることができます。ただし、nginxはリクエストを処理するために1つのサーバーブロックを選択します。したがって、リクエストは最初のサーバーブロックと一致するため、backend2の場所を「見る」ことはありません。


おそらくlocation、backend2を対象とするリクエストを吸い込んで取得するのは私のディレクティブなのでしょうか?
oDDsKooL

またはserver、nginxがserverリクエストを転送するのに適切なものを探すときに、両方のブロックを区別する方法が必要ですか?
oDDsKooL

両方のロケーションブロックは同じサーバーブロック内にある必要があります。
chrskly
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.