ช่วยฉันเข้าใจวิธีใช้ ProxyPass


11

อัปเดต: ฉันเพิ่มคำถามที่แก้ไขแล้วหลังจากเล่นไปพร้อมคำตอบสองข้อด้านล่าง

สวัสดี,

หากคุณกำลังอ่านสิ่งนี้คุณอาจคุ้นเคยกับ mod_proxy ของ Apache และฟังก์ชั่น ProxyPass เช่นเดียวกับคนอื่น ๆ ฉันมีปัญหาในการมีแอปพลิเคชันที่ฉันสามารถเข้าถึงได้จากนอกเครือข่ายภายในของเรา แต่แอปพลิเคชันนั้นเข้าถึงแอพภายในเครื่องอื่นบนเครื่องที่แตกต่างกันและเมื่อคุณเข้าใช้การตั้งค่านี้

ดังนั้นการตั้งค่าของฉันง่ายมากฉันมี:

Machine # 1 เปิดใช้งานการเข้าถึงระยะไกลฉันเข้าถึงผ่านชื่อโฮสต์และคายแอปพลิเคชัน PHP ที่ทำงานอยู่

Machine # 2 เป็นแอปพลิเคชั่นใหม่ที่ใช้ Django โดยใช้แบ็กเอนด์ที่แตกต่างกันโดยสิ้นเชิง (แม้จะตรวจสอบความถูกต้อง) มันถูกโฮสต์ไว้ในเครื่องแยกต่างหาก ในอินทราเน็ตของเราเราเข้าถึงผ่านชื่อโฮสต์ที่มีชื่ออย่างง่ายซึ่งโดยทั่วไปจะเชื่อมโยงกับ ip 192.168.0.101 ภายใน

ฉันได้ลองเล่นกับ ProxyPass เพื่อตั้งค่าตัวอย่างเช่นการส่งผ่าน / ใหม่จะส่งไปยังแอปพลิเคชันใหม่:

ProxyPass / ใหม่http://192.168.0.101/

ผลงานประเภทนี้จะได้รับการร้องขอไปยังแอปอื่น แต่หยุดเพราะแอพ Django ของฉันต้องการเปลี่ยนเส้นทางไปที่ / auth / login / ซึ่งมันจำไม่ได้ทันที ถ้าฉันปรับเปลี่ยน url ตัวเองให้เป็น foo.net/new/auth/login ฉันได้รับหน้าเข้าสู่ระบบของฉัน แต่คุณสามารถเดาได้ว่าการทำเช่นนี้ในระหว่างการเรียกดูนั้นไม่สะดวก

ดังนั้นฉันจะให้ ProxyPass ทำงานตามที่ต้องการได้อย่างไร ฉันจำเป็นต้องทำบางสิ่งกับ Apache หรือไม่ดังนั้นจึงควรเขียน / ใหม่ก่อนที่ url จะอยู่ในแอพอื่น ๆ หรือสิ่งนี้ที่ฉันควรแก้ไขภายในแอพ Django ของฉันหรือไม่

เคล็ดลับและคำแนะนำใด ๆ เช่นกันจะได้รับการชื่นชมอย่างมาก ขอบคุณที่สละเวลา

คำตอบ:


11

คุณควรปรับเปลี่ยนแอปพลิเคชัน django ของคุณเพื่อให้คาดว่าจะเป็น / new / auth / login แทน / auth / login โดยทั่วไปการผ่านพรอกซีของคุณควรมีลักษณะดังนี้:

ProxyPass /path http://192.168.0.101/path
ProxyPassReverse /path http://192.168.0.101/path

ที่รวมกับแอป Django ของคุณคาดว่าจะเป็น / ใหม่ / ควรแก้ไขปัญหาของคุณ


2

ใช้ VirtualHost ตัวอย่างเช่นตั้งค่าชื่อ A ของเซิร์ฟเวอร์ของคุณ (เช่นsub.external.com ) เป็น IP เซิร์ฟเวอร์ของคุณ (เช่น123.456.678 )

เนื่องจากความปลอดภัยคุณต้องส่งต่อ HTTP_HOST อย่างชัดเจนหากใช้ ProxyPass ในsettings.py , ต่อตั๋ว # 6880 :

USE_X_FORWARDED_HOST = True

จากนั้นเพิ่มสิ่งต่อไปนี้ลงใน Apache /etc/httpd/httpd.conf :

# Virtual hosts
Include /etc/httpd/extra/httpd-vhosts.conf

เพิ่ม VirtualHost ของคุณไปที่/etc/httpd/extra/httpd-vhosts.conf :

NameVirtualHosts *:80

<VirtualHost *:80>
  ServerName sub.external.com
  ProxyPass / http://127.0.0.1:8000/
</VirtualHost>

ตอนนี้คุณจะสามารถเข้าถึงไซต์ของคุณได้จากhttp://sub.external.comโดยไม่ต้องกังวลกับ "เส้นทาง"


1

ขอบคุณสำหรับคำตอบของคุณฉันกำลังตอบคำถามของตัวเองเนื่องจากต้องการการแก้ไขหลังจากเล่นเกมนี้

ก่อนอื่นแอพ # 2 จะปิดใช้งานhttp://192.168.0.101 .. มันไม่ได้รันhttp://192.168.0.101/pathดังนั้น ProxyPass จึงไม่ทำงาน

ดังนั้นหลังจากพูดคุยกับ #apache guys จาก irc ฉันพบว่าฉันต้องทำสิ่งนี้:

RewriteCond% {HTTP_HOST} ^ app2.myremotedns.com *

RewriteRule. * http://192.168.0.101/ [P]

สิ่งนี้จะส่งกฎการเขียนซ้ำสำหรับคำขอใด ๆ ไปยัง app2.myremotedns.com เพื่อส่งไปยัง ip ภายในผ่านพร็อกซี

ใช้งานได้บ้าง แต่มีสามประเด็น:

  • ด้วยการเข้าสู่ระบบที่จำเป็นในทุกหน้าถ้าฉันเข้าถึงอะไรจากระยะไกลบน app2 มันเปลี่ยนเส้นทางไปยัง / auth / เข้าสู่ระบบ .. อย่างไรก็ตามเนื่องจากการตั้งค่า Rewrite ปัจจุบันฉันได้รับการเปลี่ยนเส้นทางวนก่อนที่ Firefox จะหยุดพยายามเส้นทาง ฉันเดาว่านี่อาจเกี่ยวข้องกับวิธีการเปลี่ยนเส้นทางของ Django แต่ฉันก็ไม่แน่ใจ

  • หากฉันปิดใช้งานการเข้าสู่ระบบหน้าเว็บจะเป็นประเภทการทำงาน แต่ไม่สมบูรณ์ ฉันดูเหมือนจะสามารถดึงข้อมูลหน้าดัชนีของแอป # 2 ได้ แต่ไม่มีอะไรอื่นอีกแล้ว

  • สื่อแบบคงที่เสียทั้งหมด แต่อาจเป็นวิธีง่าย ๆ .. ไม่ต้องเป็นห่วงตอนนี้

ดังนั้นฉันมีปัญหาที่ซับซ้อนมากขึ้นจากนั้นฉันก็นึกภาพ ... :)


การใช้การกำหนดค่า django ที่แตกต่างจากค่าเริ่มต้นทำให้เกิดปัญหามาก เมื่อเร็ว ๆ นี้ kinda แก้ไขปัญหาอื่นด้วย django และ ProxyPass ในบล็อกของฉัน: fromzerotocodehero.blogspot.com/2011/01/…

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