programing

업스트림의 호스트를 찾을 수없는 경우 nginx가 충돌하지 않도록 설정

nasanasas 2020. 9. 10. 07:57
반응형

업스트림의 호스트를 찾을 수없는 경우 nginx가 충돌하지 않도록 설정


Docker의 공통 도메인 아래에 여러 개의 레일 앱이 있으며 nginx를 사용하여 특정 앱에 요청을 보냅니다.

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

구성은 다음과 같습니다.

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...
}

이러한 앱 중 하나가 시작되지 않으면 nginx가 실패하고 중지됩니다.

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

모두 작동 할 필요는 없지만 그렇지 않으면 nginx가 실패합니다. nginx가 실패한 업스트림을 무시하도록 만드는 방법은 무엇입니까?


  1. 고정 IP를 사용할 수 있다면 그것을 사용하면 시작되고 503응답하지 않으면 's를 반환합니다.

  2. resolver지시문을 사용하여 현재 작동 여부에 관계없이 호스트를 확인할 수있는 항목을 가리 킵니다.

  3. location위의 작업을 수행 할 수없는 경우 수준 에서 해결하십시오 (이렇게하면 Nginx를 시작 / 실행할 수 있음) .

    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;
    }
    

The main advantage of using upstream is to define a group of servers than can listen on different ports and configure load-balancing and failover between them.

In your case you are only defining 1 primary server per upstream so it must to be up.

Instead, use variables for your proxy_pass(es) and remember to handle the possible errors (404s, 503s) that you might get when a target server is down.


For me, option 3 of the answer from @Justin/@duskwuff solved the problem, but I had to change the resolver IP to 127.0.0.11 (Docker's DNS server):

location /foo {
  resolver 127.0.0.11 valid=30s;
  set $upstream_foo foo;
  proxy_pass http://$upstream_foo:80;
}

location /bar {
  resolver 127.0.0.11 valid=30s;
  set $upstream_bar foo;
  proxy_pass http://$upstream_bar:80;
}

But as @Justin/@duskwuff mentioned, you could use any other external DNS server.


You can do not use --link option, instead you can use port mapping and bind nginx to host address.

Example: Run your first docker container with -p 180:80 option, second container with -p 280:80 option.

Run nginx and set these addresses for proxy:

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

참고URL : https://stackoverflow.com/questions/32845674/setup-nginx-not-to-crash-if-host-in-upstream-is-not-found

반응형