Jetty mit gzip-Komprimierung

Der Karaf verwendet für die Auslieferung der Webseitenresourcen den Webserver Jetty. Dieser verwendet per Default keine Komprimierung, diese kann jedoch aktiviert werden.

Bei den Karaf-Installationsdateien die nach dem 28.09.2021 herunter geladen wurden (BPC 3.4.x und BPC 4.0.0) ist die unten aufgelistete jetty.xml bereits angepasst.

Aktivierung

Damit der Karaf/Jetty die Webseitenresourcen komprimiert ausliefert, muss in der [karaf]/etc/jetty.xml ein GzipHandler installiert werden. Dazu in der jetty.xml folgendes Fragment am Ende einfügen.

Der Karaf muss nach Anpassung der jetty.xml durchgestartet werden.

[karaf]/etc/jetty.xml
<?xml version="1.0"?>
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
<Configure id="Server" class="org.eclipse.jetty.server.Server">

    ...

    <!-- ====================== -->
    <!-- Insert the GzipHandler -->
    <!-- ====================== -->
    <Call name="insertHandler">
        <Arg>
            <New id="GzipHandler" class="org.eclipse.jetty.server.handler.gzip.GzipHandler">
                <Set name="minGzipSize"><Property name="jetty.gzip.minGzipSize" default="1024"/></Set>
                <Set name="checkGzExists"><Property name="jetty.gzip.checkGzExists" default="false"/></Set>
                <Set name="compressionLevel"><Property name="jetty.gzip.compressionLevel" default="-1"/></Set>
                <Set name="inflateBufferSize"><Property name="jetty.gzip.inflateBufferSize" default="0"/></Set>
                <Set name="syncFlush"><Property name="jetty.gzip.syncFlush" default="false" /></Set>
                <Set name="excludedAgentPatterns">
                    <Array type="String">
                        <!-- IE 6 has known bugs related to GZIP compression -->
                        <Item><Property name="jetty.gzip.excludedUserAgent" default=".*MSIE.6\.0.*"/></Item>
                    </Array>
                </Set>
                <Set name="includedMethodList"><Property name="jetty.gzip.includedMethodList" default="GET" /></Set>
                <Set name="excludedMethodList"><Property name="jetty.gzip.excludedMethodList" default="" /></Set>
                <!--
                    <Set name="includedMethods">
                        <Array type="String">
                            <Item>GET</Item>
                        </Array>
                    </Set>
                    <Set name="includedPaths">
                        <Array type="String">
                            <Item>/*</Item>
                        </Array>
                    </Set>
                    <Set name="excludedPaths">
                        <Array type="String">
                            <Item>*.gz</Item>
                        </Array>
                    </Set>
                    <Call name="addIncludedMimeTypes">
                        <Arg>
                            <Array type="String">
                                <Item>some/type</Item>
                            </Array>
                        </Arg>
                    </Call>
                    <Call name="addExcludedMimeTypes">
                        <Arg>
                            <Array type="String">
                                <Item>some/type</Item>
                            </Array>
                        </Arg>
                    </Call>
                -->
            </New>
        </Arg>
    </Call>
</Configure>

Syntax

Die in der jetty.xml verwendete Syntax ist ein wenig Gewöhnungsbedürftig. Zwei Sachen sind hierbei essentiell:

  1. Die einzelnen XML-Elemente werden zur Laufzeit direkt in Java Aufrufe umgesetzt. Deshalb kann es nicht schaden, wenn man sich mit der Jetty-XML-Syntax vertraut macht.

  2. Die einzelnen XML-Elemente beziehen sich alle auf die Java Methoden der GzipHandler Klasse. Die oben gesetzten Werte sind nicht alle die gesetzt werden können. Ein Blick in die GzipHandler JavaDoc kann nicht schaden.

Wichtige Konfigurationen des GzipHandler

  • minGzipSize Die Mindestgröße in Bytes, die eine Antwort haben muss, bevor die Komprimierung ausgelöst wird. Ist oben auf 1024 Bytes gesetzt. Das bedeutet, dass Antworten die kleiner als 1024 Bytes sind, nicht komprimiert werden.

  • compressionLevel Der Gzip Kompressionslevel: 0-9, mit -1 als Default was derzeit dem Kompressionslevel 6 entspricht. Dies ist ein guter Kompromiss zwischen Geschwindigkeit und Größe der Antwort.

Voraussetzung dass die jetty.xml zum Einsatz kommt

Sicherstellen, dass in der [karaf]/etc/org.ops4j.pax.web.cfg folende Zeile enthalten ist.

org.ops4j.pax.web.config.file=${karaf.etc}/jetty.xml

Keywords: