nginx: апстрим с несколькими директивами сервера?

15

Я пытаюсь упаковать 2 приложения, которые используют nginx в качестве прокси-сервера и доставить каждый файл конфигурации в /etc/nginx/conf.d/.

Делать это в одном файле ( 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 файла один из перенаправлений систематически завершается ошибкой:

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

Спасибо за любой совет!

oDDsKooL
источник
Чтобы быть более точным, когда я использую подход с двумя файлами, это сайт по умолчанию, который отвечает 404.
oDDsKooL

Ответы:

8

после такого урчания и тестирования я нашел способ заставить его работать и иметь возможность отправлять один файл конфигурации на приложение.

Вот он, отправленный в одном общем файле и паре файлов upstream / location для каждого приложения:

  • /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;
    }
    
oDDsKooL
источник
1
Это опечатка? в апстриме должно быть «server localhost: 8990» вместо « localhost: 8990 ;». Смотрите здесь: nginx.org/en/docs/http/ngx_http_upstream_module.html
mbdev
Из документа, который вы связали, кажется, что каждая команда внутри блока оканчивается точкой с запятой. Например upstream backend { server 127.0.0.1:8080 max_fails=3 fail_timeout=30s; }. Кроме того, это работает с ;:)
oDDsKooL
Я имел в виду, что ключевое слово «сервер» отсутствует перед адресом. Игнорировать точку с запятой.
mbdev
1

Блок http может иметь много дочерних элементов сервера. Однако nginx выбирает один блок сервера для обработки запроса. Таким образом, запрос никогда не «видит» местоположение backend2, потому что оно совпадает с первым блоком сервера.

chrskly
источник
Вы имеете в виду, вероятно, что это моя locationдиректива, которая сосет и получает запрос, предназначенный для backend2?
oDDsKooL
Или мне нужен способ различать оба serverблока, когда nginx ищет подходящее serverдля пересылки запроса?
oDDsKooL
Оба блока местоположения должны находиться в одном блоке сервера.
Чрсклы