Tag Archives: tomcat

Corriendo glassfish o tomcat detrás de un servidor apache (php)

Glassfish:

Descargar Tomcat 5.5.x

Copiar de Tomcat 5.5.x las siguientes librerias a ../glassfish/lib

tomcat-ajp.jar
commons-logging.jar
commons-modeler.jar

Activar AJP en el glassfish:

../glassfish/bin/asadmin create-jvm-options -Dcom.sun.enterprise.web.connector.enableJK=8009

Si se necesita un usuario y contrasena se debe crear un archivo de contrasenas para glassfish como se indica aqui:

http://docs.sun.com/app/docs/doc/820-4495/6nfv4mkjs?a=view

Y después el comando que se ejecutará será parecido a éste:

glassfish/bin/asadmin create-jvm-options –user admin –passwordfile passwords.file -Dcom.sun.enterprise.web.connector.enableJK=8009

Tomcat:

Solo asegurarse de que en server.xml ajp esté activado y en el puerto 8009

<!– Define an AJP 1.3 Connector on port 8009 –>
<Connector port=”8009″ protocol=”AJP/1.3″ redirectPort=”8443″ />

Configuración de AJP en apache.

Asegurarse de tener

LoadModule proxy_ajp_module modules/mod_proxy_ajp.so

descomentado en el archivo de configuración de apache (por ejemplo httpd.conf)

Y en algún VirtualHost del apache debemos configurar las rutas que se redireccionarán (también puede ser fuera de un VirtualHost).

<VirtualHost *:80>
ServerAdmin webmaster@example.com
DocumentRoot /home/web/website
ServerName example.com

<IfModule mod_proxy.c>

ProxyRequests On

<Proxy *>
Order deny,allow
Deny from all
Allow from all
</Proxy>

ProxyPass /artifactory/ ajp://172.17.0.24:8009/artifactory/
ProxyPassReverse /artifactory/ ajp://172.17.0.24:8009/artifactory/

</IfModule>


</VirtualHost>

Y listo, debería ser posible acceder a los servidores en java a través del servidor apache así:

www.example.com/artifactory/

Fuentes:

http://www.zunisoft.com/?p=29

http://docs.sun.com/app/docs/doc/820-4495/6nfv4mkjs?a=view

Desarrollando en openmrs con JRebel para realizar cambios en caliente

Cuando se desarrolla una aplicación JavaEE, puede resultar frustrante tener que detener la aplicación cada vez que se haya realizado un cambio en ella, para ser honesto recién estoy comenzando a desarrollar en JavaEE y viniendo del desarrollo en php desde el comienzo me pareció impensable cuando comencé a desarrollar un módulo de OpenMRS esto de tener que detener tomcat y reinstalar la aplicación o utilizar uno de los targets de ant para reiniciar openmrs (exactamente el target update), bueno y así me encontraba durante una semana aproximadamente, cuando derepente llegó un correo de la lista de openmrs para desarrolladores en la que me inscribí y era la solución a éste problema propuesta por Justin Miranda, parte de la conversación se puede ver aquí

Bueno, antes de comenzar con mi adaptación de ésta solución debo comenzar atribuyéndole todo el crédito a Justin Miranda, que además de proponer la solución me ayudó durante varios días mientras aún intentaba hacer que ésto funcione, que no imaginan cuantos problemas tuve, la entrada original se puede encontrar en el blog de Justin:

http://blog.justinmiranda.com/2010/02/hotswap-this.html

Bueno, comenzemos.

Los requisitos:

– OpenMRS, les  recomiendo bajárse la última versión en desarrollo a través de svn de aquí http://svn.openmrs.org/openmrs/trunk/

– Tomcat 5.5 ó 6.0.20 que son las versiones en las que he probado y funciona.

– JRebel http://www.zeroturnaround.com/jrebel/ (es un producto de pago, ya lo sé, pero pueden evaluarlo por 30 días)

– Un módulo de OpenMRS sobre el que realizar las pruebas, les recomiendo éste: http://svn.openmrs.org/openmrs-modules/devexamples/patientnotes/

Entonces comencemos, asumiré que saben como descargar fuentes usando svn, que están sobre windows, y que su estructura de directorios será esta:

D:openmrsopenmrs-trunk <— fuentes de openmrs descargadas por svn

D:openmrspatientnotes <—- modulo de pruebas descargado también por svn

D:JRebel <— ubicación de la instalación de JRebel, en un momento veremos como instalar JRebel

D:tomcat-6.0.20-openmrs <— ubicación de la instalación de JRebel, en un momento veremos como instalar JRebel

Instalación de JRebel:

Será tan sencillo como descargarlo, para Windows lo pueden encontrar aquí: http://www.zeroturnaround.com/downloads/jrebel-setup.exe,

ejecutarlo, indicarle la ruta en la que instalará: “D:JRebel”, y después de que se haya instalado y se inicie el asistente de configuración, no marcar la opción “I run the server from my IDE”, aunque dudo que afecte hacerlo ya JRebel cargará al nivel de ejecución de tomcat y desde allí escaneará nuestros proyectos en busca de cambios.

En un momento determinado se toparán con un plugin de JRebel para eclipse, realmente no hace falta, porque como dije será JRebel al nivel de ejecución de tomcat el que escaneará nuestros proyectos en busca de cambios.

Bueno, ya tenemos JRebel instalado, es hora de configurar tomcat, las indicaciones serán para tomcat 6.0.20, en tomcat 5.5 son idénticas pero puede variar la forma de establecer la variables JAVA_OPTS que es la que modificaremos. Bueno, todo lo que hay que hacer abrir D:tomcat-6.0.20-openmrsbincatalina.bat y modificar para que quede así, aproximadamente a la altura de la línea 78.


rem $Id: catalina.bat 750920 2009-03-06 14:43:19Z markt $
rem ---------------------------------------------------------------------------
set JAVA_OPTS=-Xverify:none -javaagent:D:JRebeljrebel.jar=org.openmrs.util.OpenmrsClassLoader,org.openmrs.module.ModuleClassLoader -Drebel.log=true -Xms512m -Xmx512m -XX:NewSize=256m -XX:MaxNewSize=256m -XX:PermSize=256m -XX:MaxPermSize=256m -Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5000 %JAVA_OPTS%

rem Guess CATALINA_HOME if not defined
set CURRENT_DIR=%cd%
if not "%CATALINA_HOME%" == "" goto gotHom

Como se puede ver solo hemos agregado la variable de entorno JAVA_OPTS en la que activamos a Jrebel como agente utilizando los classloaders propios de openmrs, activamos el debugging para la aplicación, lo que será extremadamente útil aunque aquí no se explicará como hacer debugging en openmrs, y además modificamos la memoria asignada a la jvm para evitar problemas de memoria como el permGen, en fin.

Eso es todo dentro de tomcat. Ya podemos iniciarlo usando:

D:tomcat-6.0.20-openmrsbinstartup.bat

para ver los mensajes propios de JRebel, que deben verse aproximadamente así:

Bueno, eso significa que ya no hay nada más que hacer con la configuración de tomcat, ahora hay que configurar la aplicación OpenMRS agregando un archivo rebel.xml dentro de WEB-INFclasses. Podríamos hacerlo después de desplegar la aplicación en tomcat dirigiéndonos a webappsopenmrsWEB-INFclasses y copiando el archivo allí pero yo preferí modificar el build.xml que se encuentra en la raíz de openmrs-trunk para que copie éste archivo en la carpeta classes cuando compile la aplicación, aquí hay otra solución que se está proponiendo como parche para openmrs http://dev.openmrs.org/attachment/ticket/2106/jrebel-build.patch

Bueno, primero crearemos el rebel.xml

rebel.xml


<?xml version="1.0" encoding="UTF-8"?>
<application xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns="http://www.zeroturnaround.com"
 xsi:schemaLocation="http://www.zeroturnaround.com http://www.zeroturnaround.com/alderaan/rebel-2_0.xsd">

<!-- supervision y actualizacion de clases y xml de configuracion de spring -->

<classpath>
 <dir name="D:openmrsopenmrs-trunkbuild"></dir>

<!--descomentar si estas teniendo problemas del tipo ClassNotFoundException en tomcat *
<jarset dir="D:openmrsopenmrs-trunklibjunit"></jarset>
 <jar name="D:openmrsopenmrs-trunklibspring-frameworkspring-test.jar"></jar>

-->

 <dir name="D:openmrspatientnotesbuild"></dir>

 </classpath>

 <web>

 <link target="WEB-INF/">
 <dir name="D:openmrsopenmrs-trunkwebWEB-INF">
 <exclude name="**/*.xml" />
 </dir>
 </link>

 <link target="WEB-INF/view/module/patientnotes/">
 <dir name="D:openmrspatientnoteswebmodule">
 <include name="**"/> <!-- nunca esta de mas -->
 <exclude name="**/*.xml" />
 </dir>
 </link>

 </web>
</application>

ahora copiamos este archivo dentro de D:openmrsopenmrs-trunkwebWEB-INF

y modificamos D:openmrsopenmrs-trunkbuild.xml a altura de la línea 335 (!) para que quede así:

</pre>
<classes file="${metadata.dir}/api/log4j/log4j.xml" />
 <classes file="${metadata.dir}/api/log4j/velocity.properties" />

 <!-- este es el unico cambio, podria ir en otra parte, notar que es un cambio improvisado, la ubicacion de rebel.xml se deberia configurar de manera externa-->
 <strong><classes file="web/WEB-INF/rebel.xml" /></strong>

 <classes dir="${build.dir}/liquibase-data">
 <include name="*" /> <!-- for the initial setup files: liquibase-schema-only.xml, liquibase-core-data.xml, liquibase-demo-data.xml-->
 </classes>

listo. Llegó la hora de probar, el flujo de instalación de openmrs y el módulo (patientnotes) podría parecer algo extraño, pero es la forma en la que he probado y que al parecer funciona con más frecuencia. Cabe destacar que existen varios factores por lo que derepente nos encontramos con que arrancamos tomcat, y funciona la actualización de jsp´s pero no de clases y pues, si somos observadores podremos detectar por qué suceden éstas cosas y como podemos manejarlas.

1. Iniciar eclipse (asumiré que ya instalaron openmrs-trunk, que lo han iniciado antes y que lo tienen importado en eclipse)

2. Importar proyecto patientnotes a eclipse

3. Activar Project > Build Automatically en eclipse

4. Ejecutar el target package-module del build.xml dentro de patientnotes

5. Copiar  patientnotes/dist/patientnotes-1.0.omod en C:Users ó Documents and setting en XPUsuarioApplication DataOpenMRSmodules

6. Hacer Project > Clean… para el proyecto patientnotes, si no se hace ésto algunas veces JRebel no actualizará clases.

7. Hacer un build dentro de eclipse para los proyecto que JRebel se encuentre manejando (IMPORTANTE, sobre todo si se ha hecho un clean con ant).

8. Iniciar tomcat

9. Reinstalar openmrs ejecutando los targets de ant: clean remove install en ese orden (asumiré que CATALINA_HOME apunta a D:tomcat-6.0.20-openmrs)

Listo, ahora ya podemos modificar controladores, incluso los marcados con anotaciones de spring, crear nuevas clases, modificar jsp’s, etc.

Pero hay un problema, al menos uno que yo he experimentado, las hojas de estilo y javascripts creados o modificados en nuestro proyecto no son sincronizados con el servidor, la solución que he encontrado ahora mismo para este problema es usar el target deploy-web dentro de build.xml de los módulos de openmrs, pero ya que no me gusta ejecutarlo manualmente creé un nuevo Builder de Eclipse, para que, aprovechando que tenemos activado build automatically en eclipse, cada vez que detecte cualquier cambio en nuestro proyecto (un módulo) ejecute deploy-web, no sé si existe una mejor manera de hacerlo, pero postearé esa solución después de experimentar un poco más.

NOTAS:

– He observado que algunas veces JRebel no reconoce los cambios en las clases cuando éste está supervisando muchos archivos, por ejemplo cuando lo configuré para que supervisara los cambios en una carpeta con dojo y muchos archivos dejó de funcionar, aunque no estoy seguro de que haya sido por esa razón.

Agregar soporte para SSL en tomcat 6

Antes que nada recomiendo establecer las variables de entorno JAVA_HOME, CATALINA_HOME y agregar %JAVA_HOME%/bin a la variable de entorno PATH.

Para agregar soporte SSL en tomcat 6 debemos generar un par de claves usando la herramienta %JAVA_HOME%binkeytool de esta manera, y ya que correremos tomcat como servicio especificaremos una carpeta personalizada para el almacen de claves en vez de almacenar este en la carpeta %HOME%.

Para esto crearemos una carpeta en el disco C y la llamaremos security, y después ejecutaremos el comando:

keytool -genkey -alias tomcat -keyalg RSA -keystore .keystore

Y cuando se nos pida contraseñas solo ingresaremos “changeit”

-genkey indica que se utiliza la herramienta keytool para generar un par de claves
-alias es el comando que se utiliza para especificar una ubicación única para el keystore
-keyalg especifica el algoritmo utilizado para crear el par de claves, en éste caso se utiliza el algoritmo RSA, el cual basa su dificultad de factorizar números enteros grandes.


C:>mkdir security

C:>cd security

C:security>keytool -genkey -alias tomcat -keyalg RSA -keystore .keystore
Escriba la contrase±a del almacÚn de claves:
Volver a escribir la contrase±a nueva:
┐Cußles son su nombre y su apellido?
 [Unknown]:  ANONYMOUS
┐Cußl es el nombre de su unidad de organizaci¾n?
 [Unknown]:  ANONYMOUS
┐Cußl es el nombre de su organizaci¾n?
 [Unknown]:  EXAMPLE
┐Cußl es el nombre de su ciudad o localidad?
 [Unknown]:  EXAMPLE
┐Cußl es el nombre de su estado o provincia?
 [Unknown]:  EXAMPLE
┐Cußl es el c¾digo de paÝs de dos letras de la unidad?
 [Unknown]:  US
┐Es correcto CN=ANONYMOUS, OU=ANONYMOUS, O=EXAMPLE, L=EXAMPLE, ST=EXAMPLE, C=US?

 [no]:  si

Escriba la contrase±a clave para <tomcat>
 (INTRO si es la misma contrase±a que la del almacÚn de claves):
Volver a escribir la contrase±a nueva:

C:security>dir
 El volumen de la unidad C no tiene etiqueta.
 El número de serie del volumen es: 441B-8C31

 Directorio de C:security

18/12/2009  08:17 a.m.    <DIR>          .
18/12/2009  08:17 a.m.    <DIR>          ..
18/12/2009  08:17 a.m.             1,364 .keystore
 1 archivos          1,364 bytes
 2 dirs  52,067,266,560 bytes libres

Como se puede ver se genera un archivo .keystore, éste es el almacén de claves al que debemos hacer referencia desde tomcat. Para ésto solo debemos modificar el archivo (CATALINA_HOME es la carpeta en la que se encuentra instalado Tomcat):

%CATALINA_HOME%confserver.xml

Y realizaremos las siguientes modificaciones


<!-- Define a SSL HTTP/1.1 Connector on port 8443
 This connector uses the JSSE configuration, when using APR, the
 connector should be using the OpenSSL style configuration
 described in the APR documentation -->


 <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
 maxThreads="150" scheme="https" secure="true"
 clientAuth="false" sslProtocol="TLS" keystoreFile="C:/security/.keystore" />


 <!-- Define an AJP 1.3 Connector on port 8009 -->
 <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

Después de reiniciar tomcat deberíamos ser capaces de acceder a:

https://localhost:8443/