ОБНОВЛЕНИЕ: я добавил исправленный вопрос после двух ответов ниже.
Всем привет,
Если вы читаете это, вы, вероятно, знакомы с 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, но больше ничего
Статические носители не работают, но это, вероятно, простое решение ... не беспокойтесь об этом прямо сейчас.
Итак, у меня есть более сложная проблема, чем я предполагал ... :)