Bisakah Anda menentukan lokasi server di banyak file konfigurasi nginx?


14

Saya memiliki beberapa aplikasi ruby ​​yang berjalan di host yang sama:

~/app1
~/app2
~/app3

Dan saya ingin memiliki nginx proxy aplikasi ini menggunakan sub-direktori seperti:

   http://example.com/app1
   http://example.com/app2
   http://example.com/app3

Saya ingin tahu apakah nginx mendukung saya untuk dapat menentukan lokasi ini dalam banyak file, sehingga saya dapat menjaga setiap konfigurasi dengan aplikasi, alih-alih memiliki satu file konfigurasi monolitik untuk semua aplikasi:

~/app1/nginx.conf
~/app2/nginx.conf
~/app3/nginx.conf

Upaya naif saya untuk mendefinisikan server dengan direktif lokasi tunggal di masing-masing dari 3 file konfigurasi menyebabkan conflicting server name "example.com" on [::]:80, ignoreddengan konfigurasi yang terlihat seperti ini:

upstream app1 { server 127.0.0.1:4567; }
server {
  listen      [::]:80;
  listen      80;
  servername  example.com
  location    /app1 {
     proxy_pass  http://app1;
     proxy_http_version 1.1;
     proxy_set_header Upgrade $http_upgrade;
     proxy_set_header Connection "upgrade";
     proxy_set_header Host $http_host;
     proxy_set_header X-Forwarded-Proto $scheme;
     proxy_set_header X-Forwarded-For $remote_addr;
     proxy_set_header X-Forwarded-Port $server_port;
     proxy_set_header X-Request-Start $msec;
  }
}

Apakah ada cara untuk mengatur konfigurasi seperti ini?

Jawaban:


9

Anda dapat memasukkan konfigurasi eksternal melalui sertakan:

include /path/to/config1.conf;
include /path/to/config2.conf;
include /path/to/confdir/*.conf;

server {
    server_name example.com;
    listen      [::]:80;
    listen      80;
}

Dan di dalam konfigurasi terpisah Anda dapat menggunakan blok kode yang valid:

upstream app1 {
    server 127.0.0.1:8080;
}

location /app1 {
    proxy_pass http://app1;
}

5
Apakah ini benar-benar berfungsi? Tidakkah modul upstream harus berada di luar blok modul server?
— Curley

5
Sepertinya arahan lokasi tidak diizinkan di luar blok server. Setidaknya bagi saya, nginx melaporkan "location" directive is not allowed here.
— Alexander Amelkin

Ya ... Saya tidak melihat cara sederhana untuk melakukannya dengan benar tanpa beberapa file per aplikasi: satu yang akan bekerja di dalam blok server, yang akan bekerja di luar. Saya kira untuk fleksibilitas dan untuk membuatnya lebih bersih, wildcard dapat digunakan: include /etc/nginx/above_server.d/*daninclude /etc/nginx/in_server.d/*
— jeteon

1
Jawaban ini salah
— AmirHossein

11

Saya percaya, Anda dapat menggunakan konfigurasi ini:

server {
    server_name example.com;
    listen      [::]:80;
    listen      80;

    include /path/to/applications/*/nginx.conf;
}

dan kemudian di setiap direktori aplikasi konfigurasikan pengalihan seperti ini:

location    /app1 {
    proxy_pass  http://app1;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $http_host;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Forwarded-For $remote_addr;
    proxy_set_header X-Forwarded-Port $server_port;
    proxy_set_header X-Request-Start $msec;
}

2
Downside akan menjadi bahwa Anda tidak dapat menentukan beberapa upstreams dalam serverblok tetapi saya pikir kasus penggunaan OP dilayani dengan baik oleh jawaban ini.
— jeteon
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.