Bạn có thể xác định vị trí của máy chủ trong nhiều tệp cấu hình nginx không?


14

Tôi có nhiều ứng dụng ruby ​​chạy trên cùng một máy chủ:

~/app1
~/app2
~/app3

Và tôi muốn có nginx proxy các ứng dụng này bằng các thư mục con như:

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

Tôi tò mò nếu nginx hỗ trợ tôi có thể xác định các vị trí này trong nhiều tệp, để tôi có thể giữ từng cấu hình với ứng dụng, thay vì có một tệp cấu hình nguyên khối cho tất cả các ứng dụng:

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

Nỗ lực ngây thơ của tôi trong việc xác định máy chủ với một chỉ thị vị trí duy nhất trong mỗi 3 tệp cấu hình được dẫn đến conflicting server name "example.com" on [::]:80, ignoredvới một cấu hình trông như thế này:

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

Có cách nào để tổ chức các cấu hình theo cách này?

Câu trả lời:


9

Bạn có thể bao gồm các cấu hình bên ngoài thông qua bao gồm:

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

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

Và bên trong cấu hình riêng biệt, bạn có thể sử dụng bất kỳ khối mã hợp lệ nào:

upstream app1 {
    server 127.0.0.1:8080;
}

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

5
Điều này thực sự làm việc? Không phải mô-đun ngược dòng cần phải nằm ngoài khối mô-đun máy chủ?
Curley

5
Có vẻ như chỉ thị vị trí không được phép bên ngoài khối máy chủ. Ít nhất là cho tôi, nginx báo cáo "location" directive is not allowed here.
Alexander Amelkin

Vâng ... Tôi không thấy một cách đơn giản để làm điều đó đúng cách mà không có nhiều tệp cho mỗi ứng dụng: một tệp sẽ hoạt động trong một khối máy chủ, một tệp sẽ hoạt động bên ngoài. Tôi đoán tính linh hoạt và để làm cho nó sạch một ký tự đại diện có thể được sử dụng: include /etc/nginx/above_server.d/*include /etc/nginx/in_server.d/*
jeteon

1
Câu trả lời này là sai
AmirHossein

11

Tôi tin rằng, bạn có thể sử dụng cấu hình này:

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

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

và sau đó trong thư mục của mỗi ứng dụng cấu hình chuyển hướng như thế này:

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
Nhược điểm là bạn không thể xác định nhiều luồng ngược trong serverkhối nhưng tôi nghĩ trường hợp sử dụng của OP được phục vụ tốt bởi câu trả lời này.
jeteon
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.