Integrando IIS ao Jetty, Apache URL Redirect e Filtro ISAPI

Bom galera, muito tempo sem postar, né? Peço desculpas pro pessoal que acompanha o blog mas alguns projetos pessoais acabaram por tomar todo o tempo livre. Resolvi reservar um tempo para me dedicar a um post que acredito ser interessante pro pessoal da comunidade Java, uma solução simples para algo que acredito ser comum.

Na empresa em que trabalho temos aplicações disponibilizadas tanto pelo IIS da Microsoft quanto pelo Jetty, tínhamos então os sites estáticos e algumas aplicações em .net hospedados no IIS e os WebServices desenvolvidos em Java e sites em Grails hospedados pelo Jetty.

Isso sempre foi um problema pois além de ser algo feio e nada transparente para nossos clientes pois precisavam acessar dois caminhos distintos (um na porta 80 do IIS e outro na porta 8080 do Jetty), era impossível fazer a comunicação entre uma aplicação em Flex(IIS) e com um WebService(Jetty) via HTTPService graças a política de acesso a diferentes domínios do Flex. Estava realmente na hora de conseguir resolver este problema e integrar o Jetty ao IIS, mas como?

Pesquisando um pouco na internet encontrei alguns artigos mostrando como integrar o Apache Tomcat ao IIS, porém nada especifico sobre o Jetty, eu sabia que era possível pois o Jetty tem suporte implementado para o protocolo AJP13 mas uma documentação simples e atualizada era praticamente impossível de ser encontrada, imagine em português. Foi um pouco na tentativa e erro que consegui o resultado esperado, mas no final se tornou algo transparente, performático e simples de entender.

Bom, primeiramente gostaria de explicar porque escolhemos o Jetty e não o Apache Tomcat para fazer o deploy de nossas aplicações? O Tomcat já foi nosso antigo servidor de aplicações e tivemos problemas de performance e vazamento de memória e o simples ato de migrar para o Jetty resolveu um problema que estava nos dando muita dor de cabeça. O pessoal da Caelum já chegou a relatar um problema parecido e documentado aqui com o deploy do GUJ e recomendo que leiam. Vamos então mostrar como configurar o IIS com o IAPI Redirect da Apache para redirecionar as chamadas para o nosso Jetty.

Para começar faça download da ultima versão estável do Jetty 6.1 aqui: http://dist.codehaus.org/jetty/jetty-6.1.21/, faça download também da DLL para o IIS, ISAPI Url Redirect da Apache aqui: http://www.apache.org/dist/tomcat/tomcat-connectors/jk/binaries/win32/jk-1.2.28/isapi_redirect-1.2.28.dll.

Precisamos configurar o Jetty para disponibilizar uma porta para o protocolo AJP13 que será utilizado pelo nosso filtro ISAPI, para isso, extraia os arquivos do Jetty e edite o arquivo etc/jetty.xml adicionando as seguintes linhas:

  <Call name="addConnector">
    <Arg>
       <New class="org.mortbay.jetty.ajp.Ajp13SocketConnector">
         <Set name="port">8009</Set>
       </New>
    </Arg>
  </Call>

Com isso você tem o Jetty configurado para prover conexão entre os dois servidores. Configurações mais avançadas do Jetty podem ser encontradas aqui porém tomem cuidado pois este tutorial é antigo e a classe de conexão com Ajp13 já mudou de nome. Com o Jetty configurado vamos as configurações do IIS.

Para configurar o IIS siga os passos:

  1. Crie uma pasta, por exemplo C:\Jakarta e copie a dll isapi_redirect para dentro dela.
  2. Coloque na pasta também os arquivos workers.properties e uriworkermap.properties, siga as instruções abaixo para entender como criá-los.
  3. No console de configuração do IIS adicione uma pasta virtual com o nome Jakarta e aponte para a pasta criada acima, ao criar a pasta permita que a mesma execute processos.
  4. Adicione um filtro ISAPI na página default do IIS apontando pra o caminho da DLL.
  5. Crie um registro no Windows com o caminho HKEY_LOCAL_MACHINE\SOFTWARE\Apache Software Foundation\Jakarta Isapi Redirector\1.0
  6. Crie os seguintes valores com suas respectivas chaves dentro deste caminho como descrito na imagem abaixo.
  7. Reinicie o IIS.

Para mais informações sobre como configurar o seu arquivo worker.properties veja este link.

workers.properties:
#Aqui podemos definir uma lista de workers, podemos então redirecionar as chamadas para mais de um servidor
worker.list=jetty
#Porta configurada dentro do jetty.xml acima
worker.jetty.port=8009
#Dominio em que se encontra o servidor Jetty
worker.jetty.host=localhost
#Tipo de protocolo disponibilizado no Jetty
worker.jetty.type=ajp13

uriworkermap.properites
#Aqui estamos dizendo ao filtro ISAPI para redirecionar o programa e todas suas chamadas para o worker Jetty.
/programa/*=jetty

Configure o seu registro do windows da seguinte forma:
Registro Windows

Tente agora acessar um aplicativo disponibilizado pelo Jetty na porta 8080 diretamente na porta 80 do IIS, se você configurou tudo corretamente você vai conseguir acessar de forma transparente o Jetty pelo IIS.

Bom galera, é isso. O post será rápido mesmo pois o tempo livre ainda está curto, essa configuração é a mais básica possível, recomendo ler a documentação do Apache a fundo para entender como configurar algo mais parrudo e realmente para produção, espero que o post seja útil e esteja claro o suficiente para ajudar alguém que venha a ter o mesmo problema que tive e que essa seja a solução esperada. Qualquer dúvida, sugestão ou crítica deixe um comentário ou envie um email. Um abraço.


Seguir

Obtenha todo post novo entregue na sua caixa de entrada.