Compresión gzip en Jboss para optimizar el uso de ancho de banda

por | abril 11, 2015

En los entornos en los que contemos con un frontal Apache podemos implementar la compresión de contenido en ese propio frontal web tal y como comenté. Sin embargo en los casos en los que el usuario acceda directamente al servidor de aplicaciones, también podemos implementar compresión gzip del contenido para ahorrar ancho de banda en la red.

Jboss AS 6 y versiones inferiores

El fichero a modificar sería el conocido server.xml que está en el componente Jboss Web. Dependiendo de la versión de Jboss este fichero cambia ligeramente de localización. Considerando que estuviéramos utilizando la instancia default (para otras como all la estructura de directorios es la misma):

Jboss AS 4.X

$JBOSS_HOME/server/default/deploy/jboss-web.deployer/server.xml

Jboss AS 5.X

$JBOSS_HOME/server/default/deploy/jbossweb.sar/server.xml

Jboss AS 6.X

  
$JBOSS_HOME/server/default/deploy/jbossweb.sar/server.xml

En el fichero server.xml tendremos que especificar una serie de opciones a nivel de conector. Si estamos conectándonos directamente a Jboss por norma general es el 8080. Habilitaremos la compresión con la opción compression y el tipo de contenido a comprimir con compressableMimeType

<!-- A HTTP/1.1 Connector on port 8080 -->
<Connector protocol="HTTP/1.1" port="${jboss.web.http.port}"
        address="${jboss.bind.address}" redirectPort="${jboss.web.https.port}"
compression="on"
compressableMimeType="text/html,text/plain,text/css,text/javascript,text/json,application/x-javascript,application/javascript,application/json"
/>

Las distintas opciones y parametrización de las mismas puedes encontrarlas en la documentación del componente Jboss Web para el conector HTTP.

Jboss AS 7 y superiores

A partir de la versión Jboss AS 7 la arquitectura del servidor de aplicaciones cambia y la compresión de contenido no se realiza a nivel de conector HTTP sino como configuración de sistema del servidor.

Jboss AS 7.0.x a 7.1.0

Por una parte, en las primeras versiones que comprenden Jboss AS 7.0.x a 7.1.0 no tienen soporte para compresión gzip (reportado ya como “bug” hace un tiempo) aunque se puede configurar un filtro de compresión para determinado tipo de contenido en el descriptor web.xml de la aplicación web.

JBoss AS 7.1.1/EAP 6.2 y superiores

En estas versiones se añade de nuevo soporte para compresión gzip a nivel de servidor de aplicaciones. Podremos especificarla de dos maneras:

  • Añadiendo las siguientes opciones en el fichero standalone.xml o domain.xml (según el modo que estemos utilizando) después de la etiqueta :
    <system-properties>
        <property name="org.apache.coyote.http11.Http11Protocol.COMPRESSION" value="on"/>
        <property name="org.apache.coyote.http11.Http11Protocol.COMPRESSION_MIME_TYPES" value="text/javascript,text/css,text/html,text/xml,text/json"/>  <!-- anadir otros tipos de contenido que queramos comprimir con gzip -->
    </system-properties>
    
  • Al iniciar Jboss, podemos pasarle a Java las siguientes opciones:
    -Dorg.apache.coyote.http11.Http11Protocol.COMPRESSION=on -Dorg.apache.coyote.http11.Http11Protocol.COMPRESSION_MIME_TYPES="text/javascript,text/css,text/html,text/xml,text/json”
    

Comprobaciones finales

Una vez realizado el cambio reiniciamos el servidor de aplicaciones. Podremos comprobar si se está comprimiendo contenido analizando las cabeceras de respuestas, por ejemplo con el complemento Firebug en Firefox (Red → Encabezados):

Análisis de encabezado de respuesta con Firebug

Análisis de encabezado de respuesta con Firebug

También podemos utilizar curl:

curl --head –compressed http://[IP]:[Puerto]

Deberíamos ver una línea content-encoding tal que:

...
Content-Type: text/html
Transfer-Encoding: chunked
Content-Encoding: gzip
Vary: Accept-Encoding 
...