nginx: upstream z wieloma dyrektywami serwera?

15

Próbuję spakować 2 aplikacje, które używają nginx jako proxy i dostarczyć do nich każdy plik konfiguracyjny /etc/nginx/conf.d/.

Wykonanie tego w jednym pliku ( combined.conf) działa świetnie:

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

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

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

Jednak przy dzieleniu na 2 pliki jedno z przekierowań nie udaje się systematycznie:

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

Moje pytanie brzmi: czy httpwęzeł może mieć 2 różne serverdzieci?

Dokumentacja Nginx nic o tym nie mówi.

Wydaje się, że innym ludziom udało się tego rodzaju architektura :(

Wersja Nginx to 1.1.19-1ubuntu0.1.

Dziękuję za wszelkie porady!

oDDsKooL
źródło
Mówiąc ściślej, gdy używam metody 2 plików, jest to domyślna strona, która odpowiada 404.
oDDsKooL

Odpowiedzi:

8

po tak dudnieniu i testowaniu wymyśliłem sposób, aby to zadziałało i móc wysłać jeden plik konfiguracyjny na aplikację.

Oto on, wysyłany w jednym wspólnym pliku i parze plików nadrzędnych / plików na aplikację:

  • /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
źródło
1
Czy to literówka? upstream powinien mieć „server localhost: 8990” zamiast „ localhost: 8990 ;”. Zobacz tutaj: nginx.org/en/docs/http/ngx_http_upstream_module.html
mbdev
Z połączonego dokumentu wydaje się, że każde polecenie w bloku jest zakończone półkolumną. Np upstream backend { server 127.0.0.1:8080 max_fails=3 fail_timeout=30s; }. Działa to również z ;:)
oDDsKooL
Chodzi mi o to, że przed adresem brakuje słowa kluczowego „serwer”. Zignoruj ​​część średnika.
mbdev
1

Blok http może mieć wiele potomków serwera. Jednak nginx wybiera jeden blok serwera do przetworzenia żądania. Zatem żądanie nigdy nie „widzi” położenia backend2, ponieważ pasuje do pierwszego bloku serwera.

chrskly
źródło
Masz na myśli prawdopodobnie to moja locationdyrektywa jest do bani i pobiera żądanie przeznaczone dla backend2?
oDDsKooL
Czy też potrzebuję sposobu na rozróżnienie obu serverbloków, gdy nginx szuka odpowiedniego serverdo przekazania żądania?
oDDsKooL
Oba bloki lokalizacji powinny znajdować się w tym samym bloku serwera.
chrskly