Назад | Перейти на главную страницу

Помогите мне понять, как использовать ProxyPass

ОБНОВЛЕНИЕ: я добавил исправленный вопрос после двух ответов ниже.

Всем привет,

Если вы читаете это, вы, вероятно, знакомы с Apache mod_proxy и его функцией ProxyPass. Как и у многих других, у меня есть проблема с приложением, к которому я могу получить доступ из-за пределов нашей внутренней сети, но само это приложение обращается к другим внутренним приложениям на разных машинах, и когда вы получаете удаленный доступ с этой настройкой, все идет не так.

Итак, моя настройка очень проста, у меня есть:

На машине №1 включен удаленный доступ, я обращаюсь к ней через имя хоста, и она выдает запущенное на ней приложение PHP.

Machine # 2 - это новое приложение, работающее под управлением Django, оно использует совершенно другой бэкэнд (даже auth), оно размещено на отдельной машине. В нашей интрасети мы получаем к нему доступ через простое имя хоста, которое в основном связано с внутренним IP 192.168.0.101.

Я пробовал играть с ProxyPass, чтобы настроить его, например, переход в / new отправил бы его в новое приложение:

ProxyPass / новый http://192.168.0.101/

Так работает, он получает запрос к другому приложению, но ломается, потому что мое приложение Django хочет перенаправить на / auth / login /, которое оно мгновенно не распознает. Если я сам изменяю URL-адрес на foo.net/new/auth/login, я получаю свою страницу входа в систему, но, как вы можете догадаться, делать это во время просмотра неудобно.

Итак, как я могу заставить ProxyPass работать так, как я хочу? Нужно ли мне что-то делать с Apache, чтобы он всегда писал / new перед URL-адресом в другом приложении, или это то, что я должен изменить в моем приложении Django?

Любые советы и указатели также были бы весьма признательны. Спасибо за ваше время

Вам следует изменить свое приложение django так, чтобы оно находилось в / new / auth / login вместо / auth / login. Обычно проходы через прокси должны выглядеть так:

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

Это в сочетании с вашим приложением Django, ожидающим, что оно будет в / new /, должно исправить ваши проблемы.

Используйте 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 не беспокоясь о "путях"

Спасибо за ваши ответы, я отвечаю на свой вопрос, так как он требует некоторых исправлений после игры с этим.

Во-первых, приложение №2 запускается http://192.168.0.101 .. не сбегает http://192.168.0.101/path так что ProxyPass не будет работать

Итак, поговорив с парнями из irc #apache, я обнаружил, что мне нужно сделать что-то вроде этого:

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

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

Это отправляет правило перезаписи для любых запросов на app2.myremotedns.com, которые будут отправлены на внутренний IP-адрес через прокси.

Это отчасти работает, но имеет три проблемы:

  • Если на всех страницах требуется вход в систему, если я получаю доступ к чему-либо удаленно в app2, он перенаправляется на / auth / login ... однако из-за текущей настройки перезаписи я получаю цикл перенаправления, прежде чем Firefox просто перестанет пробовать путь. Я предполагаю, что это может иметь какое-то отношение к методам перенаправления Django, но я не совсем уверен.

  • Если я отключу вход в систему, страницы будут работать, но не полностью. Кажется, я могу получить индексную страницу приложения № 2, но больше ничего

  • Статические носители не работают, но это, вероятно, простое решение ... не беспокойтесь об этом прямо сейчас.

Итак, у меня есть более сложная проблема, чем я предполагал ... :)