คุณสามารถกำหนดตำแหน่งของเซิร์ฟเวอร์ในไฟล์กำหนดค่า nginx หลายไฟล์ได้หรือไม่?


14

ฉันมีแอพ ruby ​​หลายตัวที่ทำงานบนโฮสต์เดียวกัน:

~/app1
~/app2
~/app3

และฉันต้องการให้พร็อกซี nginx แอปเหล่านี้ใช้ไดเรกทอรีย่อยเช่น:

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

ฉันอยากรู้ว่า nginx สนับสนุนให้ฉันสามารถกำหนดตำแหน่งเหล่านี้ในหลาย ๆ ไฟล์ได้หรือไม่เพื่อให้ฉันสามารถกำหนดค่าแต่ละแอปด้วยแอปแทนการมีไฟล์กำหนดค่าเสาหินเดียวสำหรับแอพทั้งหมด:

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

ความพยายามที่ไร้เดียงสาของฉันในการกำหนดเซิร์ฟเวอร์ด้วยคำสั่งตำแหน่งที่ตั้งเดียวในแต่ละไฟล์กำหนดค่า 3 ไฟล์นำไปสู่การกำหนดconflicting server name "example.com" on [::]:80, ignoredค่าที่มีลักษณะดังนี้:

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

มีวิธีในการจัดระเบียบ configs ด้วยวิธีนี้หรือไม่?

คำตอบ:


9

คุณสามารถรวมการกำหนดค่าภายนอกผ่านทางรวม:

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

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

และภายใน config ที่แยกจากกันคุณสามารถใช้บล็อคโค้ดที่ถูกต้องได้:

upstream app1 {
    server 127.0.0.1:8080;
}

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

5
ใช้งานได้จริงหรือ โมดูลอัปสตรีมไม่จำเป็นต้องอยู่นอกบล็อกโมดูลเซิร์ฟเวอร์หรือไม่
Curley

5
ดูเหมือนว่าไม่อนุญาตให้ใช้คำสั่งตำแหน่งนอกบล็อกเซิร์ฟเวอร์ "location" directive is not allowed hereอย่างน้อยสำหรับฉันรายงาน Nginx
Alexander Amelkin

ใช่ ... ฉันไม่เห็นวิธีที่ง่ายในการทำอย่างถูกต้องโดยไม่มีหลายไฟล์ต่อแอปพลิเคชัน: อันที่จะทำงานภายในบล็อกเซิร์ฟเวอร์หนึ่งที่จะทำงานนอก ฉันเดาถึงความยืดหยุ่นและเพื่อให้สามารถใช้สัญลักษณ์แทนได้: include /etc/nginx/above_server.d/*และinclude /etc/nginx/in_server.d/*
jeteon

1
คำตอบนี้ผิด
AmirHossein

11

ฉันเชื่อว่าคุณสามารถใช้การกำหนดค่านี้:

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

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

และในไดเรกทอรีของแต่ละแอปพลิเคชันจะกำหนดค่าการเปลี่ยนเส้นทางดังนี้:

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
ข้อเสียคือคุณไม่สามารถกำหนด upstreams หลายรายการในserverบล็อกได้ แต่ฉันคิดว่าคำตอบนี้ใช้กรณีการใช้งานของ OP
jeteon
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.