adicionando um prefixo URI global para aplicativos da web Tomcat

5

Estou configurando uma configuração de proxy reverso em que todas as solicitações cujo caminho começa com '/ apps /' devem ser intermediadas por proxy pelo Apache para o Tomcat. Esse IMO tem dois benefícios: possibilita reservar proxy apenas para a parte '/ apps /' do espaço de URI e usar apenas uma regra de proxy para todos os aplicativos Tomcat (ou seja, solicitações de qualquer aplicativo Tomcat devem começar com '/ apps /').

Por exemplo, as solicitações de link devem ser intermediadas por proxy para link . Observe a ausência do prefixo "/ apps /" no URI do Tomcat: "my_app" reside no local regular em $ {CATALINA_HOME} / webapps / my_app.

Eu consegui isso usando as seguintes regras de Proxy em um arquivo Apache vhost.conf:

ProxyPreserveHost    on
ProxyPass            /apps/    http://localhost:8082/
ProxyPassReverse    /apps/    http://mydomain/

(Nota: eu usei ProxyPreserveHost desde que meu aplicativo Tomcat precisa de acesso ao host original para gerar mais links). Tudo vai bem, exceto pelos links absolutos que são gerados por uma parte do meu aplicativo Tomcat. Dada a configuração acima, meu aplicativo Tomcat "verá" essa solicitação: link e, portanto, gerará links sem o prefixo '/ apps /' que deve acionar o proxy para esses links.

Demorei algum tempo, mas agora entendo que isso é uma característica essencial do proxy, e que não há nenhuma maneira 'padrão' de passar o prefixo '/ apps /' da solicitação original para o aplicativo com proxy. Assim, comecei a investigar outra possibilidade, a saber, definir um prefixo global para todos os aplicativos do Tomcat e fazer proxy dos aplicativos do Tomcat com as seguintes configurações:

ProxyPreserveHost    on
ProxyPass            /apps/    http://localhost:8082/apps/
ProxyPassReverse    /apps/    http://mydomain/apps/

Isso representaria solicitações de link para link . Como todos os aplicativos no servidor Tomcat serão acessados por trás de um proxy, não tenho nenhum problema que esse prefixo '/ apps /' seja necessário para todos os aplicativos do Tomcat.

Até agora, tudo bem. Ainda assim, estou lutando com o lado do Tomcat nessa abordagem: encontrar uma maneira de adicionar um prefixo de caminho global para solicitações aos aplicativos do Tomcat. O mais perto que cheguei foi isto:     1. não toque no local físico dos aplicativos do Tomcat: deixe-os em $ {CATALINA.HOME} / webapps     2. altere $ {CATALINA.HOME} /conf/server.xml da seguinte forma:

<Host name="localhost"  appBase="webapps" unpackWARs="true" autoDeploy="false" deployOnStartup="false">
  <Context path="/apps/my_app" docBase="/my_app/" reloadable="true"/>
</Host>

Embora isso torne o aplicativo my_app Tomcat acessível no link , ele também sugere que todos os aplicativos do Tomcat devam ser definidos manualmente em um elemento separado. Isso torna menos flexível adicionar novos aplicativos da web do Tomcat (e, na verdade, significaria mais trabalho de configuração do que declarar regras de proxy separadas para cada aplicativo na configuração do Apache, sem o prefixo '/ apps /'). Eu tentei isso:

<Context path="/apps" docBase="/" reloadable="true"/>

(e @docBase variantes como "" ou "."), mas isso não funciona: nenhuma indicação de qualquer aplicação web sendo implantada na saída do console Tomcat, e todas as solicitações retornam um erro 404.

Daí a minha pergunta: existe uma maneira simples (r) de 'declarar' um prefixo URI global para aplicativos web do Tomcat?

Qualquer conselho muito apreciado!

Ron

    
por rvdb 17.04.2012 / 14:36

1 resposta

3

Para o benefício dos outros, responderei a minha própria pergunta. Na verdade, o Tomcat (desde a versão 6) fornece uma solução bastante fácil para adicionar prefixos de URI a aplicativos da Web, prefixando a pasta webapp ou o nome de arquivo WAR com esse prefixo (ou os prefixos) separados por um hash. Então, por exemplo:

${catalina.base}/webapps/apps#my_app
${catalina.base}/webapps/apps#my_app2.war

... tornará os dois acessíveis por meio do link e link , respectivamente, sem qualquer configuração adicional em $ {catalina.base} /conf/server.xml.

Isso é explicado de forma enigmática na referência Contêiner de contexto do Tomcat , mas veja esta espécie de mensagem na lista de usuários do Tomcat me ajudou muito.

Infelizmente , há um problema: aparentemente, o Cocoon (até 2.1.11, não testou com 2.2 aplicativos) engasga com os webapps cujos caminhos contêm um hash (consulte link ).

No entanto, há uma solução alternativa para esses aplicativos baseados no Cocoon, conforme mostrado nas seguintes etapas de configuração:

  1. mova a pasta ou o arquivo WAR que contém a aplicação Web fora do caminho appBase do host, por exemplo: F: \ cocoonApps \ my_CocoonApp
  2. adicione um arquivo $ {catalina.base} \ conf \ Catalina [nome do host] [prefixo] # [nome do aplicativo] .xml, por exemplo: $ {catalina.base} \ conf \ Catalina \ localhost \ aplicativos # my_CocoonApp. xml, com o seguinte conteúdo:

    <Context docBase="F:/cocoonApps/my_CocoonApp"/>

Utilizando esta solução alternativa, mesmo as webapps Cocoon são felizes quando acessadas em, e. link . Isso pode permitir uma sobrecarga de gerenciamento bastante flexível das aplicações web do Tomcat:

  • Webapps não baseados no Cocoon: basta adicioná-los no appBase do Host, prefixando o nome da pasta ou do arquivo WAR com o (s) prefixo (s) desejado (s), separados por um hash (#). A adição de novas aplicações Web não Cocoon não requer mais etapas do que armazená-las com o prefixo URI desejado.
  • Webapps baseadas no Cocoon: armazene-os fora do appBase do Host, com apenas o nome da webapp não-redefinida. Além disso, inclua um arquivo de contexto para cada webapp baseado no Cocoon, especificando o aplicativo da Web conforme explicado acima. Esta etapa adicional é necessária apenas para webapps baseados em Cocoon.

Com as configurações de proxy do Apache explicadas na minha pergunta original, isso possibilita a inclusão flexível de aplicativos do Tomcat e fazer com que eles realizem proxy reverso atrás do Apache usando o prefixo / apps / URI.

    
por 20.04.2012 / 01:31