Подтвердить что ты не робот

Установка 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 игнорировать неудачные восходящие потоки?

4b9b3361

Ответ 1

  • Если вы можете использовать статический IP-адрес, просто используйте его, он запустится и просто вернет 503, если он не отвечает.

  • Используйте директиву resolver, чтобы указать на то, что может разрешить хост, независимо от того, в настоящее время оно или нет.

  • Отремонтируйте его на уровне 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;
    }
    

Ответ 2

Основным преимуществом использования upstream является определение группы серверов, чем возможность прослушивания на разных портах, и настройка балансировки нагрузки и переключение между ними.

В вашем случае вы определяете только 1 первичный сервер для восходящего потока, поэтому он должен быть вверх.

Вместо этого используйте переменные для proxy_pass (es) и не забудьте обработать возможные ошибки (404s, 503s), которые вы можете получить, когда целевой сервер не работает.

Ответ 3

Вы не можете использовать опцию --link, вместо этого вы можете использовать сопоставление портов и привязать nginx к адресу узла.

Пример. Запустите свой первый контейнер докеров с опцией -p 180:80, второй контейнер с опцией -p 280:80.

Запустите nginx и установите эти адреса для прокси:

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