nginx: upstream dengan beberapa perintah server?

14

Saya mencoba mengemas 2 aplikasi yang menggunakan nginx sebagai proxy dan mengirimkan masing-masing file konfigurasi ke dalamnya /etc/nginx/conf.d/.

Melakukan ini dalam satu file ( combined.conf) berfungsi dengan baik:

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

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

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

Namun, ketika dipecah menjadi 2 file, salah satu pengalihan gagal secara sistematis:

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

Jadi pertanyaan saya adalah: dapatkah sebuah httpsimpul memiliki 2 serveranak yang berbeda ?

Dokumentasi Nginx tidak mengatakan apa-apa tentang itu.

Orang lain tampaknya telah berhasil dengan arsitektur semacam ini :(

Versi Nginx adalah 1.1.19-1ubuntu0.1.

Terima kasih atas sarannya!

oDDsKooL
sumber
Untuk lebih tepatnya, ketika saya menggunakan pendekatan 2 file itu adalah situs default yang menjawab dengan 404.
oDDsKooL

Jawaban:

8

setelah begitu gemuruh & pengujian, saya menemukan cara untuk membuatnya bekerja dan dapat mengirimkan satu file konfigurasi per aplikasi.

Ini dia, dikirim dalam satu file umum dan sepasang file upstream / lokasi per aplikasi:

  • /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
sumber
1
Apakah ini salah cetak? upstream harus memiliki "server localhost: 8990" bukan " localhost: 8990 ;". Lihat di sini: nginx.org/en/docs/http/ngx_http_upstream_module.html
mbdev
Tampaknya dari dokumen yang Anda tautkan bahwa setiap perintah di dalam blok diakhiri dengan semi kolom. Misalnya upstream backend { server 127.0.0.1:8080 max_fails=3 fail_timeout=30s; }. Juga, ini bekerja dengan ;:)
oDDsKooL
Maksud saya kata kunci 'server' tidak ada sebelum alamat. Abaikan bagian titik koma.
mbdev
1

Blok http dapat memiliki banyak anak server. Namun, nginx memilih satu blok server untuk memproses permintaan. Jadi, permintaan tidak pernah 'melihat' lokasi backend2 karena cocok dengan blok server pertama.

chrskly
sumber
Maksudmu mungkin itu adalah locationarahan saya yang menyebalkan dan mengambil permintaan yang dimaksudkan untuk backend2?
oDDsKooL
Atau apakah saya perlu cara untuk membedakan kedua serverblok ketika nginx mencari yang sesuai serveruntuk meneruskan permintaan?
oDDsKooL
Kedua blok lokasi harus berada dalam blok server yang sama.
chrskly