Optimización y mejora del rendimiento en Jboss con el conector nativo APR

Para entornos de alta concurrencia en los que necesitemos un óptimo rendimiento de nuestro servidor de aplicaciones Jboss, una opción recomendable es utilizar el conector nativo APR.

Por su parte el propio Tomcat también puede hacer uso del conector nativo para mejorar el rendimiento y escalabilidad. En la propia documentación del gato encontramos un resumen con las ventajas que proporciona (también aplica al servidor de aplicaciones Jboss para el caso que atañe en este artículo).

En versiones antiguas de Jboss como la 4 y 5 era sencillo, bastaba con descargar el conector nativo en el directorio raíz de JBOSS_HOME, por ejemplo en /opt/jboss/jboss-4.2.2, y al iniciar la instancia debería cargar automáticamente las librerías APR.

Por ejemplo en Jboss 4.2.2 el proceso sería el siguiente:

cd $JBOSS_HOME
wget http://downloads.jboss.org/jbossnative//2.0.10.GA/jboss-native-2.0.10-linux2-x64-ssl.tar.gz
tar -zxvf jboss-native-2.0.10-linux2-x64-ssl.tar.gz

Ahora en el directorio bin de Jboss tendríamos a su vez un directorio native con las librerías necesarias:

[jota@middlewarenode1 bin]$ ls -l native/
total 3848
drwxrwxr-x. 2 jota jota    4096 Aug 10  2011 engines
lrwxrwxrwx. 1 jota jota      18 Aug 10  2011 libapr-1.so -> libapr-1.so.0.3.12
lrwxrwxrwx. 1 jota jota      18 Aug 10  2011 libapr-1.so.0 -> libapr-1.so.0.3.12
-rwxr-xr-x. 1 jota jota  673925 Aug 10  2011 libapr-1.so.0.3.12
lrwxrwxrwx. 1 jota jota      18 Aug 10  2011 libcrypto.so -> libcrypto.so.0.9.8
lrwxrwxrwx. 1 jota jota      18 Aug 10  2011 libcrypto.so.0 -> libcrypto.so.0.9.8
-r-xr-xr-x. 1 jota jota 1574254 Aug 10  2011 libcrypto.so.0.9.8
lrwxrwxrwx. 1 jota jota      15 Aug 10  2011 libssl.so -> libssl.so.0.9.8
lrwxrwxrwx. 1 jota jota      15 Aug 10  2011 libssl.so.0 -> libssl.so.0.9.8
-r-xr-xr-x. 1 jota jota  351288 Aug 10  2011 libssl.so.0.9.8
lrwxrwxrwx. 1 jota jota      23 Aug 10  2011 libtcnative-1.so -> libtcnative-1.so.0.1.22
lrwxrwxrwx. 1 jota jota      23 Aug 10  2011 libtcnative-1.so.0 -> libtcnative-1.so.0.1.22
-rwxr-xr-x. 1 jota jota  896875 Aug 10  2011 libtcnative-1.so.0.1.22
-rwxr-xr-x. 1 jota jota  432483 Aug 10  2011 openssl

Una vez iniciáramos Jboss debería cargar sin problemas las librerías requeridas y automáticamente utilizar el conector nativo. En server.log deberíamos ver:

INFO  [Http11AprProtocol] Starting Coyote HTTP/1.1 on http-127.0.0.1-8080

Especial atención a AprProtocol, que es lo que precisamente indica que Jboss está utilizando las librerías nativas.

Con Jboss AS 7 y superiores (también sus respectivas versiones EAP) el proceso es si cabe más sencillo ya que las librerías requeridas vienen embebidas de serie en el servidor de aplicaciones, pudiendo encontrarlas dentro del directorio de módulos siguiente:

$JBOSS_HOME/modules/system/layers/base/org/jboss/as/web/main/lib/

Dentro de ese directorio deberíamos tener a su vez un subdirectorio correspondiente a la arquitectura de nuestro sistema. Por ejemplo en una versión de Jboss EAP 6.3 en un CentOS 7 de 64 bits, tendré el correspondiente directorio linux-x86_64 con todo lo que necesito:

[jota@middlewarenode1 linux-x86_64]$ pwd
/opt/jboss/EAP-6.3.0/jboss-eap-6.3/modules/system/layers/base/org/jboss/as/web/main/lib/linux-x86_64
[jota@middlewarenode1 linux-x86_64]$ ls -l
total 152
lrwxrwxrwx. 1 jota jota     24 Apr 30 21:10 libapr-1.so -> /usr/lib64/libapr-1.so.0
lrwxrwxrwx. 1 jota jota     26 Apr 30 21:10 libcrypto.so -> /usr/lib64/libcrypto.so.10
lrwxrwxrwx. 1 jota jota     23 Apr 30 21:10 libssl.so -> /usr/lib64/libssl.so.10
-rw-r--r--. 1 jota jota 151768 Jul 14  2014 libtcnative-1.so

Lo único que tendríamos que hacer ahora es activar el uso del conector nativo. Suponiendo que estoy utilizando una configuración standalone sin clúster, tendré que modificar la configuración del fichero standalone.xml. Iríamos a la sección del subsistema web y cambiaríamos la opción native de false a true:

<subsystem xmlns="urn:jboss:domain:web:2.1" default-virtual-server="default-host" native="false">

Al arrancar de nuevo Jboss, deberíamos ver la referencia correspondiente Http11AprProtocol en server.log:

[org.apache.coyote.http11.Http11AprProtocol] (MSC service thread 1-1) JBWEB003001: Coyote HTTP/1.1 initializing on : http-/127.0.0.1:8080
[org.apache.coyote.http11.Http11AprProtocol] (MSC service thread 1-1) JBWEB003000: Coyote HTTP/1.1 starting on: http-/127.0.0.1:8080

También como reseña y para evitar quebraderos de cabeza, si configuramos un conector APR para que funcione con el protocolo HTTPS con certificados, no podremos utilizar un almacén JKS sino que los certificados tendrán que ser formato .pem, ya que el conector APR hace uso de OpenSSL y por lo tanto no se pueden utilizar almacenes de certificados tipo Java.