Bantu saya memahami cara menggunakan ProxyPass

11

UPDATE: Saya menambahkan pertanyaan yang direvisi setelah bermain-main dengan itu dua jawaban di bawah ini.

Hai,

Jika Anda membaca ini, Anda mungkin akrab dengan mod_proxy Apache dan fungsi ProxyPass-nya. Seperti banyak yang lain, saya memiliki masalah memiliki aplikasi yang dapat saya akses dari luar jaringan internal kami, tetapi aplikasi itu sendiri mengakses aplikasi internal lainnya pada mesin yang berbeda, dan ketika Anda masuk ke akses jarak jauh dengan pengaturan ini, semuanya menjadi tidak beres.

Jadi, pengaturan saya sangat sederhana, saya punya:

Mesin # 1 memiliki akses jarak jauh diaktifkan, saya mengaksesnya melalui nama host dan itu memuntahkan aplikasi PHP yang berjalan di atasnya.

Mesin # 2 adalah aplikasi baru yang menjalankan Django, menggunakan backend yang sama sekali berbeda (bahkan auth), di-host pada mesin yang terpisah. Di intranet kami, kami mengaksesnya melalui nama host sederhana yang pada dasarnya menghubungkan ke ip internal 192.168.0.101.

Saya sudah mencoba bermain dengan ProxyPass untuk mengaturnya jadi misalnya, pass ke / baru akan mengirimkannya ke aplikasi baru:

ProxyPass / baru http://192.168.0.101/

Jenis pekerjaan ini, itu mendapatkan permintaan ke aplikasi lain, tetapi itu rusak karena aplikasi Django saya ingin mengarahkan ke / auth / login /, yang langsung tidak dikenali. Jika saya memodifikasi url sendiri menjadi foo.net/new/auth/login saya mendapatkan halaman login saya, tetapi karena Anda bisa menebak melakukan ini selama browsing tidak nyaman.

Jadi bagaimana saya bisa membuat ProxyPass bekerja seperti yang saya inginkan? Apakah saya perlu melakukan sesuatu dengan Apache sehingga selalu menulis / baru sebelum url di aplikasi lain, atau ini sesuatu yang harus saya modifikasi dalam aplikasi Django saya?

Setiap tips dan petunjuk juga akan sangat dihargai. Terima kasih atas waktunya


sumber

Jawaban:

11

Anda harus memodifikasi aplikasi Django Anda agar menjadi / new / auth / login bukan / auth / login. Umumnya pass proxy Anda akan terlihat seperti ini:

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

Yang dikombinasikan dengan aplikasi Django Anda mengharapkan berada di / baru / harus memperbaiki masalah Anda.

f4nt
sumber
2

Gunakan VirtualHost. Misalnya, atur nama A server Anda (mis. Sub.external.com ) ke IP server Anda (mis. 123.456.678 )

Karena keamanan, Anda perlu meneruskan HTTP_HOST secara eksplisit jika menggunakan ProxyPass di settings.py , per Tiket # 6880 :

USE_X_FORWARDED_HOST = True

Kemudian tambahkan yang berikut ke Apache /etc/httpd/httpd.conf :

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

Tambahkan VirtualHost Anda ke /etc/httpd/extra/httpd-vhosts.conf :

NameVirtualHosts *:80

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

Sekarang, Anda dapat mengakses situs Anda dari http://sub.external.com tanpa harus khawatir tentang "jalur"

Lionel
sumber
1

Terima kasih atas tanggapan Anda, saya menjawab pertanyaan saya sendiri karena perlu beberapa revisi setelah bermain dengan ini.

Pertama, App # 2 menjalankan http://192.168.0.101 .. itu tidak lari http://192.168.0.101/path sehingga ProxyPass tidak akan bekerja dengan baik

Jadi setelah berbicara dengan beberapa orang #apache dari irc, saya menemukan bahwa saya perlu melakukan sesuatu seperti ini:

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

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

Apa yang dilakukan adalah mengirim aturan penulisan ulang untuk setiap permintaan ke app2.myremotedns.com untuk dikirim ke ip internal melalui proxy.

Ini agak berhasil tetapi memiliki tiga masalah:

  • Dengan login yang diperlukan di semua halaman, Jika saya mengakses sesuatu dari jarak jauh di app2, itu akan diarahkan ke / auth / login .. namun, karena pengaturan penulisan ulang saat ini, saya mendapatkan loop pengalihan sebelum Firefox berhenti mencoba jalurnya. Saya kira ini mungkin ada hubungannya dengan metode pengalihan Django tapi saya tidak yakin.

  • Jika saya menonaktifkan login, halaman-halamannya berfungsi, tetapi tidak sepenuhnya. Saya sepertinya bisa mengambil halaman indeks App # 2 tetapi sebenarnya tidak ada yang lain

  • Media statis semuanya rusak, tapi ini mungkin perbaikan sederhana .. tidak khawatir tentang itu sekarang.

Jadi, saya punya masalah yang lebih kompleks daripada yang saya bayangkan ... :)


sumber
Menggunakan konfigurasi Django yang berbeda dari default menyebabkan banyak masalah. Baru-baru ini agak menyelesaikan masalah lain dengan Django dan ProxyPass di blog saya: fromzerotocodehero.blogspot.com/2011/01/...
1
Apakah Anda menemukan solusi untuk ini? Saya memiliki masalah yang persis sama, terutama dengan kehilangan gaya media dll.
memberound