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.