Transparentemente disponibilizar vários aplicativos da Web em um único endereço

3

Eu tenho vários aplicativos da Web em execução em seu próprio servidor http, por exemplo, um aplicativo ruby / rails na porta 8080 e um aplicativo python / cherrypy no 8081.

É possível disponibilizá-los de forma transparente através de um único endereço de porta? Talvez adicionando um terceiro servidor http que transforma todas as solicitações (por exemplo, link e link ). Minha plataforma de escolha é o Linux

    
por ckuijjer 08.02.2011 / 20:22

3 respostas

4

O que você está procurando é chamado de "proxy reverso". Existem muitos servidores da Web com esse recurso, incluindo o Apache httpd, lighttpd e nginx, além de servidores Web mais simples projetados exclusivamente para proxy reverso.

Como o Apache é mais provável de estar disponível para você e / ou mais fácil de implantar, esse trecho de código a ser incluído na seção relevante dos arquivos de configuração do Apache deve fornecer a configuração mínima para o que você precisa, supondo que você ter mod_proxy_http instalado e ativado:

# ... [snip] ...
<VirtualHost *:80>
# ... [snip] ...

# This line prevents mod_proxy from acting as a forward proxy
# Yes it looks silly, but it's correct for reverse proxy configurations
ProxyRequests Off

# Rails app on port 8080
ProxyPass /app1 http://localhost:8080
ProxyPassReverse /app1 http://localhost:8080

# CherryPy app on port 8081
ProxyPass /app2 http://localhost:8081
ProxyPassReverse /app2 http://localhost:8081

# ... [snip] ...
</VirtualHost>

Atualizar : aqui estão alguns links para documentação (às vezes densa) de vários servidores:

Palavra para o sábio

Considere também que, com o proxy reverso, os aplicativos de back-end não estarão mais recebendo solicitações do IP do cliente que está iniciando a solicitação. Em vez disso, todas as solicitações parecerão vir do host local (127.0.0.1). Portanto, qualquer lógica relacionada ao IP do cliente deixará de funcionar. Se seu aplicativo precisar desses metadados de solicitação, você precisará seguir um procedimento dependente de seu servidor HTTP de proxy reverso.

No Apache, mod_proxy adiciona automaticamente um cabeçalho X-Forwarded-For à solicitação cujo valor é o endereço IP da solicitação que entrou no Apache (ou uma lista de IPs que encaminharam a solicitação, se você tiver uma cadeia de vários proxies reversos). Para o Nginx, acredito que você tenha que instruir o servidor a enviar tal cabeçalho (os detalhes estão no link acima).

Se o seu aplicativo de back-end se importar com o cabeçalho Host: da solicitação original do cliente, você precisará modificar esse código para procurar (no Apache) o cabeçalho X-Forwarded-Host também.

    
por 08.02.2011 / 20:30
1

É chamado de proxy reverso. Você pode fazer isso com Apache , bem como outros servidores da web. Também existem servidores proxy dedicados que você também pode usar.

    
por 08.02.2011 / 20:29
0

Sim, você pode fazer algo assim no APACHE usando mod_jk

Detalhes aqui: link

Basicamente, o que acontece é que o APACHE é usado como um 'roteador / proxy' para o seu tráfego de ruby. Você não precisa de nenhum novo servidor / ips dessa maneira. Tenha em mente que você é DEINDA dependente do Apache para direcionar o tráfego para seu aplicativo.

    
por 08.02.2011 / 20:31