Ajude-me a entender como usar o ProxyPass

11

ATUALIZAÇÃO: Adicionei uma pergunta revisada depois de brincar com as duas respostas abaixo.

Olá,

Se você está lendo isso, provavelmente conhece o mod_proxy do Apache e sua função ProxyPass. Como muitos outros, tenho o problema de ter um aplicativo que posso acessar de fora da nossa rede interna, mas esse aplicativo acessa outros aplicativos internos em máquinas diferentes e, quando você acessa remotamente com essa configuração, as coisas ficam complicadas.

Então, minha configuração é muito simples, tenho:

A máquina nº 1 tem acesso remoto ativado, eu a acesso através de um nome de host e cospe o aplicativo PHP em execução nela.

A Machine # 2 é um novo aplicativo executando o Django, usa um back-end totalmente diferente (mesmo autenticação), está hospedado em uma máquina separada. Em nossa intranet, acessamos através de um nome de host nomeado simples, que basicamente se vincula ao ip 192.168.0.101 interno.

Eu tentei jogar com o ProxyPass para configurá-lo. Por exemplo, um passe para / new o enviaria para o novo aplicativo:

ProxyPass / novo http://192.168.0.101/

Isso funciona, recebe a solicitação para o outro aplicativo, mas é interrompido porque meu aplicativo Django deseja redirecionar para / auth / login /, o qual não reconhece instantaneamente. Se eu modificar o URL para foo.net/new/auth/login, recebo minha página de login, mas como você pode imaginar, fazer isso durante a navegação não é conveniente.

Então, como posso fazer o ProxyPass funcionar como eu quero? Preciso fazer algo com o Apache, para que ele sempre escreva / novo antes dos URLs no outro aplicativo, ou seja algo que devo modificar no meu aplicativo Django?

Quaisquer dicas e sugestões também serão muito apreciadas. Obrigado pelo seu tempo


fonte

Respostas:

11

Você deve modificar seu aplicativo django para esperar estar em / new / auth / login em vez de / auth / login. Geralmente seus passes de proxy devem ter a seguinte aparência:

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

Isso combinado com o seu aplicativo Django que espera estar em / new / deve corrigir seus problemas.

f4nt
fonte
2

Use um VirtualHost. Por exemplo, defina o nome A do seu servidor (por exemplo, sub.external.com ) como o IP do seu servidor (por exemplo, 123.456.678 )

Devido à segurança, você precisa encaminhar explicitamente HTTP_HOST se estiver usando o ProxyPass em settings.py , de acordo com o ticket nº 6880 :

USE_X_FORWARDED_HOST = True

Em seguida, adicione o seguinte ao Apache /etc/httpd/httpd.conf :

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

Adicione seu VirtualHost ao /etc/httpd/extra/httpd-vhosts.conf :

NameVirtualHosts *:80

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

Agora, você poderá acessar seu site em http://sub.external.com sem precisar se preocupar com "caminhos"

Lionel
fonte
1

Obrigado por suas respostas, estou respondendo minha própria pergunta, pois ela precisa de algumas revisões depois de brincar com isso.

Primeiro, o aplicativo nº 2 sai http://192.168.0.101 .. não sai http://192.168.0.101/path, de modo que o ProxyPass não funcione

Então, depois de conversar com alguns caras do #apache do irc, descobri que precisava fazer algo assim:

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

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

O que isso faz é enviar uma regra de reescrita para que quaisquer pedidos para app2.myremotedns.com sejam enviados para o IP interno via proxy.

Isso funciona um pouco, mas tem três problemas:

  • Com o login necessário em todas as páginas, se eu acessar algo remotamente no app2, ele será redirecionado para / auth / login. Eu acho que isso pode ter algo a ver com os métodos de redirecionamento do Django, mas não tenho certeza.

  • Se eu desativar o login, as páginas funcionarão, mas não totalmente. Parece que sou capaz de buscar a página de índice do aplicativo nº 2, mas nada realmente

  • A mídia estática está toda quebrada, mas isso provavelmente é uma correção simples. Não estou preocupado com isso agora.

Então, eu tenho uma questão mais complexa do que imaginei ... :)


fonte
Usar qualquer configuração de django diferente do padrão causa muitos problemas. Recentemente, resolvi outro problema com o django e o ProxyPass no meu blog: fromzerotocodehero.blogspot.com/2011/01/…
1
Você encontrou alguma solução para isso? I têm exatamente os mesmos problemas, especialmente com a perda de estilos de mídia etc.
membersound