Hace ya un montón de años me enseñaron que lo que no se puede medir, no se puede controlar. Así que si queremos controlar lo que hacen nuestras aplicaciones y nuestros servidores, tenemos que monitorizarlos. Para ello utilizaremos JMX.

Para activar la monitorización por JMX en un servidor de aplicaciones Tomcat, protegida por contraseña, añadiremos las siguientes opciones al arranque:

CATALINA_OPTS="$CATALINA_OPTS -Djava.rmi.server.hostname=192.168.0.2 -Dcom.sun.management.jmxremote.port=9004 -Dcom.sun.management.jmxremote.password.file=/opt/tomcat/bin/jmxremote.password -Dcom.sun.management.jmxremote.access.file=/opt/tomcat/bin/jmxremote.access -Dcom.sun.management.jmxremote.ssl=false"

Es altamente recomendable poner la dirección ip y no el nombre de host, por los problemas que esto puede dar.

El fichero jmxremote.password contendrá los usuarios y los passwords. Si el jdk estuviera en /usr/java/jdk/, tenemos un fichero de ejemplo en /usr/java/jdk/jre/lib/management/jmxremote.password.template. En general nos basta con los users y pass separados por un espacio:


user1 pass1
user2 pass2

El fichero jmxremote.access contendrá los usuarios y sus permisos. Siguiendo con la suposición de que el jdk esta en /usr/java/jdk/, tenemos un fichero de ejemplo en /usr/java/jdk/jre/lib/management/jmxremote.access. Aquí también nos basta con los users y permisos separados por un espacio


user1 readonly
user2 readwrite

Estos dos ficheros unicamente podrán tener permisos de lectura y escritura para su dueño. En caso contrario, el Tomcat no arrancara. Así que tendremos que asignar estos permisos adecuadamente.

Dependiendo de como este organizada nuestra infraestructura de red, y de la política de seguridad de nuestra organización, es posible (aunque no recomendable), permitir acceso anónimo:

CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9004 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false"

Una vez reiniciado el servidor, podremos monitorizarlo con aplicaciones como jconsole o con VisualVM. Todo esto es aplicable tanto a Tomcat como a otros servidores de aplicaciones.

Como comentaba antes, dependiendo de nuestra red, es habitual que haya un firewall para controlar los accesos a la red de servidores. Si el firewall permite acceso total desde la red de administradores a la de servidores, no tendremos problemas. En el caso de que dicho acceso no sea total, el funcionamiento de JMX nos complicara un poco la vida. JMX utiliza en realidad dos puertos: el que nosotros definimos (en el ejemplo el 9004) que es el que se utiliza para establecer la conexión, y un segundo puerto aleatorio que es el que se empleara para los datos. Lógicamente, al tratarse de un puerto aleatorio, no podremos abrirlo previamente en el firewall.

Para el caso concreto de Tomcat, desde la versión 6.0.24, disponemos del Listener JmxRemoteLifecycleListener que nos permitirá fijar ambos puertos.