No Apache, como definir vários ProxyPass para diferentes servidores com a mesma raiz de contexto?

4

** atualizado com a solução alternativa na parte inferior desta resposta **

Eu tenho um requisito para o meu webapp para proxy para 2 servidores de relatórios externos. Então, terei um item de menu para cada servidor de relatórios externo.

Mas o URL do navegador também parece ser o meu servidor, por isso não posso redirecionar apenas. esses servidores possuem a mesma raiz de contexto / ibm

Para os dois servidores, o URL do navegador deve ser semelhante ao link .. enquanto os proxies do apache são os corretos.

Como uma configuração como essa deve ser feita? Como o Apache pode saber para qual deles tem que fazer proxy?

Eu não faria o meu se tivesse que fazer algumas alterações para que as URLs acabassem assim:

http://example.com/rep1/ibm and http://example.com/rep2/ibm

Eu consegui ter o efeito desejado usando meu servlet weblogic-proxy e manipulando URLs, etc, mas o Apache seria uma solução mais eficiente se isso pudesse ser feito de alguma forma.

Agradeço qualquer entrada.

Além disso, a solicitação inicial para os servidores de relatórios externos é iniciada a partir do meu aplicativo da Web, não do navegador.

** update **

Agora temos que fazer proxy para cerca de 10 outros servidores da Web, onde alguns tiveram esse problema. Mas sempre que o servidor web de destino era implantado na raiz, também precisávamos reescrever o corpo, etc., o que, para algumas dessas integrações de proxy, era uma questão de tentativa e erro.

Solução alternativa: mudamos para subdomínios para esses servidores proxy, onde na verdade os URLs de subdomínio ainda apontam para nosso próprio apache, mas usando esses nomes de subdomínio podemos configurar mais facilmente um host virtual & proxy em nossa configuração do Apache, e não precisamos reescrever nenhum dos corpos de resposta, etc.

    
por gotjee 20.03.2014 / 17:19

2 respostas

5

Isso é feito facilmente com mod_proxy :

ProxyPass /rep1/ibm http://reportingserver1.example.com/ibm
ProxyPassReverse /rep1/ibm http://reportingserver1.example.com/ibm


ProxyPass /rep2/ibm http://reportingserver2.example.com/ibm
ProxyPassReverse /rep2/ibm http://reportingserver2.example.com/ibm

Há mais informações em o site de documentação do apache para mod_proxy .

Se você precisar alterar os links no conteúdo retornado dos sites externos, poderá fazer isso usando mod_ext_filter . Aqui está uma configuração de exemplo para reescrever um link:

# mod_ext_filter directive to define a filter which
# replaces text in the response
#
# Note: I'm Using a '#' instead of an '/' in the sed command since I want to
# include '/' in the string
#
ExtFilterDefine rep1 mode=output intype=text/html \
    cmd="/bin/sed s#reportingserver1.example.com/ibm#example.com/rep1/ibm#g"

<Location /rep1>
    # core directive to cause the fixtext filter to
    # be run on output
    SetOutputFilter rep1
    ProxyPass /rep1/ibm http://reportingserver1.example.com/ibm
    ProxyPassReverse /rep1/ibm http://reportingserver1.example.com/ibm
</Location>
    
por 21.03.2014 / 09:18
0

Eu posso fazer isso agora usando a combinação de mod_proxy para proxy reverso e mod_proxy_html com ProxyHTMLURLMap para reescrever o conteúdo retornado. A página inicial carrega OK & todas as URLs, etc., são reescritas, elas mostram o prefixo rep1 quando eu as alterno.

Mas quando clico em um dos menus do aplicativo proxy, acho que uma solicitação Ajax está sendo feita & a página retornada será inserida. Mas estou enfrentando um problema em que o conteúdo retornado está sendo cercado por tags "<html><body>" . e por causa disso a página não está atualizando, eu acho.

Estou tentando descobrir como posso impedir que proxy_html faça isso.

Minha configuração atual:

ProxyPass /MD/ http://xx.xxx.xxx.xx:8080/

<Location /MD/>
    ProxyHTMLURLMap /ibm/ /MD/ibm/ 
    ProxyHTMLURLMap /mum/ /MD/mum/ 
    ProxyPassReverse /
    RequestHeader unset Accept-Encoding
    ProxyHTMLEnable On
    #ProxyHTMLInterp On
    ProxyHTMLEvents On
    ProxyHTMLExtended On

        #SetOutputFilter DEFLATE
        #SetOutputFilter INFLATE;proxy-html;DEFLATE
        #SetOutputFilter INFLATE;proxy-html;SUBSTITUTE;DEFLATE
        #SetOutputFilter proxy-html
        #ProxyHTMLBufSize 6000000
        #ProxyHTMLMeta On

    ProxyHTMLLinks  a               href
    ProxyHTMLLinks  area            href
    ProxyHTMLLinks  link            href
    ProxyHTMLLinks  img             src longdesc usemap
    ProxyHTMLLinks  object          classid codebase data usemap
    ProxyHTMLLinks  q               cite
    ProxyHTMLLinks  blockquote      cite
    ProxyHTMLLinks  ins             cite
    ProxyHTMLLinks  del             cite
    ProxyHTMLLinks  form            action
    ProxyHTMLLinks  input           src usemap
    ProxyHTMLLinks  head            profile
    ProxyHTMLLinks  base            href
    ProxyHTMLLinks  script          src for
    ProxyHTMLLinks  frame           src longdesc
    ProxyHTMLLinks  iframe          src longdesc
    ProxyHTMLLinks  body            background
    ProxyHTMLLinks  applet          codebase

    ProxyHTMLCharsetOut *
    ProxyHTMLEvents onclick ondblclick onmousedown onmouseup onmouseover onmousemove onmouseout onkeypress onkeydown onkeyup onfocus onblur onload onunload onsubmit onreset onselect onchange  
</Location>
    
por 26.03.2014 / 12:59