2015-09-29 20 views
48

Dockerの共通ドメインにいくつかのRailsアプリケーションがあり、nginxを使用して特定のアプリケーションにリクエストを送ります。アップストリームのホストが見つからない場合、nginxがクラッシュしないように設定する

our_dev_server.com/foo # proxies to foo app 
our_dev_server.com/bar # proxies to bar 

Configが次のようになります。

これらのアプリケーションのいずれかが、その後開始されていないnginxのに失敗し、停止した場合
upstream foo { 
    server foo:3000; 
} 

upstream bar { 
    server bar:3000; 
} 

# and about 10 more... 

server { 
    listen *:80 default_server; 

    server_name our_dev_server.com; 

    location /foo { 
     # this is specific to asset management in rails dev 
     rewrite ^/foo/assets(/.*)$ /assets/$1 break; 
     rewrite ^/foo(/.*)$ /foo/$1 break; 
     proxy_pass http://foo; 
    } 

    location /bar { 
     rewrite ^/bar/assets(/.*)$ /assets/$1 break; 
     rewrite ^/bar(/.*)$ /bar/$1 break; 
     proxy_pass http://bar; 
    } 

    # and about 10 more... 
} 

:私たちはアップするすべてのそれらを必要としない

host not found in upstream "bar:3000" in /etc/nginx/conf.d/nginx.conf:6 

そうでなければnginxは失敗します。 nginxで失敗したアップストリームを無視する方法

+0

あなたはnginxのコンテナとアプリのコンテナをリンク、またはそれらが互いに離れる実行していますか?実行時に、 'upstream'ブロック内のホストが解決しない場合、Nginxは上記のエラーで終了します... – Justin

+0

IPを使用することができれば、それはうまく起動します。あなたのケースでは 'resolver'(http://nginx.org/en/docs/http/ngx_http_core_module.html#resolver)を使用しますか? – Justin

+0

@ジャスティン私たちは別の容器、nginxにも各アプリを持っています。ドッカーとリンクしてください –

答えて

39
  1. あなたはちょうどそれを使用し、静的IPを使用することができた場合、それが起動だろうし、それが応答しない場合だけ503年代を返します。

  2. ディレクティブresolverを使用すると、ホストが現在動作しているかどうかにかかわらず、ホストを解決できるものを指すことができます。あなたは上記のを行うことができない場合

  3. (これはnginxのは/実行を開始することができます)、locationレベルでそれを解決します。

    location /foo { 
        resolver 127.0.0.1 valid=30s; 
        # or some other DNS (you company/internal DNS server) 
        #resolver 8.8.8.8 valid=30s; 
        set $upstream_foo foo; 
        proxy_pass http://$upstream_foo:80; 
    } 
    
    location /bar { 
        resolver 127.0.0.1 valid=30s; 
        # or some other DNS (you company/internal DNS server) 
        #resolver 8.8.8.8 valid=30s; 
        set $upstream_bar foo; 
        proxy_pass http://$upstream_bar:80; 
    } 
    
+0

オプション3は素晴らしいです。リゾルバを指定しなければ、nginxが解決したIPをどのくらいの期間キャッシュするのか知っていますか? –

+3

ありがとう!ちょうど変数を使用することは、それについてスマートでnginxを維持するようだ – Blanka

+0

私は、正規表現のキャプチャグループは、変数をスキップすることができます: '場所〜^/foo /(.*)$ {proxy_pass http:// foo/$ 1; } ' –

4

upstreamを使用しての主な利点がありますを異なるポートでリッスンし、ロードバランシングとフェイルオーバーを構成するサーバーのグループのように定義することができます。あなたのケースでは

あなたは、上流のであたりのみ定義する1台のプライマリサーバは、それがアップすることが必要です。

代わりにproxy_pass(es)に変数を使用し、ターゲットサーバーがダウンしたときに発生する可能性のあるエラー(404、503)を処理してください。

-4

--linkオプションを使用することはできません。代わりに、ポートマッピングを使用してnginxをホストアドレスにバインドすることができます。

例:-p 180:80オプション付きの最初のドッカーコンテナ、-p 280:80オプション付きの2番目のコンテナを実行します。

実行nginxのプロキシのためにこれらのアドレスを設定します。

proxy_pass http://192.168.1.20:180/; # first container 
proxy_pass http://192.168.1.20:280/; # second container 
+0

これらのネットワークを動的に作成するとどうなりますか? – EralpB

関連する問題