Score:0

Nginx reverse proxy สำหรับสองเว็บแอปพลิเคชัน

ธง in

ฉันมีสองแอปพลิเคชัน

  • แอปพลิเคชัน Laravel - เป็นเพียงเว็บไซต์แบบไดนามิก ไม่ได้มี ข้อมูลความรู้ ข้อมูลทั้งหมดได้รับการดึงมาจากแอปพลิเคชันที่สอง ใช้คำขอ AJAX วิ่งต่อไป 127.0.0.1:8000.
  • การประยุกต์ใช้สนิม - แอปพลิเคชันเว็บที่มีธุรกิจทั้งหมด ตรรกะและการเข้าถึงข้อมูล วิ่งต่อไป 127.0.0.1:8080.

แอปพลิเคชันทั้งสองต้องสามารถเข้าถึงได้จาก URL ตัวอย่าง.คอม. สำหรับสิ่งนี้ฉันต้องการใช้ Nginx Reverse Proxy ฉันสามารถเปลี่ยนเส้นทางคำขอทั้งหมดไปยังแอปพลิเคชัน Laravel ของฉันได้แล้ว

เหตุการณ์ {}
http {
    เซิร์ฟเวอร์ {
        ฟัง 80;

        #เว็บไซต์
        ที่ตั้ง / {
            proxy_pass http://127.0.0.1:8000;
        }
        
    }
}

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

  • เพจเฉพาะเช่น /ข่าว, /, /เกี่ยวกับ,/ติดต่อ,... ควรเปลี่ยนเส้นทางไปที่ 127.0.0.1:8000.
  • หมายเหตุ: หน้าด้านบนอาจมีพารามิเตอร์ GET เช่น /news?article=abc.
  • คำขออื่นๆ ทั้งหมดจำเป็นต้องเปลี่ยนเส้นทางไปที่ 127.0.0.1:8080.
  • หมายเหตุ: 127.0.0.1:8080 มักประกอบด้วยโดเมนย่อย แต่โดเมนย่อยนี้ต้องทำหน้าที่เหมือนสัญลักษณ์แทนและไม่เป็นที่รู้จักในขณะที่กำหนดค่า ตัวอย่าง: business1.example.com, business2.example.com, businnesX.example.com,...

โดเมนย่อยจะส่งคืนเพจส่วนตัวซึ่งธุรกิจต่างๆ สามารถร้องขอบน example.com ได้ไม่จำกัดจำนวน

ฉันจะบรรลุการกำหนดค่านี้ได้อย่างไร ฉันคิดอะไรแบบนี้?

#PSEUDO
เหตุการณ์ {}
http {
    เซิร์ฟเวอร์ {
        ฟัง 80;

        #เว็บไซต์
        ที่ตั้ง / {
            proxy_pass http://127.0.0.1:8000;
        }
        สถานที่ / ข่าว {
            proxy_pass http://127.0.0.1:8000;
        }
        สถานที่ / เกี่ยวกับ {
            proxy_pass http://127.0.0.1:8000;
        }

        # แอปพลิเคชัน
        ที่ตั้ง * {
            proxy_pass http://127.0.0.1:8080;
        }

    }
}

แก้ไขเกี่ยวกับคำตอบของ Tero: ฉันต้องการสัญลักษณ์แทนสำหรับโดเมนย่อย

 # แอปพลิเคชั่นจับทั้งหมด
    ที่ตั้ง / {
        proxy_pass http://$subdomain.$application;
    }

abc.example.com ต้องไปที่ abc.127.0.0.1:8080 def.example.com ต้องไปที่ def.127.0.0.1:8080 ...

ฉันรู้ว่า IP ไม่สามารถมีโดเมนย่อยได้ แต่ไม่ต้องกังวลไป ฉันแก้ไขด้วยโฮสต์เสมือน

แก้ไข 2 - ส่งโดเมนย่อยของคำขอไปยัง proxy_pass:

เซิร์ฟเวอร์ {
        ฟัง 80;
        server_name *.website.com;
        server_name ~^(?<subdomain>.+)\.website\.com$;

        ที่ตั้ง / {
            proxy_pass http://$subdomain.vhost.local:8080;
        }
    }

นี่เป็นวิธีที่ถูกต้องในการเปลี่ยนเส้นทาง dynamicxxx.website.com ไปยัง dynamicxxx.vhost.local:8080 หรือไม่

djdomi avatar
za flag
ฉันคิดว่าคุณต้องแทนที่ดาวด้วยตัวหนอน
Score:2
ธง us

การออกแบบของคุณค่อนข้างซับซ้อนและเปราะบาง อย่างไรก็ตาม คุณสามารถลองทำสิ่งต่อไปนี้ ฉันเพิ่ม ต้นน้ำ บล็อกเพื่อให้แตกต่างกัน proxy_pass ปลายทางสามารถอ่านได้มากขึ้น

เว็บไซต์ต้นน้ำ {
    เซิร์ฟเวอร์ 127.0.0.1:8000;
}

แอปพลิเคชันต้นน้ำ {
    เซิร์ฟเวอร์ 127.0.0.1:8080;
}

เซิร์ฟเวอร์ {
    ชื่อเซิร์ฟเวอร์ example.com *.example.com;

    ฟัง 80;

    # แอปพลิเคชั่นจับทั้งหมด
    ที่ตั้ง / {
        proxy_pass http://แอปพลิเคชัน;
    }

    #เว็บไซต์
    ที่ตั้ง = / {
        proxy_pass http://เว็บไซต์;
    }

    สถานที่ / ข่าว {
        proxy_pass http://เว็บไซต์;
    }

    สถานที่ / เกี่ยวกับ {
        proxy_pass http://เว็บไซต์;
    }
}

เดอะ = อักขระหมายถึงการจับคู่แบบตรงทั้งหมดบน URI และเป็นลำดับความสำคัญอันดับแรกในกระบวนการค้นหา nginx ตามที่อธิบายไว้ใน เอกสาร nginx

วิธีอื่นคือการใช้นิพจน์ทั่วไป:

เซิร์ฟเวอร์ {
    ชื่อเซิร์ฟเวอร์ example.com *.example.com;

    ฟัง 80;

    ที่ตั้ง / {
        proxy_pass http://แอปพลิเคชัน;
    }

    สถานที่ ~ ^(?:/|/ข่าว|/เกี่ยวกับ) {
        proxy_pass http://เว็บไซต์;
    }
}

เดอะ server_name example.com *.example.com บอกให้ nginx ประมวลผลคำขอทั้งหมดไปยังโดเมนหลักและโดเมนย่อยที่มีกฎเหล่านี้

หากกฎการขอเว็บไซต์ต้องใช้เฉพาะกับ ตัวอย่าง.คอมจากนั้นคุณต้องกำหนดอีก เซิร์ฟเวอร์ บล็อคด้วย ชื่อเซิร์ฟเวอร์ *.example.com และระเบียบการสมัครเท่านั้น

แก้ไข

ใช่ โดเมนย่อยสามารถจับเป็นตัวแปรเช่นนั้นและใช้ใน proxy_pass ปลายทาง.คุณต้องมีโดเมนทั้งหมดในที่เดียว ชื่อเซิร์ฟเวอร์ ไลน์:

server_name example.com ~^(?<subdomain>[^.]+)\.example\.com;
O'Niel avatar
in flag
ขอบคุณมากสำหรับการตอบกลับของคุณ! นี้ใกล้เข้ามาแล้ว อย่างไรก็ตาม Catch-all สำหรับแอปพลิเคชันจำเป็นต้องจัดการกับโดเมนย่อยด้วย เป็นไปได้ไหมที่จะเป็นไวลด์การ์ด? ดูการแก้ไขโพสต์
us flag
จากนั้นคุณต้องทำบล็อก 'เซิร์ฟเวอร์' ที่สองสำหรับโดเมนย่อยด้วย 'ชื่อเซิร์ฟเวอร์ *.example.com'
O'Niel avatar
in flag
ขอบคุณสำหรับความช่วยเหลือทั้งหมด! อธิบายมันมาก. ถ้าคุณสามารถดูอีกครั้งในการแก้ไขครั้งที่สองของฉัน เกี่ยวกับสัญลักษณ์แทนโดเมนย่อย
O'Niel avatar
in flag
ฉันเป็นเพื่อนที่สนิทจริงๆ เหลือเฉพาะไวด์การ์ดของโดเมนย่อยเท่านั้น
us flag
ฉันเพิ่มตัวอย่าง `ชื่อเซิร์ฟเวอร์`

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา