nginx: upstream ที่มีหลายคำสั่งเซิร์ฟเวอร์?


15

ฉันพยายามที่จะจัดแพคเกจ 2 โปรแกรมประยุกต์ที่ใช้ Nginx เป็นพร็อกซี่และส่งมอบแต่ละไฟล์ config /etc/nginx/conf.d/ลง

การทำเช่นนี้ในไฟล์เดียว ( combined.conf) ใช้งานได้ดี:

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

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

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

อย่างไรก็ตามเมื่อแบ่งออกเป็น 2 ไฟล์หนึ่งในการเปลี่ยนเส้นทางจะล้มเหลวอย่างเป็นระบบ:

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

ดังนั้นคำถามของฉันคือ: httpโหนดสามารถมีลูกที่แตกต่างกัน 2 server?

เอกสารของ Nginx ไม่ได้พูดอะไรเลย

คนอื่นดูเหมือนจะประสบความสำเร็จกับสถาปัตยกรรมประเภทนี้แม้ว่า :(

รุ่น Nginx คือ 1.1.19-1ubuntu0.1

ขอบคุณสำหรับคำแนะนำใด ๆ !


เพื่อความแม่นยำมากขึ้นเมื่อฉันใช้ 2 ไฟล์เข้าใกล้มันเป็นเว็บไซต์เริ่มต้นที่ตอบด้วย 404
oDDsKooL

คำตอบ:


8

หลังจากเสียงดังและการทดสอบฉันคิดวิธีที่จะทำให้มันทำงานและสามารถจัดส่งหนึ่งไฟล์ config ต่อแอปพลิเคชัน

นี่คือจัดส่งในไฟล์ทั่วไปหนึ่งไฟล์และไฟล์ upstream / location หนึ่งไฟล์ต่อแอปพลิเคชัน:

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

1
นี่คือการพิมพ์ผิดหรือไม่? อัพสตรีมควรมี "เซิร์ฟเวอร์ในโฮสต์: 8990" แทนที่จะเป็น " localhost: 8990 ;" ดูที่นี่: nginx.org/en/docs/http/ngx_http_upstream_module.html
mbdev

ดูเหมือนว่าจากเอกสารที่คุณเชื่อมโยงว่าทุกคำสั่งภายในบล็อกนั้นสิ้นสุดด้วยคอลัมน์กึ่ง upstream backend { server 127.0.0.1:8080 max_fails=3 fail_timeout=30s; }เช่น นอกจากนี้ยังใช้งานได้กับ;:)
oDDsKooL

ฉันหมายความว่าคำหลัก 'เซิร์ฟเวอร์' หายไปก่อนที่อยู่ ละเว้นส่วนอัฒภาค
mbdev

1

บล็อก http สามารถมีเซิร์ฟเวอร์ลูกได้จำนวนมาก อย่างไรก็ตาม nginx เลือกหนึ่งบล็อกเซิร์ฟเวอร์เพื่อประมวลผลคำขอ ดังนั้นคำขอจะไม่ 'เห็น' ตำแหน่งแบ็กเอนด์ 2 เพราะตรงกับบล็อกเซิร์ฟเวอร์แรก


คุณหมายถึงอาจเป็นlocationคำสั่งของฉันที่ดูดและคว้าคำขอไว้สำหรับแบ็กเอนด์ 2?
oDDsKooL

หรือว่าฉันต้องการวิธีที่จะแยกความแตกต่างserverบล็อกทั้งสองเมื่อ nginx มองหาที่เหมาะสมserverในการส่งต่อการร้องขอ?
oDDsKooL

บล็อกสถานที่ทั้งสองควรอยู่ในบล็อกเซิร์ฟเวอร์เดียวกัน
chrskly
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.